【发布时间】:2018-01-23 20:42:24
【问题描述】:
我正在尝试加密 16 字节的字符串“黎明攻击!!”使用密码为“黄色潜艇”的 AES-128。
在python中:
from Crypto.Cipher import AES
from base64 import b64encode
plaintext = 'Attack at dawn!!'
obj = AES.new("yellow submarine", AES.MODE_ECB)
ciphertext = obj.encrypt(plaintext)
print(b64encode(ciphertext).decode())
这给出了密文'kBKTLPWpU7Dpf/TiGo6p3w=='
现在在终端中使用 openssl。 plain.txt 是一个包含字符串 'Attack at Dawn!!' 的文本文件:
openssl enc -aes-128-ecb -nosalt -nopad -pass pass:"yellow submarine" -in plain.txt -out cipher.txt -a
这将返回 'X+fHjd97VRZLbH+BCgu6Xw==' 作为密文。
为什么它们不一样?
我尝试阅读文档或示例,但在 Internet 上没有找到任何有用的信息。我尝试更改 openssl 命令中的选项。我不知道如何解决这个问题。
【问题讨论】:
-
为什么它们应该是一样的? openssl 使用专有的密钥派生算法将密码转换为密钥和 IV,而 pycrypto 执行其他操作。如果您使用
-P选项,您可以看到派生密钥和IV 是什么。在你的 pycrypto 代码中使用它们。 -
天真地,我以为密码和密钥是一回事。我显然没有足够仔细地阅读手册,因为正如您所说,
-P会吐出实际的密钥(如果模式使用一个,则为 IV)。还有-K允许直接使用密钥。 -
@JamesKPolk 谢谢!这解决了我的困惑。
标签: python encryption openssl cryptography