用于加密的完美随机一次性填充

问题描述:

我需要创建一次性填充以加密一些数据(几KB大小)。我应该如何生成这个一次性键盘来避免与基本随机数生成相关的所有伪随机问题,如rand()用于加密的完美随机一次性填充

是否有可用于此的现有的可信工具或库?

+0

您使用的是什么语言/操作系统/运行环境? – 2011-01-12 18:21:02

+1

寻找几个很好的解决方案:http://*.com/questions/3436376/what-is-the-most-secure-seed-for-random-number-generation – 2011-01-12 18:41:38

+0

@Erik,无所谓许多。但最好是Windows。 – 2011-01-13 07:43:38

尝试Random.ORG。他们有各种免费(和付费)服务,可以根据大气噪声产生真正的随机数(至少这是他们声称的)。

大多数现代操作系统都有cryptographically-secure pseudo-random number generator。例如,Windows有CryptGenRandom。您可以使用RNGCryptoServiceProvider类从.NET访问相同的流。从C++开始,您可以使用Microsoft C++库函数rand_s访问相同的流。从Python中,可以使用os模块中的函数urandom(请参阅链接页面的底部)访问它。

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

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

许多重要的系统,从军事通信到实际上保护所有在线交易的加密,都依赖于“密码安全的伪随机”和“随机”之间功能上相同的安全性。

编辑:如果您足够幸运能够使用英特尔Ivy Bridge处理器系列,您现在有another very interesting alternative

您无法通过算法生成真正的随机数 - 您需要硬件帮助。如果你使用一种算法,但是安全(比如一个密码安全的PRNG),你只需要创建一个基于PRNG的流密码;它不再是一次性便条。