代码之家  ›  专栏  ›  技术社区  ›  Gupta

Java对Ruby的加密/解密

  •  1
  • Gupta  · 技术社区  · 9 年前

    aes-cbc-pkcs5padding-encrypt-in-java-decrypt-in-ruby

    aes-cbc-pkcs5padding-implementation-in-ruby-for-rails

    gist.github.com

    symmetric encryption algorithms in Ruby

    * 
        /**
         * 
         */
        package in.bets.gsm.util;
        
        import javax.crypto.Cipher;
        import javax.crypto.spec.IvParameterSpec;
        import javax.crypto.spec.SecretKeySpec;
        
        import org.apache.commons.codec.binary.Base64;
        
        /**
         * @author VKatz
         *
         */
        public class SecurePath {
        
            /**
             * 
             */
            public SecurePath() {
                // TODO Auto-generated constructor stub
            }
            
            public static String key = "Bar12345Bar12345";
            public static String initVector = "RandomInitVector"; 
            
            public static String encrypt(String value) {
                try {
                    IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
                    SecretKeySpec [skeySpec][4] = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
        
                    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
                    cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
        
                    byte[] encrypted = cipher.doFinal(value.getBytes());
                    System.out.println("encrypted string: "
                            + Base64.encodeBase64String(encrypted));
        
                    return Base64.encodeBase64String(encrypted);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
        
                return null;
            }
        
            public static String decrypt(String encrypted) {
                try {
                    IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
                    SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
        
                    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
                    cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
        
                    byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted));
        
                    return new String(original);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
        
                return null;
            }
            
        public static void main(String[] args) {
                
                String encText = encrypt("abceeffslaj");
               
                System.out.println("Decripted text ::  " + decrypt("XZy6gJinORmH+LOiZL6/Jw=="));
            }
        
        }
    
    
    
    Output: 
    Simple Text ::  abceeffslaj
    Encrypted  text ::  XZy6gJinORmH+LOiZL6/Jw==
    Decripted Text ::  abceeffslaj
    

    为了得到相同的结果,我编写了以下代码

    require "openssl"
    require "base64"
    require 'byebug'
    
    include Base64
    
    plain_text = "abceeffslaj"
    
    cipher = OpenSSL::Cipher::AES128.new(:CBC)
    cipher.encrypt
    key = cipher.random_key
    iv = cipher.random_iv
    cipher_text = cipher.update(plain_text) + cipher.final
    
    cipher = OpenSSL::Cipher::AES128.new(:CBC)
    cipher.decrypt
    cipher.key = key
    cipher.iv = iv
    decrypted_plain_text = cipher.update(cipher_text) + cipher.final
    
    puts "AES128 in CBC mode"
    puts "Key: " + urlsafe_encode64(key)
    puts "Iv: " + urlsafe_encode64(iv)
    puts "Plain text: " + plain_text
    puts "Cipher text: " + urlsafe_encode64(cipher_text)
    puts "Decrypted plain text: " + decrypted_plain_text
    

    输出:

    AES128 in CBC mode
    Key: CJ-SNuUllNKl1vAllEazKg==
    Iv: ZMb2W6K07oaAXuvoL8Ckpg==
    Plain text: abceeffslaj
    Cipher text: jyutt1ljXW9Xn-HFxpvcEg==
    Decrypted plain text: abceeffslaj
    

    正如我们可能注意到的,密文和Java代码不同。

    2 回复  |  直到 4 年前
        1
  •  3
  •   Pascal    9 年前

    您需要使用Java示例中的IV和Key,而不是新的/随机的IV/Key:

    require "openssl"
    require "base64"
    require 'byebug'
    
    include Base64
    
    plain_text = "abceeffslaj"
    
    key = 'Bar12345Bar12345'
    iv = 'RandomInitVector'
    
    cipher = OpenSSL::Cipher::AES128.new(:CBC)
    cipher.encrypt
    cipher.key = key
    cipher.iv = iv
    cipher_text = cipher.update(plain_text) + cipher.final
    
    cipher = OpenSSL::Cipher::AES128.new(:CBC)
    cipher.decrypt
    cipher.key = key
    cipher.iv = iv
    decrypted_plain_text = cipher.update(cipher_text) + cipher.final
    
    puts "AES128 in CBC mode"
    puts "Key: " + urlsafe_encode64(key)
    puts "Iv: " + urlsafe_encode64(iv)
    puts "Plain text: " + plain_text
    puts "Cipher text: " + urlsafe_encode64(cipher_text)
    puts "Decrypted plain text: " + decrypted_plain_text
    
        2
  •  1
  •   Prasad Pilla    9 年前

    您需要提供相同的InitVector和密钥来加密和解密方法。

    require "openssl"
    require "base64"
    require 'byebug'
    
    include Base64
    
    plain_text = "abceeffslaj"
    
    cipher = OpenSSL::Cipher::AES128.new(:CBC)
    cipher.encrypt
    key = "Bar12345Bar12345"
    iv = "RandomInitVector"
    cipher.key = key
    cipher.iv = iv
    cipher_text = cipher.update(plain_text) + cipher.final
    
    cipher = OpenSSL::Cipher::AES128.new(:CBC)
    cipher.decrypt
    cipher.key = key
    cipher.iv = iv
    decrypted_plain_text = cipher.update(cipher_text) + cipher.final
    
    puts "AES128 in CBC mode"
    puts "Key: " + urlsafe_encode64(key)
    puts "Iv: " + urlsafe_encode64(iv)
    puts "Plain text: " + plain_text
    puts "Cipher text: " + urlsafe_encode64(cipher_text)
    puts "Decrypted plain text: " + decrypted_plain_text