我的一个应用程序需要下载一个带有AES 256加密内容的数据库。因此,我在服务器端使用phpAES来用IV对AES CBC中的字符串进行编码。
在iOS方面,我使用FBEncryptor解密字符串。
这是服务器端的代码:
$aes = new AES($key, "CBC", $IV);
$crypt = $aes->encrypt($string);
$b64_crypt = base64_encode($crypt);
在iOS方面,我是这样做的:
NSString* decrypt = [FBEncryptorAES decryptBase64String:b64_crypt keyString:key iv:iv];
实际上,在iOS 8上,所有事情都能正常工作。问题是在iOS 7上,解码的字符串以随机长度被截断。
有什么想法?
发布于 2015-06-08 08:08:57
不要用phpAES。你用一门巨大的大炮射中了自己的脚。
在他们的网页上:
免费版本只支持欧洲央行模式,对加密/解密信用卡号码非常有用。
这是难以置信的错误和误导。欧洲央行模式不适合用于任何目的,除非作为其他操作模式的基石。您需要一个AEAD模式;或者,如果失败,则需要使用HMAC-SHA2和CSPRNG派生的IV/nonce的CBC或CTR。使用未经认证的加密是一个非常糟糕的主意。。
为了与iOS的互操作性,您应该使用使用利伯钠。
如果不能使用cannot,最好的选择是OpenSSL和显式密室,以及iOS端的兼容接口。
所有当前支持的PHP版本(5.4+)都公开了允许快速和安全的AES-CBC和AES-CTR加密的openssl_encrypt()
和openssl_decrypt()
。但是,您应该使用考虑使用为您实现这些函数的库。而不是自己编写它们。
发布于 2015-06-05 07:37:54
截断可能是不兼容填充的结果。
phpAES使用与mcrypt类似的非标准空填充,这是不幸的,因为填充的标准是PKCS#7。提供256位(32字节)密钥是很重要的,因为这将为算法设置密钥大小。
FBEncryptor只支持PKCS#7填充。
因此,这两种方法是不兼容的。
一种解决方案是在调用PKCS#7之前将phpAES填充添加到php中的字符串中,这样就不会添加空填充。然后FBEncryptor将与加密数据兼容。
PKCS#7填充总是添加填充。填充是一个按字节排列的序列,其值为添加的填充字节数。填充的长度是block_size -(长度(数据)% block_size )。
对于代码块为16字节的AES (希望php是有效的,已经有一段时间了):
$pad_count = 16 - (strlen($data) % 16);
$data .= str_repeat(chr($pad_count), $pad_count);
请在问题中添加工作示例密钥、iv清除数据和加密数据作为十六进制转储。
https://stackoverflow.com/questions/30665842
复制