首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌入式系统中的密码学伪随机数发生器?

嵌入式系统中的密码学伪随机数发生器?
EN

Stack Overflow用户
提问于 2013-03-23 07:57:14
回答 3查看 4.4K关注 0票数 8

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

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

StackOverflow上的大多数答案都涉及到这个平台上不可用的第三方库。但是,如果值得一试,我可以尝试移植它。链接和指向资源的指针也会很有帮助!

我能接触到船上的系统时钟和加速计。我在运行FreeRTOS。谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-23 08:13:01

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

在所有的严肃性中,根据你需要的“随机性”的强度,考虑以下几点:

  1. 当前时钟的32位值,每纳秒计时一次(周期大约为4秒-根据您需要种子的频率,可能足够“随机”)。您需要确保您不会以确定性的方式获取此值。如果你抓取它是基于用户的输入,那么它很可能是输入到施密特触发器输入的OK.
  2. An Avalanche Noise Generator
  3. 是你的加速度计所有轴的异或(如果它一直静止不动可能就不好了,除非它在正常的应用中接收到振动)。如果这是用于随身携带的无线电,那么这可能是可以的。
  4. 一大块未初始化内存的值(您可能想要对其进行散列,因为从开机到开机,大量未初始化的内存可能包含相似的值)。此外,如果你的设备没有完全关机,那么这可能不是好的。对上面的一个或多个选项进行异或(
  5. )可能是组合上述两个选项的最简单的方法:A CCD Camera pointed at a lava lamp

上述任何一种方法都可能需要应用某种de-bias算法。最简单的方法是一次考虑2位的输入。如果这两个位相等,则丢弃它们。0b10变为1,0b01变为0。这将确保你在最终的随机值中得到大致相同数量的1和0。

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

也许可以考虑一下F‑2 series of the STM32 core,它显然包含一个硬件RNG

票数 9
EN

Stack Overflow用户

发布于 2013-03-23 08:29:05

Pete Braughman的答案涵盖了这个问题的好答案应该是:无偏见和组合弱熵来源。我会有点犹豫在这个过程中使用未初始化的内存;我可以想象这样的场景:一个基于恶意用户以前没有使用过的未初始化的内存的假设的系统最终可能会遭到破坏。除此之外,我没有什么不同意的。

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

票数 3
EN

Stack Overflow用户

发布于 2014-07-31 13:04:40

我知道这是一个相当古老的问题,但由于还没有人提到加密安全的PRNG,我想我想加入进来。应使用crypto PRNG生成“加密安全”IV和密钥,例如HMAC_DRBG or CTR_DRBG。前者基于HMAC,后者基于AES in CTR mode。这两个PRNG在PolarSSL, which also runs on FreeRTOS中可用。注意不要使用DUAL_EC_DRBG,这是backdoored by the NSA,永远不会再使用。

最重要的是,您需要一个熵源来播种这些PRNG。不幸的是,这是嵌入式设备上最困难的部分。你可以在this blog中找到一些想法,比如取模数转换器的输出。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15581679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档