您可能需要更好地定义“加密安全”或您的应用程序。如果这是针对手机上的游戏,您可能会使用加速度计作为随机性来源。如果您尝试签署 x.509 证书,您可能会考虑使用一些附加硬件来测量放射性衰变。
严肃地说,根据您需要的“随机性”的强度,考虑以下几点:
- 每纳秒滴答的时钟的当前 32 位值(大约 4 秒的周期 - 可能足够“随机”,具体取决于您需要种子的频率)。您需要确保您不会以确定的方式获取此值。如果你抓取它时是基于用户输入的,那么它可能没问题。
- 雪崩噪声发生器馈入施密特触发器输入。
- 你的所有轴的异或是加速度计(如果东西一直静止不动可能不好,除非它在正常应用中拾取振动)。如果这是用于随身携带的收音机,那么这可能没问题。
- 一大块未初始化内存的值(您可能希望对其进行散列,因为大部分未初始化内存可能包含从开机到开机的相似值)。此外,如果您的设备没有完全断电,那么这可能不好。
- 上述一项或多项的某种组合(异或可能是组合上述两个输出的最简单方法)
- 喜剧选项:CCD 相机对准熔岩灯
上述任何方法都可能需要对它们应用某种去偏算法。最简单的一种是一次考虑您的输入 2 位。如果 2 位相等,则丢弃它们。0b10 变为 1,0b01 变为 0。这将确保您在最终随机值中获得或多或少相同数量的 1 和 0。
最后,如果这是为了一些严重的事情,你应该无视上述所有建议,而不是滚动你自己的加密货币。为您的平台找到一些已经过审查的 API 并使用它。测试随机性算法非常困难。
也许考虑一下STM32 内核的 F-2 系列,它显然包含一个硬件 RNG