对 IV 的基本要求是"唯一性",即对于同一个密钥, IV 不能重复使用。为了理解其中原因,请使用 (1) 两个不同的 IV (2) 相同的 IV 加密相同的明文。请描述你观察到的现象。
有人可能会争辩说,如果明文不重复,那么使用相同的 IV 是安全的。让我们看一下输出反馈( OFB )模式。假设攻击者知道了明文( P1} )和密文( C1} )。如果 IV 始终相同,他/她可以破解其他的加密消息吗?请尝试根据下面提供的 P1 和 C1,对 C2 进行破译,找到它的明文 P2。
Plaintext (P1): This is a known message!
Ciphertext (C1): a469b1c502c1cab966965e50425438e1bb1b5f9037a4c159
Plaintext (P2): (内容你不知道)
Ciphertext (C2): bf73bcd3509299d566c35b5d450337e1bb175f903fafc159
在本实验中,如果我们用 CFB 替换 OFB,有多少 P2 会被泄露?你只需要回答这个问题,不需要论证。
本实验中使用的攻击方式被称为“已知明文攻击”。在这种密码分析攻击模型中,攻击者既可以获得一定数量的明文和对应的密文。如果这种攻击能导致进一步的秘密泄露,那么加密方案就被认为是不安全的。
示例代码。我们提供了一个名为 sample_code.py 的示例程序,该程序可在 Labsetup/Files 文件夹中找到。它展示了如何对字符串(ascii 字符串和十六进制字符串)进行异或运算。代码如下所示:
#!/usr/bin/python3
# XOR two bytearrays
def xor(first, second):
return bytearray(x^y for x,y in zip(first, second))
MSG = "A message"
HEX_1 = "aabbccddeeff1122334455"
HEX_2 = "1122334455778800aabbdd"
# Convert ascii/hex string to bytearray
D1 = bytes(MSG, 'utf-8')
D2 = bytearray.fromhex(HEX_1)
D3 = bytearray.fromhex(HEX_2)
r1 = xor(D1, D2)
r2 = xor(D2, D3)
r3 = xor(D2, D2)
print(r1.hex())
print(r2.hex())
print(r3.hex())