我正在维护的一个PHP应用程序使用Rijndael_256和EBC_模式加密和mcrypt。有趣的是,密钥不是256位长,而是只有160位长。根据^{
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 = 'abcdefghijkm';
,它太短了,但是PHP的mcrypt实现确保在使用RIJNDAEL_时将其扩展到32个字符(或256位)。最后一把钥匙会是什么样子?在
我问这个问题是因为另一个应用程序正在构建,它使用相同的加密数据,但使用的是另一种语言。确切地说,我使用的是^{Crypto::Rijndael
(或任何其他密钥)的确切密钥是什么才能再次解密数据?在
更新
使用Perl,我可以生成一个填充了pack('a32', 'my secret key');
(或Z32
)的密钥,length()
将报告32,并且{
理论上,在PHP中pack('a32', 'my secret key');
应该产生与PHP的mcrypt生成的\0填充键相同的结果,但事实并非如此。在
我很快就可以再次加密所有东西了,但是要用一个新的密钥。这太花时间了。在
\0是'00'的十六进制值! 所以我测试了3个代码,它们返回的都是一样的:)
代码:
问题不是键的填充,而是你使用了两种不同的块大小。在PHP中,使用
MCRYPT_RIJNDAEL_256
使用的块大小为。。。256位。但是,在使用Crypt::Rijndael
的perl中,他们注意到:所以没有密钥可以在不同的算法之间进行转换。您可以在PHP中切换到128位:
Perl可以使用Crypt::Rijndael解密而不出问题:
^{pr2}$或者您可以切换到支持更多块大小的不同Perl模块,例如Crypt::Rijndael_PP:
Perl语言:
相关问题 更多 >
编程相关推荐