我正在实现一个包含 DES 和 3DES 功能的支持库。作为验证步骤,我使用它openssl
来检查我的结果。对于一个简单的测试,我这样做了:
echo -n "AAAAAAAA" | openssl enc -e -des-ecb -nosalt -pass pass:AABBCCDD | xxd
00000000: 2976 3faf 5e27 7187 5897 c640 c38c cf8b )v?.^'q.X..@...
即 ECB mod、plaintext AAAAAAAA
、keyAABBCCDD
和 no salting。但是这里有两件事让我觉得很奇怪。
(1) 对于 64 位输入和 64 位块大小,我希望输出具有与输入相同的长度
(2) 如果我将输入加倍为 128 位(所有 A,块长度的两倍),我实际上得到 24 字节的密文
$ echo -n "AAAAAAAAAAAAAAAA" | openssl enc -e -des-ecb -nosalt -pass pass:AABBCCDD | xxd
00000000: 2976 3faf 5e27 7187 2976 3faf 5e27 7187 )v?.^'q.)v?.^'q.
00000010: 5897 c640 c38c cf8b X..@....
在进行最后一个实验时,我注意到密文确实在块大小边界上重复(参见2976 3faf 5e27 7187
重复)。但是当达到这个阈值时,我们会得到额外的 8 个字节的密文。即,使用 7 个 A 给出 8 个字节的密文,但 8 个 A 给我们 16 个字节。所以对这个边界条件似乎有一些奇怪的处理?
无论如何,我检查了一些随机的在线 DES 工具,但没有一个与 openssl 提供的相匹配——但它们都相互匹配。从这些工具中,我认为上面第一个示例的正确密文是
54 55 ab a4 a2 b0 83 38
或者他们都以同样的方式错了。这里发生了什么?