我使用以下openssl命令行加密文件:
openssl enc -aes-256-cbc -pass pass:somepassword -p -in inputfile.txt -out outputfile.enc
以下Java代码可以解密这个问题:
byte[] encrypted = getBytesFromInputStream(in);
String password = "somepassword";
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC");
// Openssl puts SALTED__ then the 8 byte salt at the start of the
// file. We simply copy it out.
byte[] salt = new byte[8];
System.arraycopy(encrypted, 8, salt, 0, 8);
SecretKeyFactory fact = SecretKeyFactory.getInstance("PBEWITHMD5AND256BITAES-CBC-OPENSSL", "BC");
c.init(Cipher.DECRYPT_MODE, fact.generateSecret(new PBEKeySpec(password.toCharArray(), salt, 100)));
// Decrypt the rest of the byte array (after stripping off the salt)
byte[] data = c.doFinal(encrypted, 16, encrypted.length - 16);
它读取salt并从openssl命令行版本中获取密码中的IV。
如何使用C或ObjC在iOS上解密此文件? Commoncrypto是一个不错的选择,还是坚持使用openssl EVP api更好?我在API中找不到任何用于派生openssl keyspec的函数,尽管在命令行实用程序使用它的时候,某些地方的API必须存在于openssl中。
我猜想使用commoncrypto会是首选方式吗?有没有办法在commoncrypto中复制PBE密钥规范?