AES-ECB加密(Python Crypto.Cipher和openssl之间的区别)

时间:2015-04-10 09:54:31

标签: python encryption openssl aes

我遇到使用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很糟糕,但我只是玩,所以没问题......;)

1 个答案:

答案 0 :(得分:2)

您可以尝试以下命令:

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

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

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