乱数に関する備忘録

# 背景
乱数に関して調査した結果を、備忘録として残す。

# NIST SP800-90A
[出典]

https://nvlpubs.nist.gov/nistpubs/specialpublications/nist.sp.800-90ar1.pdf

米国国立標準技術研究所（NIST）が発行した暗号用途向けの擬似乱数生成器（DRBG: Deterministic Random Bit Generator）に関する標準規格

NIST SP 800-90Aでは、以下の3つのDRBGメカニズムが定義されている：
・Hash DRBG:
ハッシュ関数（例：SHA-256）を基盤としたDRBG。
高速かつ柔軟で、広範な用途に適している。

・HMAC DRBG:
HMAC（ハッシュベースのメッセージ認証コード）を基盤としたDRBG。
ハッシュ関数よりも強力な認証機能を提供し、セキュリティが高い。

・CTR DRBG:
AES（Advanced Encryption Standard）ブロック暗号のカウンタモード（CTRモード）を使用して擬似乱数を生成する。
初期シードから計算によって乱数列を生成するため、同じシードを使用すれば同じ乱数列が再現可能。


# AIS20/31
[出典]
[AIS20/31 2025年1月 First release](https://www.bsi.bund.de/SharedDocs/Downloads/EN/BSI/Publications/Studies/Zufallszahlenerzeugung_Browser/Zufallszahlenerzeugung_Browser.pdf?__blob=publicationFile&v=4)

[AIS20/31 2022年9月 ドラフト版](https://www.bsi.bund.de/SharedDocs/Downloads/EN/BSI/Certification/Interpretations/AIS_31_Functionality_classes_for_random_number_generators_e.pdf?__blob=publicationFile&v=7)

[AIS20/31 技術文書(プレゼンテーション)](https://www.nist.gov/system/files/documents/2021/05/28/BSI%20Update-Schindler.pdf)

[AIS20/31 2011年版 公式補足資料](https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Zertifizierung/Interpretationen/AIS_31_Functionality_classes_for_random_number_generators_e.pdf?__blob=publicationFile&v=2)


AIS 20/31は、ドイツの連邦情報セキュリティ局（BSI）が策定した乱数生成器の評価基準およびガイドライン。
特に暗号用途における乱数生成の品質を保証するために設計されている。
この基準は、乱数生成器が満たすべき機能要件や統計的テスト手法を定義し、安全性と信頼性を評価する枠組みを提供する。

AIS 20/31は、以下の2つの主要なカテゴリに分かれている：
AIS 20: 決定論的乱数生成器（DRBG: Deterministic Random Bit Generator）の評価基準。
AIS 31: 真性乱数生成器（TRNG: True Random Number Generator）の評価基準。　

AIS20/31では以下のようにFunctionality classesが定義されている。
![スクリーンショット 2025-04-05 20.42.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/97ffa872-4af1-40e8-a94b-d5294535392b.png)

DRG.1とPTG.1は最新の仕様では、現代の暗号的要件を満たさない・安全性が不十分であるため、廃止されている。
青字になっているDRG.3, DRG.4, PTG.3, NTG.1は、推奨される乱数生成器のクラスが示されている。

:::note info
AIS 20/31は、乱数生成器の品質と安全性を評価するための基準が明記されている。
具体的な乱数生成器そのものを設計・定義されている訳ではない。
開発者や評価者は、この基準に従って既存または新規の乱数生成器を設計・評価する。
:::


## セキュリティ特性
### 前方秘匿性（Forward Secrecy）
現在または過去の出力値が知られても、それらの情報を基に将来の出力値を計算や推測ができないことを保証する。

### 後方秘匿性（Backward Secrecy）
現在または将来の出力値の知識から、実用的な計算量で過去の出力値を導出できないことを保証する。

### 強化された前方秘匿性（Enhanced Forward secrecy）
* 現在または過去の秘密情報が漏洩しても、未来の通信内容が保護されること
* 通常の前方秘匿性に加えて、乱数生成器や鍵交換プロトコルが設計上さらに高度な安全性を提供する場合に適用される


### 強化された後方秘匿性（Enhanced backward secrecy）
乱数生成器（RNG）の現在の内部状態が漏洩しても、過去の出力値を推測できないことを保証する特性。これにより、攻撃者が現在の状態を取得しても過去の暗号操作（例：鍵生成）を逆算できない。
※「バックトラッキング耐性（backtracking resistance）：NIST SP800-90の要件


## AIS20:決定論的乱数生成器（DRBG: Deterministic Random Bit Generator）の評価基準

AIS 20の機能クラスは、決定論的乱数生成器（DRNG: Deterministic Random Number Generator）に関する評価基準を定義しており、以下のような4つの主要なクラスに分類されている。


* DRG.1
基本的な決定論的乱数生成器。
前方秘匿性（forward secrecy）が保証される。
主に暗号用途で使用されるが、セキュリティ要件は比較的低い。
* DRG.2
DRG.1の機能に加え、後方秘匿性（backward secrecy）が追加される。
より高度な暗号用途に適している。
* DRG.3
DRG.2の機能に加え、強化された後方秘匿性（enhanced backward secrecy）が保証される。
セキュリティ要件がさらに高く、重要な暗号プロトコルで使用される。
* DRG.4
DRG.3の機能に加え、強化された前方秘匿性（enhanced forward secrecy）が保証される。
ハイブリッド型DRNGを使用し、高度なセキュリティが求められる場面で使用される

## AIS31:真性乱数生成器（TRNG: True Random Number Generator）の評価基準
AIS 31では、真性乱数生成器（TRNG）を以下の3つの機能クラスに分類される。

* PTG.1（Physical True Generator 1）: 物理的なエントロピー源（例：熱ノイズ、量子現象）を使用するが、後処理（post-processing）を行わない


* PTG.2: エントロピー源から得られるデータを後処理し、統計的欠陥を補正する。暗号鍵やノンス生成に適している
後処理：統計的欠陥を補正するためのアルゴリズムを適用（例：XOR、線形フィルタ）


* PTG.3: PTG.2と同様だが、さらに高度な安全性要件を満たす
後処理：暗号学的に安全な後処理を適用（例：SHA-256ハッシュ、AES暗号化）
エントロピー源の欠陥を暗号的に補正し、出力の予測不可能性を強化

## Hybrid DRNG（ハイブリッド決定論的乱数生成器）

* 基本構造: シード（初期値）に加えて、外部からの入力値（追加のエントロピー源）を受け入れる決定論的乱数生成器（DRNG）
* 動作原理:
シードに基づく擬似乱数生成アルゴリズム（例：CTR_DRBG）を使用
外部入力値（例：物理エントロピー源からの乱数）を継続的に取り込み、内部状態を更新
出力の再現性: 同一のシードと同一の外部入力値が与えられれば、出力列は同一になる。
* 目的
エントロピーの強化: シードのみに依存する従来のDRNGに比べ、外部エントロピーを追加することで予測不可能性を高めます
前方秘匿性の向上: 外部入力値を定期的に取り込むことで、シードが漏洩しても過去の出力を保護します

## Hybrid PTRNG（ハイブリッド物理的真性乱数生成器）
* 基本構造: 物理エントロピー源（例：熱雑音）に加え、暗号的な後処理アルゴリズムを適用する物理的真性乱数生成器（PTRNG）。
* 動作原理:
物理エントロピー源から得た「生の乱数」を、暗号アルゴリズム（例：SHA-256）で後処理。
メモリ（内部状態）を使用し、出力列の計算的複雑性を高めます。
* 目的: 物理エントロピー源の欠陥（例：エントロピー不足）を補い、出力の暗号学的強度を保証します。

# 具体例
## mbedTLS

参照先：

https://mbed-tls.readthedocs.io/projects/api/en/development/api/file/ctr__drbg_8h/


https://arm-software.github.io/CMSIS-mbedTLS/latest/group__rng__module.html


https://docs.silabs.com/d/platform-security/4.4.1/rng-module

## mbedTLSの乱数生成器仕様
NIST SP800-90A準拠のCTR_DRBGアルゴリズムを採用し、擬似乱数を提供する。
外部エントロピー源としてハードウェアTRNGなどが利用可能であり、暗号用途で求められる安全性と予測不可能性を確保している。
また、再シード機能やスレッド安全性によって柔軟な運用が可能。

* アルゴリズム:
MbedTLSは、NIST SP800-90Aに準拠したCTR_DRBG（Counter-mode Deterministic Random Bit Generator）を使用する。
ブロック暗号のカウンタモードを基盤とした擬似乱数生成器。

* 暗号方式:
デフォルトではAES-256を使用。
コンパイル時にオプションを有効化することでAES-128も選択可能（MBEDTLS_CTR_DRBG_USE_128_BIT_KEY）

* エントロピー源:
外部エントロピー源が必要であり、mbedtls_entropy_func()がその役割を果たす。

* セキュリティ強度
AES-256の場合、セキュリティ強度は256ビット。
AES-128の場合、セキュリティ強度は128ビット。
初期シード値（エントロピー）の長さは、AES-256では32バイト以上、
AES-128では16バイト以上が必要

* リシード機能
CTR_DRBGは一定回数の乱数生成後に自動的に再シードします。
予測抵抗性（Prediction Resistance）：
MBEDTLS_CTR_DRBG_PR_ON: 予測抵抗性を有効化。
MBEDTLS_CTR_DRBG_PR_OFF: 予測抵抗性を無効化（デフォルト）。
・有効化時（PR_ON）:
乱数生成前に必ずエントロピー源から新しいデータを収集し、内部状態を更新します。
再シード頻度が増加するため、安全性は向上するが、エントロピー収集に伴うオーバーヘッドがある。
・無効化時（PR_OFF）:
再シードは一定回数（デフォルト：2^48回）の乱数生成後にのみ行われる。
オーバーヘッドは低減されるが、内部状態が漏洩した場合に将来の出力が危殆化するリスクあり

## 例：RH850 乱数生成器(HSM)と、mbedTLSの組み合わせ
参照：

https://site.eettaiwan.com/events/iovev2018/download/EV-10_Renesas.pdf#:~:text=true%20random%20number%20generator%20(TRNG)

https://www.renesas.com/ja/document/apn/1200-true-random-number-generator-hardware


* ICU-Sの乱数生成器の特性：
** ICU-SはAIS 31準拠のPTG.1クラス相当の真性乱数生成器（TRNG）を内蔵しているが、真性乱数をシードにした決定論的乱数生成器（DRBG）が利用される
** ICU-SのDRBGはEVITA Light規格（EVITA light）に準拠し、基本的な前方秘匿性（forward secrecy）を提供しますが、高度な後方秘匿性（backward secrecy）は保証されない。

* mbedTLS CTR_DRBGの動作:
mbedTLSのCTR_DRBGはNIST SP800-90A準拠のDRG.3クラスに該当し、以下の特性を持つ：
・強化された後方秘匿性: 内部状態が漏洩しても過去の出力を保護。
・予測抵抗性: 定期的なリシードによりエントロピーを補充。

結論：
（高品質なシード + 定期的なリシード + ICU-Sの出力に対する暗号後処理）が行われた場合、mbedTLSの出力乱数はDRG.3クラスとして評価される可能性が高い。
DRG.3であれば、暗号鍵生成やノンス生成などの高セキュリティ用途に適合。
![スクリーンショット 2025-04-05 22.51.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/8b94318f-f463-40b4-a7a6-81943610a2ca.png)