【发布时间】:2020-12-19 05:19:23
【问题描述】:
这是 cryptopals 挑战的一部分 (cryptopals.org)
以下代码对上一轮得到的密文进行“加密”操作:
from Crypto.Cipher import AES
def ecb(plaintext, key):
assert len(plaintext) == 16
cipher = AES.new(key, AES.MODE_ECB)
ciphertext = cipher.encrypt(plaintext)
return ciphertext
if __name__ == '__main__':
testbytes = b'a' * 16
key = b'0' * 16
ciphertext = ecb(testbytes, key)
plaintext = ecb(ciphertext, key)
assert testbytes == plaintext
理论上ECB就是这么简单,加解密模式的唯一区别就是明文和密文交换的地方:加密时明文输入密文输出,解密时密文输入明文输出,休息是一样的。由此推断,再次“加密”密文应该产生明文,但这段代码不能那样工作。如果我不得不猜测encrypt 和decrypt 不仅仅是应用块操作。无论如何,为什么双重加密不能按预期工作?
【问题讨论】:
-
'为什么双重加密不能按预期工作?' - 想一个简单的凯撒式卷曲,其中字母只是移动(例如 3,'e' 将变成 'h')。进行双重加密不会返回“e”而是“k”。所以你需要以相反的顺序来获取原始明文。这与 AES 相同,因为@Topaco 给出的答案是完整的。
-
@MichaelFehr - 但是,OP 的假设并非完全不合理。在某些情况下,加密两次可能会产生明文,例如具有 XOR 操作的一次性填充。但只是不适用于 AES(或凯撒密码)。
标签: python encryption aes