AES-ECB加密(PythonCrypto.Cipher与openssl的区别)

AES-ECB encryption (Difference between Python Crypto.Cipher and openssl)

我在使用 python 和 openssl 加密时遇到问题。

我写了这个小 python 脚本:

#!/usr/bin/python
from Crypto.Cipher import AES

obj = AES.new('Thisisakey123456', AES.MODE_ECB)
message = "Sample text....."
ciphertext = obj.encrypt(message)
print ciphertext

当我 运行 使用此命令的脚本时:

$ ./enc.py | base64

我得到 E0lNh0wtSg9lxxKClBEITAo= 结果。

如果我在 openssl 中做同样的事情(或者显然它不一样;)),我会得到另一个结果:

$ echo -n "Sample text....." | openssl aes-128-ecb -k "Thisisakey123456" -nosalt -nopad | base64
yvNTGC+gwUK38uyJXIk/sQ==

我做错了什么??我希望使用相同的 base64 编码字符串。

顺便说一句:我知道 ecb 不好,但我只是随便玩玩,所以没问题...;)

你可以试试这个命令:

echo -n "Sample text....." | openssl aes-128-ecb -K 546869736973616b6579313233343536 -nopad | openssl base64

这明确指定了 hexadecimals 中的密钥。对于 -k,后面的 "key" 实际上是一个密码,它是通过名为 EVP_BytesToKey 的基于 OpenSSL 密码的密钥派生函数 (PBKDF) 转换的(使用 SHA-1 的一次迭代)。

结果是E0lNh0wtSg9lxxKClBEITA==。这与 E0lNh0wtSg9lxxKClBEITAo= 不同,但那是因为 Python 在密文中添加了一个换行符 \n,导致需要额外编码一个字节。