【ESP-IDF】ESP32获取真随机数

ESP32内置一个真随机数发生器。我翻了好几个型号的ESP32的编程指南,都有相关的函数,应该是大部分型号都有,具体有没有还需要对照一下自己手上的ESP32型号。

我们可以从从随机数发生器的寄存器 RNG_DATA_REG 中读取随机数,每个读到的 32 位随机数都是真随机数。

那么ESP32是怎么做到真随机数的呢?

以系统中的热噪声和异步时钟为噪声源可以为随机数发生器提供随机数种子。

具体来说,这些热噪声可以来自 SAR ADC 或高速 ADC 或两者兼有。当芯片的SAR ADC或高速 ADC 工作时, 就会产生比特流,并通过异或 (XOR) 逻辑运算作为随机数种子进入随机数生成器。

不过上面这些我们都不需要知道,我们只需要知道怎么使用就行了。

首先包含头文件。

#include "esp_random.h"

然后我们直接调用下面这个函数就能直接获取随机数发生器的寄存器的32位bit了。

uint32_t esp_random(void)

除了上面这个函数获取32bit随机数之外,我们还可以使用下面的函数获取自己指定位数的随机数。

void esp_fill_random(void *buf, size_t len)

传入存放随机数的地址以及字节长度。

我们一开始就看了随机数发生器的寄存器,它就是32位,那么我们是怎么获取到除了32位之外位数的随机数呢?

我们打开源码就能看到,esp_fill_random本质上还是调用的esp_random,也就是说二者基本上是一样的。

另外产生真随机数的条件就是有噪声作为随机数发生器的随机数种子,因此我们再调用上面函数获取随机数之前还需要保证有随机数种子。

下面三个条件满足任意一个就行了(因为编程指南里的原页面是英文的,下图翻译过后有些小问题,就是原文里的函数链接变成了小方框,但是不要紧,下面我会一一说明)。

第一个条件就是启动WiFi或者是蓝牙。

第二个条件是我们手动开启一个函数。

需要先包含下头文件。

#include "bootloader_random.h"

然后手动开启随机数发生器的熵源。

void bootloader_random_enable(void)

第三个是ESP-IDF的二级引导程序运行,因为在ESP-IDF的二级引导程序运行时会自动调用第二个条件的函数。

那么我们应该做些什么来保证我们拿到的随机数是真随机数呢?

答案是我们什么都不用做。

因为ESP-IDF会自动执行二级引导程序。

所以我们直接获取随机数即可。

另外还有一个函数可以获取到随机数,同样是在这个bootloader_random.h头文件里,但是不推荐使用,只适合在引导加载程序中调用。

void bootloader_fill_random(void *buffer, size_t length)

下面来个小例子简单获取一下随机数。

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_random.h"
#include "bootloader_random.h"

void app_main(void) {
    uint32_t num;
    bootloader_random_enable();
    while (1) {
        num = esp_random();
        printf("random is %ld\t",num);
        bootloader_fill_random(&num,sizeof(num));
        printf("%ld\r\n",num);
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

可以正常获取到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值