ESP32 ESP-IDF 随机数生成器(RNG)详解
- 一、源码分享
-
- 1、效果展示
- 2、开发环境搭建
- 3、源码分享
- 二、RNG详解
-
- 1、核心特性
- 2、ESP-IDF 中的 API 使用
- 3、函数详解
- 4、示例代码
- 5、重要注意事项
- 6、 总结

一、源码分享
1、效果展示

2、开发环境搭建
参考我这篇博文:VS Code 在线安装ESP-IDF,ESP32开发环境搭建详细教程
3、源码分享
/*
* SPDX-FileCopyrightText: 2010-2022 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: CC0-1.0
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/projdefs.h"
#include "freertos/task.h"
#include <sys/time.h>
#include "driver/gpio.h"
#include "driver/ledc.h"
#include "esp_timer.h"
#include "esp_task_wdt.h"
#include "esp_adc/adc_cali.h"
#include "esp_adc/adc_oneshot.h"
#include "esp_log.h"
#include "esp_random.h"
uint32_t rng_get_random_num(void)
{
return esp_random();
}
int rng_get_random_range(int min, int max)
{
return esp_random() % (max – min + 1) + min;
}
void app_main(void)
{
while(1)
{
printf("Random number: %ld\\n", rng_get_random_num());
printf("Random number range: %d\\n", rng_get_random_range(1, 100));
vTaskDelay(pdTICKS_TO_MS(500));
}
}
二、RNG详解
ESP32 芯片内部集成了一个基于内部电磁噪声的真随机数发生器。这个 RNG 是 ESP32 的一个硬件特性,用于生成难以预测的随机数序列。在 ESP-IDF 开发框架中,可以通过特定的 API 来访问和使用这个硬件 RNG。
1、核心特性
2、ESP-IDF 中的 API 使用
访问 ESP32 的硬件 RNG 主要通过以下函数:
#include "esp_random.h"
// 生成一个 32 位的随机数
uint32_t esp_random(void);
// 用随机字节填充缓冲区 buf (长度为 len 字节)
void esp_fill_random(void *buf, size_t len);
3、函数详解
uint32_t esp_random(void)
- 功能: 生成并返回一个 32 位(4 字节)的无符号随机整数。
- 返回值: 一个在 [0, UINT32_MAX] 范围内的随机 uint32_t 值。
- 使用场景: 当只需要一个或少量随机数时使用,例如生成随机 ID、随机延时、简单的随机选择等。
void esp_fill_random(void *buf, size_t len)
- 功能: 用随机字节填充用户提供的一段内存缓冲区。
- 参数:
- buf: 指向要填充随机字节的内存缓冲区的指针。
- len: 需要填充的随机字节的长度(以字节为单位)。
- 使用场景: 当需要生成大量随机数据时使用,例如生成加密密钥、初始化向量、随机数令牌、填充安全通信协议的数据包等。
4、示例代码
#include <stdio.h>
#include "esp_random.h"
#include "esp_system.h"
#include "freertos/FreeRTOS.h"
#include "freertos/projdefs.h"
#include "freertos/task.h"
void app_main(void)
{
// 示例 1: 生成单个随机数
uint32_t rand_num = esp_random();
printf("Random number: %u\\n", rand_num);
// 示例 2: 生成随机字节数组
uint8_t random_bytes[16]; // 16字节缓冲区,例如用于AES-128密钥
esp_fill_random(random_bytes, sizeof(random_bytes));
printf("Random bytes: ");
for (int i = 0; i < sizeof(random_bytes); i++) {
printf("%02x ", random_bytes[i]); // 以十六进制打印每个字节
}
printf("\\n");
}
5、重要注意事项
6、 总结
ESP32 的硬件 RNG 是 ESP-IDF 提供的一个强大且易于使用的功能,用于生成高质量的随机数。通过 esp_random() 和 esp_fill_random() 这两个简单的 API,开发者可以方便地获取随机数,用于各种需要不可预测性的场景,特别是安全相关的应用。使用时需注意其安全特性,并遵循密钥管理等安全最佳实践。





