通过“密码短语”播种的一次性垫
Posted
技术标签:
【中文标题】通过“密码短语”播种的一次性垫【英文标题】:one time pad with pad seeded via 'passphrase' 【发布时间】:2016-07-07 05:01:44 【问题描述】:在这里寻找理论讨论。我个人会(并将继续)使用 GPG 或仅使用 SCP 来简单地将文件获取到只有我可以解密或只有我可以下载的地方。仍然讨论以下内容的不足之处(以及不足之处)将有助于我的好奇心。
假设我想在本地加密一个文件,把它放到互联网上,以后可以抓取它。我想确保只有拥有特定密码/短语的人才能解密文件……而且我坚持使用一次性密码。
假设它仅用于加密消息一次,如果使用非常随机的密码(例如 Diceware)以可重复的方式为 pad 播种,这会不会有问题?在 python 中,我会做类似random.seed("hurt coaster lemon swab lincoln")
的事情,然后生成我的垫。我会使用相同的种子进行加密和解密。
到处都有关于此 Mersenne Twister RNG 不适合安全/加密目的的警告。我看到它有一个很长的周期,而且 IIUC,random.seed
允许我选择 16 个字节的不同种子 (Python: where is random.random() seeded?)。
我听说 OTP 中的数字应该是“真正随机的”,但即使有人看到我的 pad 的前 100 个字符,这对他们确定我的 RNG 的种子有多大帮助是(希望解码其余部分)?我想他们可以通过从每个可能的随机种子中生成填充并查看哪些匹配我的前 100 个随机字母来强制种子。不过,还是有不少随机种子可供尝试,对吧?
那么,这有多危险?有没有一种合理的方法可以通过查看序列的一点点来找出常见 RNG 生成的序列的种子?
【问题讨论】:
【参考方案1】:根据定义,一次性便笺本的密钥是与明文大小相同的真正随机数据。如果您以其他方式生产它(例如通过播种 PRNG),它就不是一次性垫,也没有一次性垫的牢不可破特性。
一次性便笺实际上是stream cipher 的一种特殊类型。还有其他流密码,是的,如果使用得当,它们会非常安全。但是,如果使用不正确,流密码也可能完全不安全,而您基于非加密 PRNG 组成自己的密码的想法从一开始就是不正确的使用。
即使攻击者拥有无限的计算能力,当密钥必须不可能进行暴力破解时,使用一次性密码。根据您的描述,您只是在寻找任何现实攻击者都不可行暴力破解的东西,这就是任何其他体面的密码都会给你的东西。除非您要保护核发射代码或其他东西,否则您只需要这些。
忘掉虚假的 OTP 和 Mersenne Twister 的想法,只需使用 AES 之类的东西,以及 bcrypt 或 scrypt 之类的东西来从您的密码短语中获取密钥。
关于确定 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,那就更好了。那么他甚至不必猜测。
【讨论】:
即便如此,俗话说“如果你在代码中输入字母 AES,你就做错了”,只需在对称模式下使用 gpg以上是关于通过“密码短语”播种的一次性垫的主要内容,如果未能解决你的问题,请参考以下文章