繁体   English   中英

AES 256和Base64加密的字符串在iOS 8上有效,但在iOS 7上被截断

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM