Encryption DES加密函数给我一个错误的密码文本

Encryption DES加密函数给我一个错误的密码文本,encryption,cryptography,des,Encryption,Cryptography,Des,我已经用haskell编写了DES算法,但是当我尝试它时,它没有给出正确的输出,我已经单独测试了每个函数,它们似乎工作正常,我已经用一条消息加密:明文=123456ABCD132536,密钥=AABB09182736CCDD,当用DES加密时,假设给我作为输出密文=C0B7A8D05F3A829C。子键都是(K1..K16)正确的,l0,r0也是正确的,l1,r1,l2,r2也是正确的,但是在第3轮,我得到r3=B00A9591,但根据我遵循的教程,它应该是B8089591 (我们有r2=4A1

我已经用haskell编写了DES算法,但是当我尝试它时,它没有给出正确的输出,我已经单独测试了每个函数,它们似乎工作正常,我已经用一条消息加密:明文=123456ABCD132536,密钥=AABB09182736CCDD,当用DES加密时,假设给我作为输出密文=C0B7A8D05F3A829C。子键都是(K1..K16)正确的,l0,r0也是正确的,l1,r1,l2,r2也是正确的,但是在第3轮,我得到r3=B00A9591,但根据我遵循的教程,它应该是B8089591

(我们有r2=4A1210F6,扩展后变成2540A40A17AC,子键k3=6EDA4ACF5B5的异或后得到23AD00A6E219,替换后得到232713FA,直接置换后得到EA727605,最后得到l2=5A78E394的异或得到B00A9591)


哪一点是不正确的?即使我用手去做,我也会得到同样的结果,我不明白问题是什么,因为第三轮使用的函数与第1轮和第2轮使用的函数相同,没有任何问题。有没有人能给我r3的正确值,以及问题出在哪里?我花了很长时间。谢谢。

这是从Eugene Styer的副本中完成的,Eugene Styer的副本经过修改,可以通过删除只读属性和默认值来输入密钥。允许设置密钥的原始代码的副本在Google代码上可用

它产生输出密文c0b7a8d05f3a829c

Round 3  
E   :  001001 010100 000010 100100 000010 100001 011110 101100 2540A40A17AC  
KS  :  000001 101110 110110 100100 101011 001111 010110 110101 06EDA4ACF5B5  
E xor KS:  001000 111010 110100 000000 101001 101110 001000 011001 23AD00A6E219  
Sbox:  0010 0011 0010 0111 0001 0011 1111 0000 232713FA  (should be 232713F0)  
P   : 11100010 01110000 01110110 00000101 EA727605 (should be E2707605)  
L[i]: 01001010 00010010 00010000 11110110  
R[i]: 10111000 00001000 10010101 10010001  
您在十六进制中的输出已被注释,并告诉我们S框8的第01行索引12(1100)产生的输出应为0000时为1010

S框8 FIPS Pub 46中的值:

    13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7,
     1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2,
     7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8,
     2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11,
向下第二行,第13列元素

对于标签为B1到B6的6位输入011001,行通过连接B1和B6(01或从0开始计数的行1)找到,列通过连接B2到B5(1100)找到

以下p置换中的差异由两个意外的“1”位解释

如果没有数据,就无法确定这是否是唯一的错误

有关测试向量的信息,请参阅,该测试向量允许使用由全零组成的键测试S框。(答案最后一段中的dropbox链接仍然有效。)

显示对JS-DES.html的修改的差异:

623c623
<         <td><input name="key" value="0000000000000000" size="25" type="text"></td>
---
>         <td><input name="key" value="3b3898371520f75e" readonly="readonly" size="25" type="text"></td>
627c627
<         <td><input name="keyb" value="0000000000000000" size="25" type="text"></td>
---
>         <td><input name="keyb" value="922fb510c71f436e" readonly="readonly" size="25" type="text"></td>
623c623
<         
---
>         
627c627
<         
---
>         

这个问题好像是你从什么地方抄来的。无论如何,如果您的代码有问题,您应该将其显示为yes@ArtjomB。很抱歉,我在密码学中问了这个问题,但他们告诉我应该在这里问,好的,我会问你的问题,你可以不用问新的问题。在测试分组密码实现时,先用密钥0…0对明文0…0进行加密是很有用的,这样可以避免字节排序或位排序的问题。如果得到(0,0)的正确答案,则打开明文或键中的一位。在第3轮中,S框输出232713FA是错误的。