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

我可以使用现有的,值得信赖的工具或库吗?

有帮助吗?

解决方案

尝试 random.org. 。他们拥有各种自由(和付费)服务,这些服务基于大气噪声(或至少是他们声称要做的)产生真正的随机数。

其他提示

大多数现代操作系统都有 密码确定的伪随机编号生成器.

例如,Windows具有 cryptgenrandom. 。您可以使用。 rngcryptoserviceprovider 班级。从C ++,您可以使用Microsoft C ++库功能访问同一流 rand_s. 。从Python,可以使用该功能访问 Urandom (请参阅链接页面的底部)在OS模块中。

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

密码学家使用的“伪随机”一词可能会误导非技术读者。 csprng将被称为种子的随机值集合扩展到更长的数字序列。鉴于种子,该序列是可重现的,但是对于任何良好的csprng来说,种子的较小变化都会产生截然不同的序列。因此,只要至少通过充分的随机过程选择种子的某些部分,攻击者就无法预测所得的序列 - 即使攻击者可以影响其余的种子。

从军事通信到保护几乎所有在线交易的加密,都依赖于“密码拟编码的伪随机”和“随机”之间的功能相等的安全性。

编辑: :如果您很幸运能够与Intel的Ivy Bridge Processor系列合作,那么您现在有 另一个非常有趣的选择.

您无法从算法上生成真正的随机数 - 您需要硬件帮助。如果您使用算法,无论多么安全(例如密码安全的PRNG),则您只是根据该prng创建一个流密码;它不再是一个时间垫。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top