Cryptography 用于加密的完全随机一次性键盘

Cryptography 用于加密的完全随机一次性键盘,cryptography,random,one-time-password,Cryptography,Random,One Time Password,我需要创建一个一次性的pad来加密一些数据(大小为几KBs)。我应该如何生成这个一次性pad来避免与基本随机数生成相关的所有伪随机问题,例如rand() 是否有一个现有的、可信的工具或库可供我使用?大多数现代操作系统都有一个 例如,Windows具有。您可以使用类从.NET访问相同的流。从C++中,可以使用微软C++库函数访问同一个流。在Python中,可以使用操作系统模块中的函数(参见链接页面的底部)访问它 与普通PRNG不同,CSPRNG设计用于通过严格的统计随机性测试。它们还可以在严重攻击

我需要创建一个一次性的pad来加密一些数据(大小为几KBs)。我应该如何生成这个一次性pad来避免与基本随机数生成相关的所有伪随机问题,例如
rand()


是否有一个现有的、可信的工具或库可供我使用?

大多数现代操作系统都有一个

例如,Windows具有。您可以使用类从.NET访问相同的流。从C++中,可以使用微软C++库函数访问同一个流。在Python中,可以使用操作系统模块中的函数(参见链接页面的底部)访问它

与普通PRNG不同,CSPRNG设计用于通过严格的统计随机性测试。它们还可以在严重攻击下保持良好的性能,即使攻击者可以使用它们的初始或运行状态

密码学家使用的术语“伪随机”可能会误导非技术读者。CSPRNG将随机值的集合(称为种子)扩展为更长的数字序列。给定种子,该序列是可重复的,但对于任何好的CSPRNG,种子中的微小变化产生一个非常不同的序列。因此,只要通过适当的随机过程选择至少部分种子,攻击者就无法预测结果序列——即使攻击者可以影响剩余的种子

从军事通信到保护几乎所有在线交易的加密,许多重要系统都依赖于“加密安全伪随机”和“随机”之间的功能等效安全性


编辑:如果您有幸使用英特尔的常春藤桥处理器系列,您现在有了。

试试看。他们有各种免费(和付费)服务,可以根据大气噪音生成真正的随机数(至少他们声称是这样做的)。

你不能通过算法生成真正的随机数-你需要硬件帮助。如果您使用一种算法,无论多么安全(例如加密安全的PRNG),您只是在基于该PRNG创建一个流密码;它不再是一次性的Pad。

您使用的是什么语言/操作系统/运行时环境?请在这里寻找一些好的解决方案:@Erik,没什么大不了的。不过最好是Windows。@Nick:虽然对一次性pad使用加密安全的PNRG与使用真正的RNG不同,但这两种方法的强度几乎相同。它不是免费的“加密安全”。我喜欢史蒂夫·贝洛文(Steve Bellovin)的话:“我观察到一次性密码在理论上是不可破解的,但实际上非常脆弱。相比之下,传统密码在理论上是可破解的,但实际上很强大。”不,它们“强度几乎不一样”。一个真正的检察官办公室,如果使用得当,从字面上说是牢不可破的,因为所有的明文都是同样可能的。相比之下,加密安全的PRNG具有更有限的状态。OP几乎肯定想要一个传统的密码——OTP很少是正确的答案——但简单地说“使用PRNG”是一个坏建议:你只是在PRNG的基础上发明你自己的密码,你最好使用现有的密码。没有保证的“真正的OTP”。安全性仅相对于攻击模型定义。例如,可以在几平方毫米的集成电路上构建一个硬件电路来产生被颠覆的比特。最复杂的硬件随机数发生器可以通过将这样一个芯片放在随机源数字化的上游任何地方来颠覆,比如在输出驱动芯片中,甚至在连接RNG和计算机的电缆中。@roadwarner是的。不要将实施或验证的困难与理论上的不可能混淆。这是完全不相关的:无论实现“真正的”OTP是否可行,使用PRNG肯定不是一个。OTP的基本安全性是基于拥有一组序列完全不可预测的数字。无论数字的来源(RNG或PRNG)如何,具有足够访问权限的攻击者都可能破坏序列的不可预测性。我上面的例子强调了对RNG的颠覆,有一篇学术论文展示了一种类似的颠覆CryptGenRandom的方法。因此,我使用了“保证”一词——RNG(真实OTP)和PNRG(伪OTP)都不能保证生成不可压缩的随机数序列。只要你不介意别人知道你的超级秘密一次性密码。你不介意你的攻击者能够在电线上拦截它。