我正在运行http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf处给出的AES-128-ECB的测试向量之一。我将纯文本存储在" plain"文件和生成的加密文本在" cipher"文件。我使用的OpenSSL不是使用FIPS支持构建的。我无法在测试向量中得到结果。我做错了什么,或者这是没有FIPS支持的OpenSSL的预期结果?谢谢,
测试载体
键2b7e151628aed2a6abf7158809cf4f3c< === Key
Block#1
明文6bc1bee22e409f96e93d7e117393172a< ==明文
输入区块6bc1bee22e409f96e93d7e117393172a
输出块3ad77bb40d7a3660a89ecaf32466ef97
Ciphertext 3ad77bb40d7a3660a89ecaf324< == Ciphertext
我的结果
[root @ fn] echo 6bc1bee22e409f96e93d7e117393172a>纯
[root @ fn] cat plain
6bc1bee22e409f96e93d7e117393172a
[root @ fn] openssl enc -aes-128-ecb -p -nosalt -K 2b7e151628aed2a6abf7158809cf4f3c -in plain -out cipher
键= 2B7E151628AED2A6ABF7158809CF4F3C
[root @ fn] cat cipher
瓦特* E苅PG
[root @ fn] hexdump -C cipher
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
答案 0 :(得分:2)
AES-128标准的块大小为128/8 = 16字节。这意味着您在该链接上看到的明文,密钥和密码以十六进制表示(每个字符长度为32个字符)。如果你想获得与该链接相同的结果,你必须将你的明文从十六进制解码回ascii chars;否则openssl会将你的十六进制表示视为ascii字符并将对其进行加密,因此你最终会得到(正如你在结果中所注意到的)3x16加密字节,2x16字节用于你的明文(这是32字节,因为它是十六进制的表示),1x16字节用于填充(PKCS#7标准要求)
所以尝试将你的明文转换回ascii chars;在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个字节是填充。根据以下公式,此标准“强制”加密算法始终在加密算法之前将填充添加到纯文本中:padding_length = block_size - plaintext_length%block_size
,填充的char将是padding_length
的ascii char表示