我在使用 PHP 解密使用 iOS 5.x 的 CommonCrypto 库加密的字符串时遇到问题。以下是参数:
Algorithm: AES-128
Mode: CTR
Mode options: CTR Little-Endian
Padding: None
这是我最好的尝试示例:
<?php
$encrypted = base64_decode('MlNFlnXE1sqIsmKZRtjChBvUMgiJlXgdjHVxQJ6JK24Id4uaN9NK/nBtY+cgrMJR/PRJRCmIUx0boQO5XqJYZ8VJ0w==');
$key = base64_decode('HB+dD1Irj2rXQ/nO+IuqSiK9xVE3PD9cZGIGzrMtwtA=');
$iv = base64_decode('2gxxKYU/G4lj7174e5wj+g==');
$cryptor = mcrypt_module_open('rijndael-128', '', 'ctr', '');
mcrypt_generic_init($cryptor, $key, $iv);
echo mdecrypt_generic($cryptor, $encrypted);
mcrypt_generic_deinit($cryptor);
mcrypt_module_close($cryptor);
输出如下所示:
Lorem ipsum dolo?N??]ѕȢ?+?
????x??k????}??'???Ŧ??;t
但它应该是“ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do... ”(包括尾随省略号。)
块大小为 16,并且前 16 个字符是正确的。这似乎表明 Mcrypt 和 CommonCrypto 之间的 AES CTR 反递增过程不匹配。到目前为止,我听到的每个人都建议这是 Big Endian 与 Little Endian 的问题。
我花了几天时间试图自己弄清楚所有这些字节顺序和反递增的东西,但这对我来说仍然是巫术。:-( 我只需要一些 PHP 代码来正确解密我的字符串。我不在乎算法的运行速度有多快。我愿意放弃 Mcrypt 以支持 PHP-native 解决方案或其他一些 PHP 扩展,只要这是一个常见的。但是,在 iOS 端进行更改不是一种选择。
请帮忙!