gpt4 book ai didi

php - 找出由 PHP 的 mcrypt 创建的确切 key

转载 作者:太空宇宙 更新时间:2023-11-04 06:32:43 25 4
gpt4 key购买 nike

我正在维护的一个 PHP 应用程序使用 Rijndael_256 和带有 mcrypt 的 EBC_MODE 加密。有趣的是, key 不是 256 位长,而是只有 160 位。根据 mcrypt_encrypt如果 key 太小,则用\0 填充 key 以获得所需的大小。

The key with which the data will be encrypted. If it's smaller than the required keysize, it is padded with '\0'. It is better not to use ASCII strings for keys.

这似乎发生在 line 1186 in mcrypt.c 的开始附近并修改第 1213 行的 key 。

假设我们得到的 $key = 'abcdefghijkm'; 太短了,但是 PHP 的 mcrypt 实现确保它在使用 RIJNDAEL_256 时扩展到 32 个字符(或 256 位)。最终 key 会是什么样子?

我问这个是因为正在构建另一个使用相同加密数据但使用另一种语言的应用程序。准确地说是 Perl,我正在使用 Crypto::Rijndael .对于给定的示例 key ,我必须提供给 Crypto::Rijndael(或与此相关的任何其他 key )才能再次解密数据的确切 key 是什么?

更新

使用 Perl,我可以生成一个\0 填充的 key ,执行 pack('a32', 'my secret key');(或 Z32), length() 将报告 32 并且 Crypt::Rijndael 模块接受 key 。查看 PHP 的 mcrypt 的源代码,这应该是正在生成的 key (\0 填充),但它根本不会接受它。

理论上,在 PHP 中 pack('a32', 'my secret key'); 应该产生与 PHP 的 mcrypt 生成的相同的\0 填充 key ,但事实并非如此。

我非常接近再次加密所有内容,但使用新 key 。这花费了太多时间。

最佳答案

问题不在于 key 的填充,而是您使用了两种不同的 block 大小。在 PHP 中,使用 MCRYPT_RIJNDAEL_256 使用 block 大小...... 256 位。然而,在使用 Crypt::Rijndael 的 perl 中,他们注意到:

blocksize
The blocksize for Rijndael is 16 bytes (128 bits), although the algorithm actually supports any blocksize that is any multiple of our bytes. 128 bits, is however, the AES-specified block size, so this is all we support.

因此没有允许在这些不同算法之间进行转换的 key 。您可以在 PHP 中切换到 128 位:

<?
$key = "abcdefghijklmnopqrstuvwxyz";
$data = "Meet me at 11 o'clock behind the monument.";
$crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_ECB, nil);
echo bin2hex($crypttext) . "\n";
// prints c613d1804f52f535cb4740242270b1bcbf85151ce4c874848fd1fc2add06e0cc2d26b6403feef4a8df18f7dd7f8ac67d
?>

哪个 Perl 可以使用 Crypt::Rijndael 毫无问题地解密:

use Crypt::Rijndael;
$key = "abcdefghijklmnopqrstuvwxyz\0\0\0\0\0\0";
$crypttext = "c613d1804f52f535cb4740242270b1bcbf85151ce4c874848fd1fc2add06e0cc2d26b6403feef4a8df18f7dd7f8ac67d";
$cipher = Crypt::Rijndael->new($key, Crypt::Rijndael::MODE_ECB());
print $cipher->decrypt(pack('H*', $crypttext));
# prints "Meet me at 11 o'clock behind the monument."

或者您可以切换到支持更多 block 大小的不同 Perl 模块,例如 Crypt::Rijndael_PP :

# Same PHP code except using MCRYPT_RIJNDAEL_256
# prints f38469ec9deaadbbf49bb25fd7fc8b76462ebfbcf149a667306c8d1c033232322ee5b83fa87d49e4e927437647dbf7193e6d734242d583157b492347a2b1514c

Perl:

use Crypt::Rijndael_PP ':all';
$key = "abcdefghijklmnopqrstuvwxyz\0\0\0\0\0\0";
$crypttext = "f38469ec9deaadbbf49bb25fd7fc8b76462ebfbcf149a667306c8d1c033232322ee5b83fa87d49e4e927437647dbf7193e6d734242d583157b492347a2b1514c";
print rijndael_decrypt(unpack('H*', $key), MODE_ECB, pack('H*', $crypttext), 256, 256);
# prints "Meet me at 11 o'clock behind the monument."

关于php - 找出由 PHP 的 mcrypt 创建的确切 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14948019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com