在这里寻找理论讨论。我个人会(并将继续)使用 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 的种子有多大帮助是(希望解码其余部分)?我想他们可以通过从每个可能的随机种子生成 pad 并查看哪些与我的前 100 个随机字母匹配来暴力破解种子。不过,还是有很多随机种子可以尝试,对吧?
那么,这有多危险?有没有一种合理的方法可以通过查看序列的一小部分来找出由普通 RNG 生成的序列的种子?
最佳答案
根据定义,一次性密码本的 key 是与明文大小相同的真正随机数据。如果您以其他方式生成它(例如通过播种 PRNG),它就不是一次性垫,并且它不具有一次性垫的牢不可破属性。
一次性垫实际上是一种特殊类型的 stream cipher 。还有其他流密码,是的,如果使用得当,它们可以非常安全。但是,如果使用不当,流密码也可能完全不安全,并且您基于非加密 PRNG 构建自己的密码的想法从一开始就是不正确的使用。
当 key 必须不可能被暴力破解时,使用一次性密码本,即使攻击者拥有无限的计算能力。根据您的描述,您只是在寻找任何现实攻击者都无法通过暴力破解的东西,而这就是任何其他像样的密码都会给您的东西。除非您要保护核发射代码或其他东西,否则这就是您所需要的。
忘记假 OTP 和 Mersenne Twister 的想法,只需使用类似 AES 的东西即可。 ,类似于 bcrypt或scrypt从您的密码中获取 key 。
<小时/>关于您关于确定 RNG 序列的具体问题:Mersenne twister's internal state can be determined by observing 2496 bytes of its output.在流密码中,根据明文和密文很容易确定 key 流。这意味着,如果攻击者拥有您的密文并且可以确定明文的前 2496 个字节,那么他就知道 RNG 状态,并可以使用它来生成 key 流的其余部分并解密整个消息。
2496 字节对于暴力破解来说是不可行的,但是老练的攻击者可能能够通过智能猜测明文的内容来显着缩小可能性,例如您可能写过什么内容,或者什么文件格式数据可能采用的格式以及这些文件格式的已知结构。这称为 cribbing ,并且可以提供足够的起点,使剩余的暴力攻击变得可行。
如果攻击者能够欺骗您进入 incorporating some specific content into your plaintext 那就更好了。那么他甚至不需要猜测。
关于python - 通过 'passphrase' 进行一次填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38237834/