Gupta
Gupta

Reputation: 10368

Java encryption / decryption to Ruby

I have a snippet of code in Java responsible for Encryption and Decryption and need to convert it to Ruby. Before posting here I went through 4 Link but had no luck.

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

In order to get the same result I wrote below code

My effort: Ruby

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

Output:

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

As we might can notice here cipher text is difference from Java code.

Any help would be highly appreciate!

Upvotes: 2

Views: 1347

Answers (2)

Prasad Pilla
Prasad Pilla

Reputation: 131

You need to supply the same InitVector and the key to encrypt and decrypt method both.

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

Upvotes: 1

Pascal
Pascal

Reputation: 8646

You need to use the IV and Key from your Java Example, not a new/random 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

Upvotes: 3

Related Questions