我正在使用keil microvision IDE中的STM32F103E arm cortex M3MCU进行一个项目。
出于某些目的,我需要生成随机数,但我不想使用标准c++库生成的伪随机数,因此我需要一种使用硬件特性生成真实随机数的方法,但我不知道如何才能做到这一点。
有什么想法吗?(我是一名软件工程师,不是电子专业人员,所以请简单描述一下:P)
发布于 2013-02-10 19:13:28
如上所述,该芯片没有硬件RNG。
但你也可以自己动手。通常的方法是测量独立时钟之间的抖动。独立意味着两个时钟由不同的晶闸管或RC振荡器支持,并且不是从相同的来源派生的。
我将使用:
中的一个kHz范围RC振荡器
在kHz范围RC振荡器上设置一个计数器,使您每秒中断几次。在中断处理程序中,您可以读取SysTick计数器的当前值。无论SysTick是否用于其他目的(调度),低5位左右的比特都是不可预测的。
要从中获得随机数,请使用普通的伪RNG。使用上面收集的熵不可预测地改变伪RNG的内部状态。对于密钥生成,不要一次读取所有位,而要允许发生几个突变。
针对这一点的攻击是显而易见的:如果攻击者可以测量或控制kHz范围的RC振荡器达到MHz精度,那么随机性就会消失。如果您担心这一点,请使用智能卡或其他安全协处理器。
发布于 2014-10-11 03:14:55
这是我刚刚遇到的一个老问题,但我想要回答,因为我发现其他答案并不令人满意。
“我需要随机数来生成RSA密钥。”
这意味着PRNG例程(经常被错误地称为RNG,这是我最恼火的)是不可接受的,并且不会提供所需的安全性。
外部真RNG是可以接受的,但最优雅的答案是改用STM32F2xx或STM32F4xx微控制器,它确实有一个内置的真随机数生成器,这正是为了像这样的应用程序。对于开发,我认为您可以使用F1和任何PRNG,但在使用真正的RNG之前,当正确的组件(当然是ST F4,我认为F2芯片在这个问题被提出之前就已经存在)可用时,会有“它可以工作,让我们发货吧”的诱惑。
由于非技术原因,这个答案可能是不可接受的(芯片已经指定,操作人员没有对所需功能的输入),但选择芯片的人应该根据应用程序所需的片上外围设备和功能来选择它。
发布于 2013-02-10 18:06:22
F1系列似乎没有RNG (硬件随机数生成器),所以你唯一的选择是使用伪随机数或要求外部输入(一些人认为例如人类的手部运动是随机的)。您通常会使用一些加密库而不是标准的C++库来获得更好的伪随机。
https://stackoverflow.com/questions/14796398
复制相似问题