在目标C中解密AES-256-CBC
我正在构build一个iPhone应用程序,从PHP后端通过JSON获取解密的string。
在PHP中,我正在像这样encryptionstring:
$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解密这个string: 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);
日志现在只显示一个空对象。
我find了C#的重复post: 如何解密AES-256-CBCencryption的string
编辑:可以说,我可以在PHP中调整编码。 我应该如何encryptionPHP中的string才能在Objective C中解密?
你不是在iOS中做同样的事情。 我不熟悉这个BBAES框架,但是你似乎有一个密码,你可以用它来生成一个使用PBKDF密钥派生的256位AES密钥,并用它来解密数据。 但是,在PHP中,您正在哈希您的密码并使用它来encryption您的数据,因此您可能使用不同的AES密钥进行encryption和解密。 而且我不确定IVs是否匹配。
你应该做的是:
在PHP中,为每个encryption生成一个随机的16字节IV,并使用PBKDF密钥派生从密码生成256位AES密钥。 请记住,PHP和iOS中的salt和迭代次数必须相同。 encryption后,将IV附加到encryption的数据并发送。
在iOS中,从接收到的密文(最后16个字节)中提取IV,从密码中生成AES密钥,方法与使用相同的盐和迭代次数相同,然后解密数据(不包含16字节的IV结束)
编辑:
正如@Zaph指出的那样,我忘了提到你也应该使用相同types的填充。 BBAES似乎使用PKCS7填充。
要在Objective C中解密,您可以使用Apple的CommonCrypto C库版本。 它有一个手册页,已经有几个post显示堆栈溢出的解密示例,例如:
使用CCCrypt kCCOptionPKCS7Padding-Objective C确定密钥是否不正确
来自这里的教程:
http://robnapier.net/aes-commoncrypto
这对我也有帮助:
CCCrypt解密在AES CBC工作,即使没有IV
如果你有麻烦让它工作发表一些代码。