*24 Feb 2015*
<div class="posthaven-post-body">
This one is precious, as it took me a long time to figure out. As a side-note, Java apparently only supports 128bit AES.\
\
Here's the Ruby code:\
\
> <div>
>
> def encrypt(string, pwd)
>
> </div>
>
> <div>
>
> salt = OpenSSL::Random.random_bytes(16)
>
> </div>
>
> <div>
>
> \
>
> </div>
>
> <div>
>
> \# prepare cipher for encryption
>
> </div>
>
> <div>
>
> e = OpenSSL::Cipher.new('AES-128-CBC')
>
> </div>
>
> <div>
>
> e.encrypt
>
> </div>
>
> <div>
>
> \
>
> </div>
>
> <div>
>
> \# next, generate a PKCS5-based string for your key + initialization vector
>
> </div>
>
> <div>
>
> key_iv = OpenSSL::PKCS5.pbkdf2_hmac_sha1(pwd, salt, 1024, e.key_len+e.iv_len)
>
> </div>
>
> <div>
>
> key = key_iv\[0, e.key_len\]
>
> </div>
>
> <div>
>
> iv = key_iv\[e.key_len, e.iv_len\]
>
> </div>
>
> <div>
>
> \
>
> </div>
>
> <div>
>
> \# now set the key and iv for the encrypting cipher
>
> </div>
>
> <div>
>
> e.key = key
>
> </div>
>
> <div>
>
> e.iv = iv
>
> </div>
>
> <div>
>
> \
>
> </div>
>
> <div>
>
> \# encrypt the data!
>
> </div>
>
> <div>
>
> encrypted = '' \<\< e.update(string) \<\< e.final
>
> </div>
>
> <div>
>
> \[encrypted, iv, salt\].map {\|v\| ::Base64.strict_encode64(v)}.join("--")
>
> </div>
>
> <div>
>
> end
>
> </div>
\
And the Java part:\
\
> <div>
>
> public static String decrypt(String encrypted, String pwd) throws Exception {
>
> </div>
>
> <div>
>
> \
>
> </div>
>
> <div>
>
> String\[\] parts = encrypted.split("--");
>
> </div>
>
> <div>
>
> if (parts.length != 3) return null;
>
> </div>
>
> <div>
>
> \
>
> </div>
>
> <div>
>
> byte\[\] encryptedData = Base64.decodeBase64(parts\[0\]);
>
> </div>
>
> <div>
>
> byte\[\] iv = Base64.decodeBase64(parts\[1\]);
>
> </div>
>
> <div>
>
> byte\[\] salt = Base64.decodeBase64(parts\[2\]);
>
> </div>
>
> <div>
>
> \
>
> </div>
>
> <div>
>
> SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
>
> </div>
>
> <div>
>
> KeySpec spec = new PBEKeySpec(pwd.toCharArray(), salt, 1024, 128);
>
> </div>
>
> <div>
>
> SecretKey tmp = factory.generateSecret(spec);
>
> </div>
>
> <div>
>
> SecretKey aesKey = new SecretKeySpec(tmp.getEncoded(), "AES");
>
> </div>
>
> <div>
>
> \
>
> </div>
>
> <div>
>
> Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
>
> </div>
>
> <div>
>
> cipher.init(Cipher.DECRYPT_MODE, aesKey, new IvParameterSpec(iv));
>
> </div>
>
> <div>
>
> \
>
> </div>
>
> <div>
>
> byte\[\] result = cipher.doFinal(encryptedData);
>
> </div>
>
> <div>
>
> return new String(result, "UTF-8");
>
> </div>
>
> <div>
>
> }
>
> </div>
</div>
[[tags/aes|aes]] [[tags/encryption|encryption]] [[tags/java|java]] [[tags/ruby|ruby]] [[tags/ssl|ssl]]