Python 通过'进行垫种的一次性垫;密码短语';

Python 通过'进行垫种的一次性垫;密码短语';,python,encryption,random,Python,Encryption,Random,在这里寻找一个理论讨论。我个人会(并将继续)使用GPG或只是SCP来获取一个只有我才能解密或下载的文件。不过,讨论一下下面的不足之处(以及不足的程度)将有助于我的好奇心 假设我想在本地加密一个文件,把它放在互联网上,以后再抓取它。我想确保只有拥有特定密码/短语的人才能解密文件。。。我坚持要加一个一次性的便笺簿 假设它只用于加密一次消息,如果使用非常随机的密码短语(例如Diceware)以可复制的方式在pad中播种,这会是一个问题吗?在python中,我会执行类似于random.seed(“hur

在这里寻找一个理论讨论。我个人会(并将继续)使用GPG或只是SCP来获取一个只有我才能解密或下载的文件。不过,讨论一下下面的不足之处(以及不足的程度)将有助于我的好奇心

假设我想在本地加密一个文件,把它放在互联网上,以后再抓取它。我想确保只有拥有特定密码/短语的人才能解密文件。。。我坚持要加一个一次性的便笺簿

假设它只用于加密一次消息,如果使用非常随机的密码短语(例如Diceware)以可复制的方式在pad中播种,这会是一个问题吗?在python中,我会执行类似于
random.seed(“hurt coaster lemon swab lincoln”)
的操作,然后生成我的pad。我将使用相同的种子进行加密和解密

到处都有关于此Mersenne Twister RNG不适合用于安全/加密目的的警告。我看到它有一个很长的周期,IIUC,
random.seed
允许我选择16字节的不同种子()

我听说OTP中的数字应该是“真正随机的”,但即使有人看到,比如说,我的pad的前100个字符,这对他们确定我的RNG的种子有多大帮助(希望解码其余的)?我想他们可以通过从每一个可能的随机种子中生成PAD,并查看哪一个与我的前100个随机字母匹配,从而对种子施加暴力。不过,还是有很多随机种子需要尝试,对吗


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

根据定义,一次性键盘的键是与明文大小相同的真正随机数据。如果您以其他方式生产它(例如,通过播种PRNG),它不是一次性焊盘,并且不具有一次性焊盘的不易碎特性

一次性垫子实际上是一种特殊类型的垫子。还有其他的流密码,是的,如果使用得当,它们是非常安全的。但是,如果使用不当,流密码也可能是完全不安全的,而您基于非加密PRNG编写自己的密码的想法从一开始就是不正确的使用

即使攻击者拥有无限的计算能力,当密钥必须无法暴力破解时,也会使用一次性PAD。根据你的描述,你只是在寻找一些不可能被任何现实的攻击者暴力攻击的东西,而这正是任何其他体面的密码都能给你的。除非你在保护核发射代码或其他什么,否则这就是你所需要的

忘记伪OTP和Mersenne Twister的想法,只需使用类似的、带有类似的或从您的密码短语中派生出密钥


关于确定RNG序列的具体问题:在流密码中,在明文和密文的情况下,确定密钥流很容易。这意味着,如果攻击者拥有您的密文,并且能够确定您的明文的前2496字节,则他知道RNG状态,并可以使用它生成其余的密钥流并解密整个消息

2496字节不可能用暴力攻击,但是一个老练的攻击者可以通过对明文内容的智能猜测(例如您可能写了什么,或者数据可能采用什么文件格式以及这些文件格式的已知结构)大大缩小可能性。这被称为,并且可以提供足够的起点,使剩余的暴力攻击变得可行


如果攻击者能诱使你进入,那就更好了。然后他甚至不必猜测。

即便如此,正如俗话所说的“如果你在代码中键入字母AES,你就做错了”,只需将gpg与对称模式结合使用即可