我维护的一个PHP应用程序使用Rijndael_256和EBC_MODE加密mcrypt。奇怪的是,密钥长度不是256位,而只有160位。根据
所以假设我们有
mcrypt_encrypt
文档,如果密钥太小,将使用\ 0进行填充以获取所需的大小。
这似乎发生在mcrypt.c文件的开始处(大约在第1186行),并在第1213行修改密钥。将用于加密数据的密钥。如果它比所需的键大小要小,则会被填充为'\ 0'。最好不要使用ASCII字符串作为密钥。
所以假设我们有
$key ='abcdefghijkm'; ,它太短了,但是PHP的mcrypt实现确保在使用RIJNDAEL_256时将其扩展到32个字符(或256位)。最终密钥会是什么样子?
我问这个问题是因为另一个应用程序正在构建,该应用程序使用相同的加密数据,但是使用另一种语言。确切地说是使用Perl,我正在使用Crypto::Rijndael
。对于给定的示例密钥,我需要在Crypto::Rijndael
(或任何其他密钥)中输入什么才能再次解密数据?
更新使用Perl可以通过pack('a32', 'my secret key');
(或者使用Z32
)生成以\0为填充的密钥,length()
函数将返回32,这个密钥可以被Crypt::Rijndael
模块所接受。查看PHP的mcrypt源代码,应该是生成了相同的以\0填充的密钥,但实际上并不行。
理论上,在PHP中使用pack('a32', 'my secret key');
应该会得到与PHP的mcrypt生成的相同的以\0填充的密钥,但事实并非如此。
我已经接近放弃,准备用新密钥重新加密所有内容。这太费时间了。
mcrypt_encrypt
加密的纯文本,并尝试使用Perl的Crypt::Rijndael
进行解密。我只需要知道当PHP的mcrypt_encrypt
完成后实际密钥的样子是什么:-)。 - Htbaa