我正在研究STM32L152xx,它具有执行AES128(CBC)加密的外设。但是,要初始化随机IV,我正在寻找一个好的方案来创建加密安全的随机数序列。我现在使用一个简单的LCRG(线性同余发生器)作为占位器,但这很弱。
我是在嵌入式平台上实现加密的新手,所以我想知道生成加密PRNG的常见做法是什么?或者选择密钥和IV的好策略是什么?
StackOverflow上用于加密PRNG的大多数答案都指的是此平台上不可用的第三方库。但是,如果值得尝试,我可以尝试移植它。链接和指向资源也很有帮助!
我可以访问船上的系统时钟和加速度计。我正在运行FreeRTOS。谢谢!
答案 0 :(得分:9)
您可能需要更好地定义“Cryptographically Secure”或您的应用程序。如果这是用于手机上的游戏,您可以使用加速度计作为随机源。如果您正在尝试签署x.509证书,您可能会考虑一些测量放射性衰变的连接硬件。
严肃地说,根据您需要的“随机性”的强度,请考虑以下因素:
上述任何一种方法都可能需要应用某种de-bias算法。最简单的方法是一次考虑输入2位。如果2位相等,则丢弃它们。 0b10变为1,0b01变为0.这将确保您在最终随机值中得到或多或少相同数量的1和0。
最后,如果这是严重的事情,你应该忽略所有上述建议,而不是自己滚动的CRYPTO。找到已经过审核并使用它的平台的API。测试随机性算法非常困难。
或许考虑显然包含硬件RNG的F‑2 series of the STM32 core
答案 1 :(得分:3)
Pete Braughman的回答涵盖了这个问题的一个好答案:不偏不倚和结合弱熵源。在这个过程中使用未初始化的内存有点犹豫不决;我可以想到这样一种情况,即基于先前未被恶意用户使用未初始化内存的假设的系统最终可能会受到损害。除此之外,我不能不同意这一点。
为了节省你重新发明可能已经发明的轮子的时间,我的建议是简要地看一下cryptlib,只要你还没有这样做过; “ cryptlib的高度可移植性意味着它也被用于各种定制嵌入式系统环境,包括AMX,ChorusOS,eCos,FreeRTOS / OpenRTOS,uITRON,MQX,PalmOS,RTEMS,ThreadX,T-Kernel,uC / OS II,VDK,VxWorks和XMK。“这个库可能会为您完成大部分工作;假设使用cryptlib是可行的,您可能只需要使用随机信息(来自多个来源)来提供它:“随机数据收集操作由 cryptAddRandom函数,可用于注入自己的随机数 信息进入内部随机池或告诉cryptlib轮询系统 随机信息。“
答案 2 :(得分:0)
我知道这是一个相当古老的问题,但由于没有人提到加密安全PRNG,我想我想要插入。“密码安全”IV和密钥应使用加密PRNG生成,例如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中找到一些想法,例如取ADC输出。
特别是在IVs上,另一个重要标准是它应该是不可预测的。也就是说,在给定当前密文的情况下,攻击者不应该系统地预测下一个密文的IV。这是为了避免BEAST-like attack on TLS 1.0。
最后,对于这类问题,您有更好的机会在crypto.stackexchange.com上获得优秀的答案。