首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP3DES加密

PHP3DES加密
EN

Stack Overflow用户
提问于 2017-05-18 22:05:43
回答 1查看 1.6K关注 0票数 2

这是我的密码

代码语言:javascript
复制
 $key = pack('H*', "11223344556677881122334455667788");
 $plaintext = pack('H*', "0000000000000000");

 $ciphertext = mcrypt_encrypt(MCRYPT_3DES, $key, $plaintext, MCRYPT_MODE_ECB);
 echo bin2hex($ciphertext);

但我得到的结果是8ca64de9c1b123a7与本站不同

6FB23EAD0534752B,这就是我想要的

有人能解释我为什么会得到不同于那个网站的密码文本吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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 ):

代码语言:javascript
复制
    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 
    }

备注:

  • 您的DES键不完全有效,因为每个字节的奇偶校验位没有正确设置(然而,在DES计算中没有使用这些校验位);
  • 最好使用AES和认证密码模式,而不是不安全的欧洲央行模式。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44058464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档