AES-128-ECB 和 OpenSSL 的测试向量

Test Vectors for AES-128-ECB and OpenSSL

我是 运行 http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf 给出的 AES-128-ECB 测试向量之一。我将纯文本存储在 "plain" 文件中,并将生成的加密文本存储在 "cipher" 文件中。我正在使用的 OpenSSL 不支持 FIPS。我无法获得测试向量中给出的结果。我是在做错什么,还是没有 FIPS 支持的 OpenSSL 的预期结果?谢谢,

测试向量

密钥 2b7e151628aed2a6abf7158809cf4f3c <===密钥

区块 #1

明文 6bc1bee22e409f96e93d7e117393172a <==明文

输入块 6bc1bee22e409f96e93d7e117393172a

输出块 3ad77bb40d7a3660a89ecaf32466ef97

密文 3ad77bb40d7a3660a89ecaf324 <==密文

我的结果

[root@fn] echo 6bc1bee22e409f96e93d7e117393172a > plain

[root@fn] 普通猫

6bc1bee22e409f96e93d7e117393172a

[root@fn] openssl enc -aes-128-ecb -p -nosalt -K 2b7e151628aed2a6abf7158809cf4f3c -in plain -out cipher

键=2B7E151628AED2A6ABF7158809CF4F3C

[root@fn]猫密码

�w*E�苅�Pg���

[root@fn] hexdump -C 密码

00000000 cc fd 74 a0 75 78 42 23 4c cb ef 59 85 af 68 b1 <===

00000010 5f c0 01 83 c0 e8 73 8b e4 6a 73 e8 58 36 9b 4d

00000020 cb 77 1e 2a 45 1b 61 dd 85 1a f0 50 67 ab cf fc

00000030

AES-128 标准的块大小为 128/8=16 字节。这意味着您在 link 上看到的明文、密钥和密码以十六进制表示(每个长度为 32 个字符)。如果您想获得与 link 相同的结果,您必须将明文从十六进制解码回 ascii 字符;否则 openssl 会将您的十六进制表示视为 ascii 字符并对其进行加密,因此您最终会得到(正如您在结果中注意到的那样)3x16 加密字节,2x16 字节用于明文(这是 32 字节,因为它是十六进制的表示),1x16 字节用于填充(PKCS#7 标准要求它)

所以尝试将明文转换回 ascii 字符; 运行 shell 中的以下命令:

python -c "print '6bc1bee22e409f96e93d7e117393172a'.decode('hex')" > plaintext
openssl enc -aes-128-ecb -p -nosalt -K 2b7e151628aed2a6abf7158809cf4f3c -in plaintext -out ciphertext
hexdump -C ciphertext

最后一条命令的结果如下:

00000000  3a d7 7b b4 0d 7a 36 60  a8 9e ca f3 24 66 ef 97
00000010  cb 77 1e 2a 45 1b 61 dd  85 1a f0 50 67 ab cf fc

根据 PKCS#7 标准,最后 16 个字节是填充。此标准 "forces" 加密算法总是在加密之前对纯文本添加填充,根据以下公式:padding_length = block_size - plaintext_length%block_size,填充的字符将是 padding_length 的 ascii 字符表示