繁体   English   中英

如何在没有盐的情况下在 Python 中使用 AES 加密?

[英]How to encrypt with AES in Python with no salt?

我想在 Python 中使用 AES 加密一些数据,以便相同数据的两次加密提供相同的输出(在两种加密中使用相同的密钥)。 我尝试使用静态 IV,但在给定一个输入的情况下,我仍然得到两个不同的输出。

这是我所做的:

from Crypto.Cipher import AES

iv = 16 * '\x00'
cipher = AES.new(key, AES.MODE_CBC, iv)

如果我决定多次加密相同的数据,我想获得相同的密码。 你知道如何防止使用盐吗? 谢谢!

这里的cipher对象是状态,并使用提供的密钥数据和初始化向量进行初始化。 一旦您开始使用这个初始化的密钥状态,当您使用 CBC 模式时,它会针对您加密的每个块进行修改。 这就是密码块链接的作用。 要进行两个单独的加密,您需要使用两个单独的密钥状态。 或者,如前所述,您可以使用在加密块时不影响密钥状态的模式 (ECB)。

一个演示(python3):

from Crypto.Cipher import AES
key = 16 * b'\0'
iv = 16 * b'\0'
plaintext = 16 * b'\x41'
a = AES.new(key, AES.MODE_CBC, iv)
b = AES.new(key, AES.MODE_CBC, iv)
ar = a.encrypt(plaintext)
br = b.encrypt(plaintext)
>>> ar
b'\xb4\x9c\xbf\x19\xd3W\xe6\xe1\xf6\x84\\0\xfd[c\xe3'
>>> br
b'\xb4\x9c\xbf\x19\xd3W\xe6\xe1\xf6\x84\\0\xfd[c\xe3'

ECB 模式的缺点是每次我们用这个密钥加密这个明文时我们都会得到这个结果。 在 CBC 模式下,每次我们加密另一个块时,密钥状态都会改变,我们会得到不同的输出,这取决于之前加密的内容。

欧洲央行模式

>>> ecb = AES.new(16 * b'\0', AES.MODE_ECB)
>>> ecb.encrypt(16 * b'\x41')
b'\xb4\x9c\xbf\x19\xd3W\xe6\xe1\xf6\x84\\0\xfd[c\xe3'
>>> ecb.encrypt(16 * b'\x41')
b'\xb4\x9c\xbf\x19\xd3W\xe6\xe1\xf6\x84\\0\xfd[c\xe3'

每个加密产生相同的结果。 不需要iv。

CBC模式

>>> cbc = AES.new(16 * b'\0', AES.MODE_CBC, 16 * b'\0')
>>> cbc.encrypt(16 * b'\x41')
b'\xb4\x9c\xbf\x19\xd3W\xe6\xe1\xf6\x84\\0\xfd[c\xe3'
>>> cbc.encrypt(16 * b'\x41')
b'o\x9fv\x9a\x9c\xaa\x03\x13\xba\x17\x8c\x1c.\x0f`v'
>>> cbc.encrypt(16 * b'\x41')
b'\n1\x165\xb5?\x04h\xa8\r>k\xdbK\xbc4'

第一个块加密与 ECB 模式相同,但后续块不同。

关于分组密码操作模式的进一步讨论可以在网上找到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM