在目标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框架,但是你似乎有一个密码,你可以用它来生成一个使用PB​​KDF密钥派生的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

如果你有麻烦让它工作发表一些代码。