PHP:使用 mcrypt 在计数器模式下解密 AES

Posted

技术标签:

【中文标题】PHP:使用 mcrypt 在计数器模式下解密 AES【英文标题】:PHP: decrypting AES in Counter mode with mcrypt 【发布时间】:2012-09-27 23:07:36 【问题描述】:

我有一个在 Counter 模式下使用 AES 加密的字符串,它不是用 php 完成的,我无法使用 mcrypt 对其进行解码 :( 有一个类可以按预期工作:http://www.movable-type.co.uk/scripts/aes.html(见页面底部),但它很慢,所以我想用 mcrypt 解密。

根据类decrypt我做了以下方法:

 $key = $_POST['key'];

 $length = strlen($key);
 if($length > 32)
   $key = substr($key, 0, 32);

 $cyphered = base64_decode($_POST['cyphered']);
 /// make initialization vector with first 8 bytes treated as integers
 $f8b = array_map('ord', str_split(substr($cyphered, 0, 8)));
 array_unshift($f8b, 'I8');
 $iv = call_user_func_array('pack', $f8b);

 print mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, substr($cyphered, 8), 'ctr', $iv);

结果是输出垃圾:(我不明白我做错了什么。有人可以解释一下这个问题吗?

【问题讨论】:

你现在可能已经解决了这个问题,但我只是好奇这个字符串最初是用什么平台加密的? 【参考方案1】:

phpseclib's pure PHP AES implementation 几乎是可移动字体的 AES 实现速度的 4 倍:

http://phpseclib.sourceforge.net/crypt/examples.html

那是 mcrypt 不可用的时候。当 mcrypt 可用时,它会使用它并更快。

也就是说,如果你坚持使用 mcrypt……试试 MCRYPT_RIJNDAEL_128。 MCRYPT_RIJNDAEL_256 的块大小为 256 位,适用于 Rijndael(Rijndael 的块大小可变)但不适用于 AES。

【讨论】:

1.它没有成功:(从我看到它使用IV = 16字节大小,但我展示的类使用8、2。我不能拖入另一个依赖项:( IV 必须等于块大小。您显示的类可能是空填充 IV。

以上是关于PHP:使用 mcrypt 在计数器模式下解密 AES的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenSSL/C++ 和 PHP/Mcrypt 的 AES-128-CBC 加密:仅解密第一个块

使用 PHP mcrypt 加密后使用 Javascript CryptoJS 解密 AES

80分求DES加密解密算法实现的PHP源代码

Mcrypt弃用后如何解密?

利用php的mcrypt模块加密解密(AESDES等等)

使用 MCRYPT 在 PHP 中加密/解密...结果不一致