通过'passphrase'

时间:2016-07-07 05:01:45

标签: python encryption random

在这里寻找理论讨论。我个人会(并将继续)使用GPG或只是SCP来获取一个文件,只有我可以解密它或只有我可以下载它。仍然讨论下面的内容不足(以及多少)将有助于我的好奇心。

假设我想在本地加密文件,将其放在互联网上,以后能够抓住它。我想确保只有拥有特定密码/短语的人才能解密该文件......我坚持要使用一次性密码。

假设它只用于加密一次消息,如果一个人使用非常随机的密码短语(例如Diceware)以可重现的方式播种打击垫,这会是一个问题吗?在python中,我会做random.seed("hurt coaster lemon swab lincoln")之类的事情然后生成我的pad。我会使用相同的种子进行加密和解密。

有关Mersenne Twister RNG不适合安全/加密目的的警告。我看到它有一个很长的时间段,而{II},random.seed允许我选择16个字节的不同种子(Python: where is random.random() seeded?)。

我听说OTP中的数字应该是“真正随机的”,但即使有人看到我的垫的前100个字符,这对他们确定我的RNG的种子有多大帮助是(希望解码其余的)?我想他们可以通过从每个可能的随机种子生成垫子并看到哪些与我的前100个随机字母相匹配来强制种子。不过,还有很多随机种子可以尝试,对吗?

那么,这有多危险?有没有一种合理的方法可以通过窥视一点点的序列来找出由普通RNG生成的序列的种子?

1 个答案:

答案 0 :(得分:3)

根据定义,一次性密钥的密钥是与明文大小相同的真正随机数据。如果您以其他方式生产它(例如通过播种PRNG),它不是一次性垫,并且它不具有一次性垫的不可破坏性。

一次性垫实际上是一种特殊类型的stream cipher。还有其他流密码,是的,如果使用得当,它们可以非常安全。但是如果使用不正确,流密码也可以完全不安全,并且您从一开始就基于非加密PRNG构建自己的密码的想法是不正确的用法。 / p>

即使攻击者具有无限的计算能力,当密钥必须不可能暴力时,也会使用一次性密码。根据您的描述,您只是在寻找任何现实攻击者蛮力的东西不可行,这是任何其他体面的密码会给你的东西。除非您正在保护核发射代码或其他东西,否则这就是您所需要的全部内容。

忘记虚假OTP和Mersenne Twister的想法,只需使用像AES这样的东西,例如bcryptscrypt来从密码短语中导出密钥。

关于确定RNG序列的具体问题:Mersenne twister's internal state can be determined by observing 2496 bytes of its output.在流密码中,给定明文和密文很容易确定密钥流。这意味着如果攻击者拥有您的密文并且可以确定您的明文的前2496个字节,他就知道RNG状态并且可以使用它来生成密钥流的其余部分并解密整个消息。

2496字节对暴力不可行,但是复杂的攻击者可能能够通过对明文内容的智能猜测来大大缩小可能性,例如您可能已经写过的内容,或者文件格式是什么可能存在的数据以及这些文件格式的已知结构。这被称为cribbing,可以提供足够的起点,使剩余的暴力攻击成为可能。

如果攻击者可以诱骗你进入incorporating some specific content into your plaintext,那就更好了。然后他甚至不必猜测。