我正在开发具有执行AES128 (CBC)加密的外围设备的STM32L152xx。然而,为了初始化随机IV,我正在寻找一个好的方案来创建加密安全的随机数序列。我现在使用一个简单的LCRG (线性同余生成器)作为占位符,但这很弱。
我是在嵌入式平台上实现加密的新手,所以我想知道生成加密PRNG的常见做法是什么?或者选择密钥和IV的好策略是什么?
StackOverflow上的大多数答案都涉及到这个平台上不可用的第三方库。但是,如果值得一试,我可以尝试移植它。链接和指向资源的指针也会很有帮助!
我能接触到船上的系统时钟和加速计。我在运行FreeRTOS。谢谢!
发布于 2013-03-23 08:13:01
您可能需要定义“加密安全”或更好地定义您的应用程序。如果这是在手机上玩游戏,你可能会使用加速度计作为随机性的来源。如果您正在尝试签署x.509证书,您可能会考虑一些附加的硬件来测量放射性衰变。
在所有的严肃性中,根据你需要的“随机性”的强度,考虑以下几点:
上述任何一种方法都可能需要应用某种de-bias算法。最简单的方法是一次考虑2位的输入。如果这两个位相等,则丢弃它们。0b10变为1,0b01变为0。这将确保你在最终的随机值中得到大致相同数量的1和0。
最后,如果这是为了一些严重的事情,你应该忽略以上所有的建议,不要使用你自己的加密。为你的平台找到一些已经过审查的API,并使用它。测试算法的随机性是非常困难的。
也许可以考虑一下F‑2 series of the STM32 core,它显然包含一个硬件RNG
发布于 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函数控制,该函数可用于将您自己的随机信息注入内部随机池,或者告诉加密库轮询系统中的随机信息。”
发布于 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上获得优秀的答案。
https://stackoverflow.com/questions/15581679
复制相似问题