欢迎光临
我们一直在努力

ESP32 ESP-IDF 随机数生成器(RNG)详解

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、核心特性

  • 熵源: RNG 的核心是物理噪声源。ESP32 利用其内部电路(如振荡器、放大器)产生的热噪声或半导体噪声等物理现象作为熵源。这些现象本质上是随机的,难以预测或重现。
  • 硬件加速: 随机数的生成过程主要由硬件完成,不依赖于软件算法(如伪随机数算法),因此效率较高,对 CPU 资源占用少。
  • 符合标准: ESP-IDF 提供的 RNG 接口生成的随机数符合 NIST SP 800-90A/B/C 等相关标准的要求,适用于加密、安全等场景。
  • 无需种子: 与软件伪随机数生成器不同,硬件 RNG 不需要用户提供初始种子值。它依靠物理熵源自行启动和运行。
  • 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、重要注意事项

  • 安全性: ESP32 的硬件 RNG 旨在提供密码学意义上的安全随机数。这意味着生成的随机数在计算上应该是不可预测的,适合用于安全关键应用,如生成密钥、初始化向量、挑战值等。
  • 不用于软件 PRNG 种子: 虽然理论上可以用 esp_random() 的结果作为软件伪随机数生成器的种子,但通常不需要这么做。ESP-IDF 提供的标准库函数如 rand()、srand() 在内部已经使用了硬件 RNG 来增强其随机性(具体实现可能因版本而异)。直接使用 esp_random() 或 esp_fill_random() 通常是更高效和安全的选择。
  • 性能: 硬件 RNG 生成速度很快,但并非无限速。在需要极高吞吐量随机数的极端场景下(虽然这在嵌入式系统中很少见),可能需要评估其性能是否满足要求。
  • 密钥派生: 虽然 RNG 生成的字节是随机的,但直接将其作为密钥使用(尤其是长度固定的密钥)可能不够安全。最佳实践是将 RNG 的输出作为熵源,输入到一个密钥派生函数中(如 HKDF、PBKDF2 或 ESP-IDF 提供的 esp_crypto_key_derivation 相关函数)来生成最终使用的密钥。KDF 可以提供额外的保护,如密钥拉伸、添加盐值、上下文绑定等。
  • 6、 总结

    ESP32 的硬件 RNG 是 ESP-IDF 提供的一个强大且易于使用的功能,用于生成高质量的随机数。通过 esp_random() 和 esp_fill_random() 这两个简单的 API,开发者可以方便地获取随机数,用于各种需要不可预测性的场景,特别是安全相关的应用。使用时需注意其安全特性,并遵循密钥管理等安全最佳实践。

    在这里插入图片描述

    赞(0)
    未经允许不得转载:171主机测评 » ESP32 ESP-IDF 随机数生成器(RNG)详解
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址