[英]AES 256 and Base64 Encrypted string works on iOS 8 but truncated on iOS 7
我的一个应用程序需要下载一个数据库,该数据库具有用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上,解码后的字符串被随机截断。
有什么想法吗?
不要使用phpAES。 您正在用一门巨大的大炮射击自己的脚。
从他们的页面:
免费版仅支持ECB模式 ,可用于加密/解密信用卡号。
这是难以置信的错误和误导。 ECB模式不适用于任何目的,除非作为其他操作模式的基础。 您需要一种AEAD模式; 否则,CBC或CTR与HMAC-SHA2和CSPRNG衍生的IV / nonce。 使用未经身份验证的加密是一个非常糟糕的主意 。
为了与iOS互操作,您应该使用libsodium 。
如果您不能使用libsodium,最好的选择是OpenSSL,而不是 mcrypt ,这是iOS上的兼容接口。
当前所有受支持的PHP版本(5.4+)都公开了openssl_encrypt()
和openssl_decrypt()
,可实现快速,安全的AES-CBC和AES-CTR加密。 但是,您应该考虑使用为您实现这些功能的库,而不是自己编写它们。
截断可能是填充不兼容的结果。
phpAES使用类似于mcrypt的非标准空填充,这很不幸,因为填充的标准是PKCS#7。 不幸的是,人们必须阅读代码才能找到答案。 提供256位(32字节)密钥很重要,因为这会设置算法的密钥大小。
FBEncryptor仅支持PKCS#7填充。
因此,这两种方法不兼容。
一种解决方案是在调用phpAES之前,将PKCS#7填充添加到php中的字符串中,这样便不会添加空填充。 然后,FBEncryptor将与加密的数据兼容。
PKCS#7填充总是添加填充。 填充是按字节排列的序列,其中添加了填充字节数的值。 填充的长度为block_size-(length(data)%block_size。
对于块为16字节的AES(希望php有效,已经有一段时间了):
$pad_count = 16 - (strlen($data) % 16);
$data .= str_repeat(chr($pad_count), $pad_count);
请在问题工作示例密钥中添加iv,以十六进制转储的形式清除数据和加密数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.