*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]]