6

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

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

4

3 回答 3

5

大多数现代操作系统都有一个密码安全的伪随机数生成器

例如,Windows 有CryptGenRandom。您可以使用RNGCryptoServiceProvider类从 .NET 访问相同的流。在 C++ 中,您可以使用 Microsoft C++ 库函数rand_s访问相同的流。在 Python 中,可以使用 os 模块中的函数urandom(见链接页面底部)访问它。

与普通 PRNG 不同,CSPRNG 旨在通过严格的统计随机性测试。它们还旨在抵御严重攻击,即使它们的初始或运行状态可供攻击者使用。

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

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

编辑:如果您有幸使用英特尔的 Ivy Bridge 处理器系列,那么您现在有另一个非常有趣的选择

于 2011-01-12T18:18:11.850 回答
4

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

于 2011-01-12T18:21:30.523 回答
4

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

于 2011-01-12T23:08:10.097 回答