package fi.iki.murgo.irssinotifier; import javax.crypto.Cipher; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.PBEKeySpec; import android.util.Base64; import android.util.Log; public class Crypto { private static final String TAG = Crypto.class.getName(); public static String decrypt(String key, String payload) throws CryptoException { try { byte[] payloadBytes = Base64.decode(payload, Base64.URL_SAFE); Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC"); // Remove OpenSSL Salted_ byte[] salt = new byte[8]; System.arraycopy(payloadBytes, 8, salt, 0, 8); SecretKeyFactory fact = SecretKeyFactory.getInstance( "PBEWITHMD5AND128BITAES-CBC-OPENSSL", "BC"); c.init(Cipher.DECRYPT_MODE, fact.generateSecret(new PBEKeySpec(key.toCharArray(), salt, 100))); // Decrypt the rest of the byte array (after stripping off the salt) byte[] data = c.doFinal(payloadBytes, 16, payloadBytes.length - 16); String decrypted = new String(data, "utf8"); return decrypted.substring(0, decrypted.length() - 1); // trim out // trailing // \n } catch (Exception e) { e.printStackTrace(); Log.e(TAG, "Unable to decrypt data", e); throw new CryptoException("Unable to decrypt data", e); } } }