我正在构建一个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中解密?
答案 0 :(得分:3)
你在PHP中没有像iOS那样做同样的事情。我不熟悉这个BBAES框架,但您似乎拥有的密码是使用PBKDF密钥派生生成256位AES密钥的密码,并使用它来解密数据。 但是,在PHP中,您将对密码进行哈希处理并使用它来加密数据,因此您可能使用不同的AES密钥进行加密和解密。我不确定IVs是否匹配。
你应该做的是:
在PHP中,为您执行的每次加密生成一个随机的16字节IV,并使用PBKDF密钥派生从密码生成256位AES密钥。请记住,在PHP和iOS中,salt和迭代次数必须相同。加密后,将IV附加到加密数据并发送。
在iOS中,从收到的密文(最后16个字节)中提取IV,从密码生成AES密钥的方式与使用相同的盐和迭代次数之前的方式相同,并解密数据(不使用16最后的字节IV)
修改强>
正如@Zaph指出的那样,我忘了提到你也应该使用相同类型的填充。 BBAES似乎使用PKCS7填充。
答案 1 :(得分:1)
要在Objective C中解密,您可以使用Apples的CommonCrypto C库版本。它有一个手册页,并且已经有几个帖子显示Stack Overflow上的解密示例,例如:
Determine if key is incorrect with CCCrypt kCCOptionPKCS7Padding-Objective C
来自这里的教程:
http://robnapier.net/aes-commoncrypto
这对我也很有帮助:
CCCrypt decrypting in AES CBC works even without IV
如果您在使用某些代码时无法正常工作。