CSPRNG【Cryptographically Secure Pseudo Random Number Generator】暗号学的疑似乱数生成器
概要

一般的な擬似乱数生成器は乱雑さが真の乱数に近付くことが重視され、ゲームや統計処理などの用途には問題なく利用できるが、内部の計算式や状態が判明すると、それ以降の出力を割り出すことが可能な場合がある。暗号などの分野でそのまま使うのは危険であり、実際、暗号用途に適さない乱数関数でトークンを生成した結果、内部状態を復元されてアカウントを乗っ取られた被害も報告されている。
これに対しCSPRNGは、出力を真の乱数と計算量的に区別できないようにする性質と、途中までの出力を見ても次の1ビットすら予測できないという性質を満たすように作られている。過去の出力から内部状態を逆算することや、未来の出力を推測することが現実的な計算時間では困難となるよう設計され、暗号システムを安全に運用できる。
乱数の品質は初期値(シード)の品質にも左右される。CSPRNGは起動時や必要に応じて、キーボードの打鍵タイミングやマウスの移動履歴、ハードウェア内部のノイズといった、外部から予測できない現象から得たエントロピーを用いて内部状態を初期化または更新する。乱数値の算出にはAESやChaCha20などの暗号方式、SHA-2やSHA-3などのハッシュ関数が用いられる。
CSPRNGの生成方式は米国立標準技術研究所(NIST)が「NIST SP 800-90」シリーズとして設計指針を策定しており、標準化が進められている。主要なプログラミング言語やオペレーティングシステム(OS)にはCSPRNGを提供する機能が用意されており、Webブラウザの「Web Crypto API」やLinuxが提供する専用のデバイスファイルなどの実装例がよく知られる。開発者が独自に乱数生成の手順を実装すると暗号学的な欠陥が生じやすいため、こうした標準機能を利用することが推奨されている。
必要とされる乱数の性質は用途によって異なる。nonceのように一意性のみで十分な場合もあれば、暗号鍵のように高い無作為性が不可欠な場合もある。ワンタイムパッドのように情報理論的な安全性が求められる用途では、CSPRNGであっても不十分で、真性乱数の生成源が必要とされる。