好的,所以我在 PHP 中做一个小河豚实现作为我自己的编程练习,并更好地了解加密方法。我得到了一组有效的功能,因为我可以加密数据并再次解密,但我发现的测试向量与我的加密值不符......因为编码/解码似乎工作,我猜测错误是在我的函数设置中,将密钥应用于 P 数组和 S-box,得到一组不同的 P 值和 S-box 值,因此编码值不同。有人可以找到我的逻辑出错的地方吗?
对于 0x00000000000000000 的键和 0x0000000000000000 的文本输入的测试用例,第一步是将键与 P 数组进行异或,但键全为零,这将导致 P 数组保持不变,所以仍然具有它开头的 pi 的十六进制值。然后使用当前的 P 数组和 S-box 对 64 字节的文本字符串 (0x0000000000000000) 进行编码,并将结果拆分以替换 P1 和 P2。然后再次对相同的输出进行编码(使用新的 P1 和 P2 值)以获得另一个输出,用于替换 P3 和 P4。这种情况一直持续到所有 P 值和 S-box 都改变为止。执行该过程,我得到以下信息(左侧为原始值,右侧为通过密钥过程传播后的值):
P1: 243f6a88 ⇒ 99f2ff37
P2: 85a308d3 ⇒ 9ce5cb96
P3: 13198a2e ⇒ d8bf7d9a
P4: 03707344 ⇒ eba1db37
P5: a4093822 ⇒ 5954010a
P6: 299f31d0 ⇒ 2b121658
P7: 082efa98 ⇒ e7a5b7ed
P8: ec4e6c89 ⇒ 21a6717f
P9: 452821e6 ⇒ b2bb1bf8
P10: 38d01377 ⇒ 937f0244
P11: be5466cf ⇒ e111a3da
P12: 34e90c6c ⇒ 67170ab6
P13: c0ac29b7 ⇒ 5d1db61b
P14: c97c50dd ⇒ cdf63d96
P15: 3f84d5b5 ⇒ c4935141
P16: b5470917 ⇒ ad859868
P17: 9216d5d9 ⇒ 0ca32381
P18: 8979fb1b ⇒ 50964a67
S1,0: d1310ba6 ⇒ a96eceb6
S1,1: 98dfb5ac ⇒ 3480051c
S1,2: 2ffd72db ⇒ 8d315fa7
S1,3: d01adfb7 ⇒ 936c585a
S1,4: b8e1afed ⇒ cd9cd593
...
S4,251: c208e69f ⇒ cc091e06
S4,252: b74e6132 ⇒ 2e7b8ad3
S4,253: ce77e25b ⇒ dc3d8ec5
S4,254: 578fdfe3 ⇒ c52e90ab
S4,255: 3ac372e6 ⇒ e1866c06
当我用该数据集编码 0x0000000000000000 时,我得到 0x3b8a9fa06e840430,但测试用例说我应该得到 0x4ef997456198dd78。
你能看出我哪里出错了吗?
编辑; 修复 32 位整数问题后的详细加密 这是我如何解释(我认为我的程序正在解释)河豚加密发生的方式。给定一个用 pi 的十六进制值初始化的 P 数组和 S-box 集,以及用空键异或的 P 数组(所以它仍然相同),我执行以下操作:
0x0000000000000000 输入被分成两部分,左半部分变成 L0,右半部分变成 R0:
L0 = 0x00000000
R0 = 0x00000000
R1 = L0 ^ P1 = 0x00000000 ^ 0x243f6a88 = 0x243f6a88
L1 = F(R1) ^ R0 = F(0x243f6a88) ^ 0x00000000 = 0xdb2f9c4e ^ 0x00000000 = 0xdb2f9c4e
R2 = L1 ^ P2 = 0xdb2f9c4e ^ 0x85a308d3 = 0x5e8c949d
L2 = F(R2) ^ R1 = F(0x5e8c949d) ^ 0x243f6a88 = 0x33002cc0 ^ 0x243f6a88 = 0x173f4648
R3 = L2 ^ P3 = 0x173f4648 ^ 0x13198a2e = 0x426cc66
L3 = F(R3) ^ R2 = F(0x426cc66) ^ 0x5e8c949d = 0xd8a68913 ^ 0x5e8c949d = 0x862a1d8e
....
R16 = L15 ^ P16 = 0xf5e1fd40 ^ 0xb5470917 = 0x40a6f457
L16 = F(R16) ^ R15 = F(0x40a6f457) ^ 0xea27e3cc = 0x66509b85 ^ 0xea27e3cc = 0x8c777849
Now untwist and apply final P values
R_final = L16 ^ P17 = 0x8c777849 ^ 0x9216d5d9 = 0x1e61ad90
L_final = R16 ^ P18 = 0x40a6f457 ^ 0x8979fb1b = 0xc9df0f4c
Final ciphered output: 0xc9df0f4c1e61ad90, should be 0x706d9fcc1792d23a...