我正在构建一个 iPhone 应用程序,它通过 JSON 从 PHP 后端获取解密的字符串。
在 PHP 中,我像这样加密字符串:
$encrypt_method = "AES-256-CBC";
$secret_key = 'This is my secret key';
$secret_iv = 'This is my secret iv';
// hash
$key = hash('sha256', $secret_key);
// iv - encrypt method AES-256-CBC expects 16 bytes - else you will get a warning
$iv = substr(hash('sha256', $secret_iv), 0, 16);
if( $action == 'encrypt' ) {
$output = openssl_encrypt($string, $encrypt_method, $key, 0, $iv);
$output = base64_encode($output);
}
在 Objective C 中,我尝试使用 BBEAS 解密此字符串:https://github.com/benoitsan/BBAES
这是我在 Objective C 中得到的代码:
NSData* salt = [BBAES IVFromString"This is my secret iv"];
NSData *key = [BBAES keyBySaltingPassword"This is my secret key" salt:salt keySize:BBAESKeySize256 numberOfIterations:BBAESPBKDF2DefaultIterationsCount];
NSData *decryptedMessage = [BBAES decryptedDataFromString"RlVnd01XOE5teTNseDFGQ3JScVhkQT09" IV:salt key:key];
NSLog(@"Decrypted message: %@", decryptedMessage);
日志现在只显示一个空对象。
我找到了 C# 的重复帖子:How to decrypt an AES-256-CBC encrypted string
编辑:
可以说我可以调整 PHP 中的编码。我应该如何加密 PHP 中的字符串以在 Objective C 中解密?
Best Answer-推荐答案 strong>
您在 PHP 中所做的事情与在 iOS 中不同。我不熟悉这个 BBAES 框架,但您似乎拥有一个密码,您使用 PBKDF key 派生从中生成 256 位 AES key ,并使用它来解密数据。
但是,在 PHP 中,您正在对密码进行哈希处理并使用它来加密您的数据,因此您可能使用不同的 AES key 进行加密和解密。我也不确定 IV 是否匹配。
你应该做的是:
在 PHP 中,为您执行的每次加密生成一个随机的 16 字节 IV,并使用 PBKDF key 派生从您的密码生成 256 位 AES key 。请记住,盐和迭代次数在 PHP 和 iOS 中必须相同。加密后,将IV附加到加密数据后发送。
在 iOS 中,从收到的密文(最后 16 个字节)中提取 IV,使用相同的盐和迭代次数之前的相同方式从密码生成 AES key ,然后解密数据(没有 16最后的字节IV)
编辑:
正如@Zaph 指出的那样,我忘了提到您也应该使用相同类型的填充。 BBAES 似乎使用 PKCS7 填充。
关于ios - 在 Objective C 中解密 AES-256-CBC,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/29427780/
|