【问题标题】:Can One-Time-Pad key be reused if encrypted plaintext is random?如果加密的明文是随机的,可以重复使用 One-Time-Pad 密钥吗?
【发布时间】:2014-05-06 09:51:38
【问题描述】:
我想用一个比明文短的密钥加密纯随机数据。
我应该使用 AES 还是其他强大的加密算法,还是可以使用 OTP,即仅使用唯一密钥逐块异或(纯随机)明文?
例如数据长度为 1024 位,并且是随机的。密钥长度为 128 位(也是随机的)。通过使用相同密钥对 8 个连续的 128 位块进行异或运算来加密数据是否安全?
【问题讨论】:
标签:
security
encryption
cryptography
encryption-symmetric
【解决方案1】:
您的问题是“通过使用相同的密钥对 8 个连续的 128 位块进行异或运算来加密数据是否安全?”
这不是一次性便笺。 One-Time-Pad 使用一次且仅一次。部分未加密数据的任何妥协都将允许恢复全部或部分密钥,从而恢复更多未加密数据。
安全的加密方案可以防止攻击者知道部分或全部明文:“已知明文攻击”。你的方案不安全;它容易受到已知的明文攻击。
【解决方案2】:
例如数据长度为 1024 位,并且是随机的。密钥长度为 128 位(随机
也)。通过异或 8 个连续的 128 位块来加密数据是否安全
用同一个钥匙?
如果你的数据是随机的,那么答案是肯定的。
您可以在此处将您的实际数据视为 OTP 密钥。它纯粹是随机的,并且只使用一次,因此无法恢复密钥或数据。
【解决方案3】:
如果数据本身是随机的,那么它与文本空间的可能性相同,因此任何转换都会带来安全性。 XOR 或流密码保持块在密文中的关系如下..
from Crypto.Cipher import ARC4
key = '1234567812345678'
obj1 = ARC4.new(key)
obj2 = ARC4.new(key)
d1= obj1.encrypt('\x01\x82\x83\x04\x05\x06\x10\x81\x23\x32\x33\x34')
d2= obj2.encrypt('\x81\x02\x83\x84\x85\x86\x90\x01\xa3\xb2\x33\xb4')
print repr(d1)
print repr(d2)
p1='';p2=''
for i in d1:
if ord(i)>=128: p1+=chr(ord(i)-128)
else: p1+=chr(ord(i))
print; print
for i in d2:
if ord(i)>=128: p2+= chr(ord(i)-128)
else: p2+=chr(ord(i))
print p1==p2`
输出:
'\xbaq\xba\xd0\x0c\xb7\xce&\xd3\x019\xfb'
':\xf1\xbaP\x8c7N\xa6S\x819{'
True