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
,导致需要额外编码一个字节。
我在使用 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
,导致需要额外编码一个字节。