这种一次性填充的实现是否在语义上是安全的?

时间:2014-02-15 04:21:45

标签: security math cryptography encryption

我一直在参加密码学课程(https://class.coursera.org/crypto-009),我们正在讨论一次性密码密码(https://en.wikipedia.org/wiki/One-time_pad)。

老师说这个密码不实用,因为他们的密钥必须事先通过安全的通信方式解决,并且与数据字符串一样长。

但是如果不是让密钥成为提前计算出来的长二进制数,那么每次我们需要一个新密钥时,我们都会使用两个重复小数的xor,每次我们需要发送一条消息时,我们根据需要使用两个重复小数的xor中的多个数字,然后刻录我们使用的数字。

双方将为他们自己提供两个重复小数,为另一个人提供两个重复小数,以便他们能够破译他们收到的消息。

#We will burn all of the bits we use, plus a certain number of extra bits on the end 
#of each repeating decimal each time we use it.
#The sender will calculate this number of extra bits to burn, and then included
#it as a header or tag in the contents of the message
randIntA = random int

#Alternately, it could be calculated based off of the length or contents of the message 
randIntB = random int

d1 = repeating decimal

d2 = repeating decimal != d1

R = d1 xor d2 

m1 = binary(text)

#Note: I made this notation in a python style, but if this were python,
#I would have said R[:len(m1)+2]
E = (m1 , R[:len(m1)])==>C

C = m1 xor R[:len(m1)]

#We burn the number of bits that we used plus a certain number(randintA and randintB respectivly) of extra bits on the end of each repeating decimal

d1=d1[len(m1)+randlen:]

d2=d2[len(m1)+randlen:]

TLDR还原:您是否可以使用一对重复小数来制作OTP密钥。

2 个答案:

答案 0 :(得分:2)

以这种方式使用重复小数的问题是,如果你对它们进行异或,它们仍会重复。如果一个数字具有N比特的重复序列而另一个具有M比特的重复序列,则它们的XOR将重复&lt; = LCM(M,N)<= M * N比特,并且您将开始泄漏信息在M + N位的顺序之后。这基本上没用。

有一些方法可以应用具有较短密钥长度的一次性填充技术;这些是stream ciphers。他们将一个短密钥扩展为一个非常长的,随机看似的比特流,其设计方式使得攻击者很难在给定部分流的情况下确定关于密钥或流的其余部分的有用信息。它们不能实现一次性打击垫的不可破坏性,但它们可以轻松实现密钥管理。您的算法是一个非常弱的流密码。

答案 1 :(得分:0)

大多数人与OTP联系,维基百科将OTP称为“真正的随机密钥”。只有这种强大的加密结果才能成功。其他一切只是实现安全性较低的加密方案的一种奇怪方式。

根据其定义,真正的随机密钥具有等于ist大小的熵。通俗地说,没有更简洁的方式来描述密钥而不是将其打印出来。来自两个中等大小整数的分数的重复小数具有较短的描述,因此具有较少的熵。由于您考虑的主要内容似乎是找到更短的描述,因此它必然会失败。