PyCryptodome 上下文如何为 AES 密码链接消息?
How PyCryptodome context chains messages for AES cipher?
TL;DR:PyCryptodome AES 上下文如何链接消息?
考虑这段代码:
from Crypto.Util.Padding import pad, unpad
from Crypto.Cipher import AES
# Create AES-128-CBC context; pad message; encrypt x2.
cipher = AES.new(b'Sixteen byte key', AES.MODE_CBC, b'16-byte init.vec')
pt = pad(b'The quick brown fox jumped over the lazy dog', 16)
print(cipher.encrypt(pt).hex()) # First output: 95c44b...
print(cipher.encrypt(pt).hex()) # Second output: dfa658...
如您所见,相同的操作与相同的初始化。矢量给出不同的结果。原因是重用了 AES 上下文(在本例中为 cipher
)。
问题是,PyCryptodome 如何链接加密消息以获得不同的结果。换句话说,它如何被描述为一个抽象算法?如何在不使用内置链接的情况下获得第二个输出?
我已经查看了 PyCryptodome 文档甚至源代码,但没有找到答案。我认为它重新创建了 IV 或其他东西..
正如@Topaco 在评论中所述,PyCryptodome 使用 先前加密的最后一个块作为下一条消息的 IV 。可以用这段代码来演示:
from Crypto.Util.Padding import pad, unpad
from Crypto.Cipher import AES
cipher = AES.new(b'Sixteen byte key', AES.MODE_CBC, b'16-byte init.vec')
pt = pad(b'The quick brown fox jumped over the lazy dog', 16)
lb = cipher.encrypt(pt)[-16:] # last block of ciphertext
# Reinitialize context - for demonstration purposes
cipher = AES.new(b'Sixteen byte key', AES.MODE_CBC, lb)
print(cipher.encrypt(pt).hex()) # Second output: dfa658...
TL;DR:PyCryptodome AES 上下文如何链接消息?
考虑这段代码:
from Crypto.Util.Padding import pad, unpad
from Crypto.Cipher import AES
# Create AES-128-CBC context; pad message; encrypt x2.
cipher = AES.new(b'Sixteen byte key', AES.MODE_CBC, b'16-byte init.vec')
pt = pad(b'The quick brown fox jumped over the lazy dog', 16)
print(cipher.encrypt(pt).hex()) # First output: 95c44b...
print(cipher.encrypt(pt).hex()) # Second output: dfa658...
如您所见,相同的操作与相同的初始化。矢量给出不同的结果。原因是重用了 AES 上下文(在本例中为 cipher
)。
问题是,PyCryptodome 如何链接加密消息以获得不同的结果。换句话说,它如何被描述为一个抽象算法?如何在不使用内置链接的情况下获得第二个输出?
我已经查看了 PyCryptodome 文档甚至源代码,但没有找到答案。我认为它重新创建了 IV 或其他东西..
正如@Topaco 在评论中所述,PyCryptodome 使用 先前加密的最后一个块作为下一条消息的 IV 。可以用这段代码来演示:
from Crypto.Util.Padding import pad, unpad
from Crypto.Cipher import AES
cipher = AES.new(b'Sixteen byte key', AES.MODE_CBC, b'16-byte init.vec')
pt = pad(b'The quick brown fox jumped over the lazy dog', 16)
lb = cipher.encrypt(pt)[-16:] # last block of ciphertext
# Reinitialize context - for demonstration purposes
cipher = AES.new(b'Sixteen byte key', AES.MODE_CBC, lb)
print(cipher.encrypt(pt).hex()) # Second output: dfa658...