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

3

我有一个使用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
请记住,ECB可能是不安全的(如果您对详细信息感兴趣的话)。只有当消息小于块大小且只有一个加密的消息在密钥下才能确保安全。如果您有一个大于块大小的消息,则需要使用CBC模式(或其他类似模式)。如果消息重复,则每个消息都需要在密钥下具有唯一的IV。 - jww
1
谢谢,我知道这一点。我没有实现安全性,只是在玩一些东西...无论如何,你不能够强调它足够多 :) - mg.
1个回答

2
你可以尝试这个命令:
echo -n "Sample text....." | openssl aes-128-ecb -K 546869736973616b6579313233343536 -nopad | openssl base64

这里明确指定了十六进制中的密钥。使用-k时,以下“密钥”实际上是密码,通过OpenSSL基于密码的密钥派生函数(PBKDF)EVP_BytesToKey(使用SHA-1的一次迭代)进行转换。
结果是E0lNh0wtSg9lxxKClBEITA==。这与E0lNh0wtSg9lxxKClBEITAo=不完全相同,但这是因为Python将单个换行符\n添加到密文中,导致多一个字节编码。

只是出于兴趣,你目前使用的是哪个base64编码器?我的Linux base64命令似乎运行良好。 - Maarten Bodewes
IV参数似乎不再需要了。这很好,因为ECB不使用任何IV。 - Maarten Bodewes
1
谢谢...今天又学到一件事了... :) 我认为问题不在于base64。这是因为Python的打印命令会添加一个换行符,并将换行符编码为base64。 - mg.
啊,那确实可以解释。 - Maarten Bodewes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接