ESP32ハードウエア乱数生成

概要

テクニカルマニュアルを読んでいたら、1ページだけの機能があったので調べてみました。無線アンテナから入ってくるノイズを使った乱数生成で、内部の暗号化などのソースとして使われるものみたいです。

一方、通常ではアドレス定義もされていないので使うことはありません。

テクニカルマニュアルの内容

原文

24. Random Number Generator

24.1 Introduction
The ESP32 contains a true random number generator, whose values can be used as a basis for cryptographical operations, among other things.

24.2 Feature
It can generate true random numbers.

24.3 Functional Description
When used correctly, every 32-bit value the system reads from the RNG_DATA_REG register of the random number generator is a true random number. These true random numbers are generated based on the noise in the Wi-Fi/BT RF system. When Wi-Fi and BT are disabled, the random number generator will give out pseudo-random numbers.

When Wi-Fi or BT is enabled, the random number generator is fed two bits of entropy every APB clock cycle (normally 80 MHz). Thus, for the maximum amount of entropy, it is advisable to read the random register at a maximum rate of 5 MHz.

A data sample of 2 GB, read from the random number generator with Wi-Fi enabled and the random register read at 5 MHz, has been tested using the Dieharder Random Number Testsuite (version 3.31.1). The sample passed all tests.

DeepL翻訳

24. 乱数発生器

24.1 はじめに
ESP32 は、真の乱数発生器を内蔵しており、その値を暗号演算の基礎として使用することができます。

24.2 特徴
真の乱数を生成することができます。

24.3 機能説明
正しく使用すると、システムが乱数発生器のRNG_DATA_REGレジスタから読み出す32ビットの値はすべて真の乱数になります。これらの真の乱数は、Wi-Fi/BT RF システムのノイズに基づいて生成されます。Wi-FiとBTが無効になっている場合、乱数発生器は擬似乱数を出力します。

Wi-FiまたはBTが有効な場合、乱数発生器にはAPBクロックサイクル(通常は80MHz)ごとに2ビットのエントロピーが供給されます。したがって、エントロピーを最大にするためには、最大レート5MHzで乱数レジスタを読み出すことをお勧めします。

Wi-Fi を有効にして乱数発生器から読み込んだ 2GB のデータサンプルと、5MHz で読み込んだ乱数レジスタを、Dieharder Random Number Testsuite (バージョン 3.31.1) を使用してテストしました。サンプルはすべてのテストに合格しました。

www.DeepL.com/Translator(無料版)で翻訳しました。

解説

短い文章なのであまり解説が必要ないと思いますが、無線のノイズを使った乱数発生なので、無線を有効にしていないと疑似乱数になってしまうみたいです。生成スピードは周辺機器のクロック(APB)単位で2ビットなので、32ビット生成するのに16クロック必要になります。

CPUクロック(MHz)APBクロック(MHz)暗号生成周期(MHz)暗号生成時間(マイクロ秒)
2408050.2
1608050.2
808050.2
40402.50.4
20201.250.8
10100.6251.6

この情報を整理すると上記の関係になりそうです。一番遅いときでも秒間62.5万回暗号を生成でき、暗号生成時間は1.6マイクロ秒かかります。

2マイクロ秒のウエイトをいれて、毎秒50万回の暗号生成までであればどのCPU周波数でも安全そうですね。

スケッチ例

#include <WiFi.h>

#ifndef DR_REG_RNG_BASE
#define DR_REG_RNG_BASE  0x3ff75144
#endif

uint32_t getESP32Random(){
  delayMicroseconds(2);
  return READ_PERI_REG(DR_REG_RNG_BASE);
}

void setup() {
  Serial.begin(115200);
  delay(100);

  WiFi.begin();
}

void loop() {
  uint32_t rand1 = getESP32Random();
  uint32_t rand2 = getESP32Random();
  uint32_t rand3 = getESP32Random();

  Serial.printf("rand1 = %08X, rand2 = %08X, rand3 = %08X\n", rand1, rand2, rand3);
  delay(1000);
}

アドレスから読み出すだけですので、単純ですね。読み出す前に2マイクロ秒のウエイトを安全のために入れています。

まとめ

とっても便利な機能ですが、使われていない気がします。個人的に使うかと言われても微妙でたぶん使うことはないと思います、、、

コメントする

メールアドレスが公開されることはありません。

管理者承認後にページに追加されます。公開されたくない相談はその旨本文に記載するかTwitterなどでDM投げてください。またスパム対策として、日本語が含まれない投稿は無視されますのでご注意ください。