我需要创建一次性填充来加密某些数据(大小为几KB)。我应该如何生成这个一次性填充以避免与基本随机数生成相关的所有伪随机问题,例如rand()
?
我可以使用现有的,可信的工具或库吗?
答案 0 :(得分:5)
大多数现代操作系统都有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。
答案 1 :(得分:4)
试试Random.ORG。他们有各种免费(和付费)服务,可以根据大气噪音产生真正随机的数字(或者至少是他们声称的那样)。
答案 2 :(得分:4)
您无法通过算法生成真正的随机数 - 您需要硬件帮助。如果你使用一种算法,无论多么安全(例如加密安全的PRNG),你只需要创建一个基于该PRNG的流密码;它不再是一次性垫。