如何使用STM32 MCU生成REAL随机数?

Ehs*_*hmi 5 c++ random embedded microcontroller stm32

我正在使用keil microvision IDE中的STM32F103E arm cortex-m3 MCU开展一个项目.
我需要为某些目的生成随机数,但我不想使用标准c ++库生成的伪随机数,所以我需要一种使用硬件功能生成REAL随机数的方法,但我不知道如何我能做到.
任何的想法?(我是一名软件工程师而非电子专业人员,所以请说明一下:P)

小智 11

这是我刚遇到的一个老问题,但我想回答,因为我发现其他答案并不令人满意.

"我需要RSA密钥生成的随机数."

这意味着PRNG例程(经常被错误地称为RNG,我的一个小小的烦恼)是不可接受的,并且不会提供所需的安全性.

外部真正的RNG是可以接受的,但最优雅的答案是转换到STM32F2xx或STM32F4xx微控制器,该微控制器具有内置的TRUE随机数发生器,正好适用于此类应用.为了开发,我想你可以使用thr F1和任何PRNG,但是在使用真正的RNG之前会有"它可以工作,让我们发货"的诱惑,在正确的组件(当然是ST F4,我认为是STF4)时运送有缺陷的产品此问题的问题之前,F2芯片一直存在.

由于非技术原因(芯片已经指定,OP没有输入所需的功能),这个答案可能是不可接受的,但选择芯片的人应该根据应用所需的片上外设和功能选择芯片. .


edg*_*eis 7

如前所述,该芯片没有硬件RNG。

但是你可以自己动手。通常的方法是测量独立时钟之间的抖动。独立意味着两个时钟由不同的christals或RC振荡器作为后盾,而不是由它们衍生而来。

我会用:

  • SysTick计时器/计数器源自系统时钟(MHz范围)
  • 一种kHz范围的RC振荡器

在kHz范围的RC振荡器上设置一个计数器,可以使您每秒中断几次。在中断处理程序中,您将读取SysTick计数器的当前值。不管SysTick是否用于其他目的(计划),低5位都绝对不可预测。

为了从中获得随机数,请使用普通的伪RNG。使用上面收集的熵来意外地更改伪RNG的内部状态。对于密钥生成,不要一次读取所有位,而是要允许发生一些突变。

对此的攻击是显而易见的:如果攻击者可以测量或控制高达MHz精度的kHz范围的RC振荡器,那么随机性就会消失。如果您担心这一点,请使用智能卡或其他安全协处理器。