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

tll*_*tll 8 c random embedded aes

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

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

StackOverflow上用于加密PRNG的大多数答案都指的是此平台上不可用的第三方库.但是,如果值得尝试,我可以尝试移植它.链接和指向资源也很有帮助!

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

Pet*_*man 9

您可能需要更好地定义"Cryptographically Secure"或您的应用程序.如果这是用于手机上的游戏,您可以使用加速度计作为随机源.如果您尝试签署x.509证书,您可能会考虑一些测量放射性衰变的连接硬件.

严肃地说,根据您需要的"随机性"的强度,请考虑以下因素:

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

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

最后,如果这是为了严肃的事情你应该忽略所有上述建议,而不是滚动你自己的CRYPTO.找到已经过审核的平台的API并使用它.测试随机性算法非常困难.

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

  • 我希望我能为喜剧选项另外+1."Malicious Cryptography:Exposing Cryptovirology"有一个"Caveman密钥生成算法"; "一种可以自动生成公钥并在不担心后门的情况下对其进行认证的安全方法":爬上地壳最深处的缝隙,确保没有人跟着你到那里,翻转一枚硬币然后让诺伊曼不偏不倚结果产生无偏见的硬币投掷,用铅笔记下生成的私钥,在纸上计算公钥,记住密钥对,烧纸,铅笔和手电筒......" (2认同)