这是我的密码
$key = pack('H*', "11223344556677881122334455667788");
$plaintext = pack('H*', "0000000000000000");
$ciphertext = mcrypt_encrypt(MCRYPT_3DES, $key, $plaintext, MCRYPT_MODE_ECB);
echo bin2hex($ciphertext);但我得到的结果是8ca64de9c1b123a7与本站不同
6FB23EAD0534752B,这就是我想要的
有人能解释我为什么会得到不同于那个网站的密码文本吗?
发布于 2017-05-18 23:01:43
mcrypt有--或者更确切地说--有一种坏习惯,就是在大小不对的情况下,用零填充任何东西。更糟糕的是,它还通过删除字节将键削减到正确的大小。
由于敏感的骨化,评论 mcrypt似乎只支持3个关键的三重DES。这并没有那么糟糕,直到你注意到它会很高兴地接受一个16字节的2键三重DES键,然后用0填充它,使它成为一个3键三重DES键。当然,它应该失败,而更新版本的mcrypt实际上应该这样做。
不过,您可以使用3键三重DES创建相同的结果。2键三重DES简单地重用最后一个键的第一个键,因此复制前8个字节并将其附加到键的末尾将得到正确的结果(同样,正如已经指出的那样)。
最好使用另一个密码库来获得正确的结果。mcrypt (底层C库)已经有8年左右没有维护了(而且还在计算),而且非常糟糕。
在Java中的示例(它也不完全支持两个关键的三重DES ):
byte[] pt = new byte[16];
SecretKeyFactory fact = SecretKeyFactory.getInstance("DESede");
Cipher desEDE = Cipher.getInstance("DESede/ECB/NoPadding");
{
// usual 2-key triple DES:
byte[] keyData = Hex.decode("112233445566778811223344556677881122334455667788");
SecretKey generatedSecret = fact.generateSecret(new SecretKeySpec(keyData, "DESede"));
desEDE.init(Cipher.ENCRYPT_MODE, generatedSecret);
byte[] ct = desEDE.doFinal(pt);
System.out.println(Hex.toHexString(ct)); // result: 6FB23EAD0534752B
}
{
// "zero padded" 2-key triple DES:
byte[] keyData = Hex.decode("112233445566778811223344556677880000000000000000");
SecretKey generatedSecret = fact.generateSecret(new SecretKeySpec(keyData, "DESede"));
desEDE.init(Cipher.ENCRYPT_MODE, generatedSecret);
byte[] ct = desEDE.doFinal(pt);
System.out.println(Hex.toHexString(ct)); // result: 8ca64de9c1b123a7
}备注:
https://stackoverflow.com/questions/44058464
复制相似问题