8

我正在研究具有执行 AES128 (CBC) 加密的外围设备的 STM32L152xx。然而,为了初始化一个随机 IV,我正在寻找一个好的方案来创建密码安全的随机数序列。我现在使用一个简单的 LCRG(线性同余生成器)作为占位符,但这很弱。

我是在嵌入式平台上实现加密的新手,所以我想知道生成加密 PRNG 的常见做法是什么?或者选择密钥和 IV 的好策略是什么?

StackOverflow 上有关加密 PRNG 的大多数答案都是指该平台上不可用的 3rd 方库。但是,如果值得一试,我可以尝试移植它。指向资源的链接和指针也会有所帮助!

我可以访问船上的系统时钟和加速度计。我正在运行 FreeRTOS。谢谢!

4

3 回答 3

9

您可能需要更好地定义“加密安全”或您的应用程序。如果这是针对手机上的游戏,您可能会使用加速度计作为随机性来源。如果您尝试签署 x.509 证书,您可能会考虑使用一些附加硬件来测量放射性衰变。

严肃地说,根据您需要的“随机性”的强度,考虑以下几点:

  1. 每纳秒滴答的时钟的当前 32 位值(大约 4 秒的周期 - 可能足够“随机”,具体取决于您需要种子的频率)。您需要确保您不会以确定的方式获取此值。如果你抓取它时是基于用户输入的,那么它可能没问题。
  2. 雪崩噪声发生器馈入施密特触发器输入。
  3. 你的所有轴的异或是加速度计(如果东西一直静止不动可能不好,除非它在正常应用中拾取振动)。如果这是用于随身携带的收音机,那么这可能没问题。
  4. 一大块未初始化内存的值(您可能希望对其进行散列,因为大部分未初始化内存可能包含从开机到开机的相似值)。此外,如果您的设备没有完全断电,那么这可能不好。
  5. 上述一项或多项的某种组合(异或可能是组合上述两个输出的最简单方法)
  6. 喜剧选项:CCD 相机对准熔岩灯

上述任何方法都可能需要对它们应用某种去偏算法。最简单的一种是一次考虑您的输入 2 位。如果 2 位相等,则丢弃它们。0b10 变为 1,0b01 变为 0。这将确保您在最终随机值中获得或多或少相同数量的 1 和 0。

最后,如果这是为了一些严重的事情,你应该无视上述所有建议,而不是滚动你自己的加密货币。为您的平台找到一些已经过审查的 API 并使用它。测试随机性算法非常困难。

也许考虑一下STM32 内核的 F-2 系列,它显然包含一个硬件 RNG

于 2013-03-23T00:13:01.130 回答
3

皮特·布劳曼的回答涵盖了这个问题的一个好的答案应该是什么:无偏和结合弱熵源。在此过程中使用未初始化的内存我会有点犹豫;我可以想到这样的场景,即基于恶意用户先前未使用未初始化内存的假设的系统最终可能会受到损害。除此之外,没有什么我可以不同意的。

为了节省您重新发明可能已经发明的轮子的时间,我的建议是简要了解一下cryptlib ,前提是您还没有这样做;" cryptlib 的高度可移植性意味着它也被用于各种定制的嵌入式系统环境,包括 AMX、ChorusOS、eCos、FreeRTOS/OpenRTOS、uITRON、MQX、PalmOS、RTEMS、ThreadX、T-Kernel、uC/OS II、 VDK、VxWorks 和 XMK。 ” 这个库可能会为您完成大部分工作;假设使用 cryptlib 是可行的,您可能只需要向它提供随机信息(来自多个来源):“随机数据收集操作由 cryptAddRandom 函数控制,该函数可用于将您自己的随机信息注入内部随机池或告诉 cryptlib 轮询系统以获取随机信息。"

于 2013-03-23T00:29:04.987 回答
0

我知道这是一个相当古老的问题,但由于还没有人提到加密安全 PRNG,我想我想插话。“加密安全”IV 和密钥应使用加密 PRNG 生成,例如HMAC_DRBG 或 CTR_DRBG。前者基于HMAC,后者基于CTR模式的AES。这两个 PRNG 在PolarSSL 中可用,它也在 FreeRTOS 上运行。注意不要使用 DUAL_EC_DRBG,这是NSA 的后门,永远不会再使用。

最重要的是,您需要一个熵源来播种这些 PRNG。不幸的是,这是嵌入式设备的难点。您可以在此博客中找到一些想法,例如采用 ADC 输出。

特别是在 IV 上,另一个重要的标准是它应该是不可预测的。也就是说,在给定当前密文的情况下,攻击者不应该有系统的方法来预测下一个密文的 IV。这是为了避免对 TLS 1.0 进行类似 BEAST 的攻击

最后,对于这类问题,您将有更好的机会在crypto.stackexchange.com上获得出色的答案。

于 2014-07-31T05:04:39.730 回答