1 概要

暗号学的に安全乱数生成器は、暗号処理に利用しても予測や再現が極めて困難な乱数を出力する仕組みである。鍵、初期化ベクトル、ノンス、セッション識別子のように、外部から推測されると安全性が損なわれる値の生成に使われる。

この種の生成器では、単に値がばらついて見えるだけでは不十分であり、出力列に規則性があっても実用上の予測ができないことが重要となる。したがって、設計、実装、運用の各段階で安全性が点検される。

1.1 乱数と予測困難性

暗号の文脈でいう乱数は、見かけ上の不規則さではなく、実際に次の値を当てにくい性質を指す。少数の出力や周辺情報が観測されても、次に何が出るかを効率よく推定できないことが求められる。

予測困難性は、統計的な偏りの少なさとは区別される。乱雑に見える系列でも、内部構造が単純であれば攻撃者に読まれる可能性がある。

1.2 暗号用途における要件

暗号用途では、生成値が秘密情報の推測に直結するため、強い安全性が必要になる。鍵素材や初期値が偏っていたり、繰り返し現れたりすると、暗号方式全体が弱体化する。

また、長時間の運用や停止後の再起動でも、同じ結果を容易に再現できない設計が望ましい。初期化時の安全な立ち上がりと、運用中の継続的な品質確保が重視される。

1.3 一般的な擬似乱数生成器との違い

一般的な擬似乱数生成器は、一定の初期値から長い列を効率よく作ることを目的とする。これに対し、暗号学的に安全な生成器は、効率だけでなく逆算の困難さを主眼に置く。

通常の擬似乱数では、出力の一部や初期状態が分かると将来の系列が読まれる場合がある。一方、暗号用途向けでは、そのような情報が得られても実用的に復元できないことが重要である。

2 基本原理

暗号学的に安全な乱数生成は、外部から得た不規則性を取り込み、それを内部状態で加工して出力する。ここでは、どれだけ質の高い素材を集め、どのように状態を保護し、どの程度予測を抑えられるかが中核となる。

2.1 エントロピー

エントロピーは、情報の不確実性や推測のしにくさを表す概念である。乱数生成器では、十分なエントロピーが供給されるほど、初期化や再シードの安全余地が広がる。

2.1.1 エントロピー源

エントロピー源には、入力時刻の揺らぎ、デバイスの物理雑音、割り込みの到着間隔、ユーザー操作のタイミングなどがある。これらは単独では不安定な場合があり、複数の स्रोतを組み合わせることが多い。

理想的には、攻撃者が観測や制御をしにくい要素が用いられる。入力の質が低いと、全体の安全性も下がりやすい。

2.1.2 エントロピー蓄積

収集した不規則性は、そのまま使うのではなく、内部で蓄積して混合されることが多い。こうして情報をまとめることで、偏りをならし、再利用に耐える形へ整える。

蓄積の過程では、量だけでなく独立性も意識される。似た種類の入力ばかりでは、見かけほど強い材料にならない。

2.2 内部状態

内部状態は、生成器が次の出力を作るために保持する秘密の情報である。状態が大きく、更新が適切であるほど、外部からの推定は難しくなる。

2.2.1 状態拡張

状態拡張とは、少量の入力から十分に広い内部表現へ情報を広げることを指す。これにより、ひとつの観測から全体構造を把握されにくくなる。

拡張の際には、単純なコピーではなく、非線形な混合や圧縮を伴うことが多い。結果として、入力と出力の対応が直接読めないようにする。

2.2.2 状態漏えいへの耐性

内部状態の一部が漏れても、全体や過去未来の系列が崩れにくい性質が望ましい。これには、部分情報からの再構成を阻む設計が必要になる。

耐性の高い方式では、漏えい後の更新で古い情報が残りにくい。状態が露出しても被害が限定されるよう、更新規則が工夫される。

2.3 予測不可能性

予測不可能性は、観測済みの情報から次回以降の出力を効率よく当てられない性質である。暗号用途では、この性質が最も重く見られる。

2.3.1 前方安全性

前方安全性は、現在の内部状態が分かっても、将来の出力がすぐに読めないことを意味する。適切な更新と再混合により、先の値を追跡しにくくする。

この性質が弱いと、短時間の侵害で今後の通信や認証が連鎖的に危険になる。したがって、未来の値を独立に保ちやすい設計が求められる。

2.3.2 後方安全性

後方安全性は、現在の状態や出力から過去の値を復元しにくい性質である。履歴がさかのぼられにくいことで、以前に使った秘密値の安全度が保たれる。

完全な逆算不能が理論的に保証されなくても、実用上は再現が困難であればよいとされる。重要なのは、過去の値が後から露見しないことである。

3 設計方式

暗号学的に安全な乱数生成器は、真の乱数源、擬似乱数拡張、またはその併用で構成される。目的は、取得できる外部雑音を十分に強い出力系列へ変換することにある。

3.1 真の乱数生成器との組み合わせ

真の乱数生成器は、物理現象に由来する不確定性を取り出す装置である。これを単独で大量出力に使うより、品質確認や種の供給に用いることが多い。

単純な物理値は偏りや相関を含むことがあるため、そのまま暗号用途に流用するのは危険である。そこで、後段の処理で整形し、使える形にする。

3.2 擬似乱数生成器による拡張

擬似乱数生成器は、少量の秘密種から長い乱数列を効率よく作る。暗号用では、出力が読まれても次の値を逆算しにくい設計が不可欠である。

3.2.1 暗号学的擬似乱数生成器

暗号学的擬似乱数生成器は、出力の予測に対して高い抵抗力を持つ。ブロック暗号、ハッシュ関数、専用の状態更新規則などを利用して構成される。

性能だけでなく、入力の偏りや既知出力への耐性が設計上の焦点になる。短い初期値からでも、十分に広い探索空間へ展開されることが望ましい。

3.2.2 状態更新方式

状態更新方式は、出力ごとに内部情報を変化させる仕組みである。これにより、同じ状態が長く残らず、観測からの追跡が難しくなる。

更新が単純すぎると、連続出力から式が推定される場合がある。複雑さと効率の均衡を取りながら、解析しにくい変化を保つことが重要である。

3.3 ハイブリッド方式

ハイブリッド方式は、物理的な不確実性と擬似乱数拡張を組み合わせる。実際のシステムでは、この方法が最も扱いやすい。

3.3.1 起動時の初期化

起動直後は、まだ十分な材料が集まっていない可能性がある。そこで、外部エントロピーを待ち、初期状態を慎重に整える。

初期化が不十分なまま利用を始めると、再起動直後の値が読まれやすくなる。安全な立ち上がりは運用全体の前提となる。

3.3.2 再シード機構

再シードは、運用中に新しい材料を取り込み、内部状態を更新し直す手続きである。長時間動作や状態劣化への対策として用いられる。

ただし、再シードが雑だと、逆に状態の一貫性を壊したり、低品質な入力を混入させたりする。適切な間隔と入力選別が求められる。

4 実装と運用

理論的に強い設計でも、実装や設定が不適切なら安全性は崩れる。実運用では、システム機能、専用機器、品質監視、利用規則が重要になる。

4.1 オペレーティングシステムの支援機構

多くの環境では、基本的な乱数供給をオペレーティングシステムが担う。アプリケーションは、個別の工夫よりも標準機構の利用が推奨されることが多い。

4.1.1 システム乱数源

システム乱数源は、OSが管理する共有の供給口である。複数の入力を集約し、利用者が安全に参照できる形で提供する。

信頼できる実装では、初期化の状態や再シードの有無が考慮される。利用側は、独自実装を持ち込む前に既存機構の性質を理解すべきである。

4.1.2 乱数プール

乱数プールは、集めた材料を一時的に保持する蓄積領域である。ここでの混合により、個々の入力の癖が全体に見えにくくなる。

プールの設計が弱いと、古い情報が残ったり、外部からの偏りがそのまま反映されたりする。更新と消去の扱いが重要である。

4.2 ハードウェア支援

一部の環境では、専用回路やCPU機能が乱数生成を支援する。これらは性能や供給の安定化に役立つが、単独依存は避けるのが一般的である。

4.2.1 専用乱数回路

専用乱数回路は、熱雑音や発振ゆらぎなどの物理現象を利用する。高い速度で材料を供給できることがあるが、品質の検査が欠かせない。

環境変化や製造差に影響されるため、常に同じ品質とは限らない。出力をそのまま使うより、補正や検証を組み合わせる方が安全である。

4.2.2 プロセッサ内蔵機能

一部のプロセッサには、乱数生成やその種材料を提供する機能が組み込まれている。これにより、システム全体の初期種集めが容易になる。

ただし、内蔵機能の出力特性や保証範囲は方式によって異なる。用途に応じて、仕様に沿った取り扱いが必要である。

4.3 乱数品質の検証

品質検証は、生成物が期待される性質を満たすかを確認する作業である。統計試験だけでは不十分で、実際の利用条件も見る必要がある。

4.3.1 統計的試験

統計的試験は、偏り、相関、繰り返しの有無を調べる。代表的なテスト群は、品質の異常を見つける手掛かりになる。

ただし、統計的に良好でも暗号学的に安全とは限らない。検査結果を過信せず、設計そのものも評価対象に含めるべきである。

4.3.2 実運用上の監視

実運用では、起動時の遅延、出力停止、同一値の連続などを監視する。こうした兆候は、エントロピー不足や故障の前触れになりうる。

監視は故障検知だけでなく、設定ミスの早期発見にも役立つ。異常時に安全側へ倒す仕組みが望ましい。

4.4 安全な利用方法

乱数生成器の安全性は、出力の使い方でも左右される。適切な用途に限定し、使い回しや独自変形を避けることが基本である。

4.4.1 鍵生成への利用

鍵生成では、十分な長さと偏りの少ない素材が必要になる。生成器の不備は、鍵空間を狭め、総当たり攻撃を容易にする。

鍵を作る際は、生成直後の値だけでなく、保存や受け渡しの保護も重要である。乱数の品質は、最終的な鍵管理の一部にすぎない。

4.4.2 ノンスと識別子への利用

ノンスや識別子は、重複しないことが重要で、同時に推測されにくい方が望ましい。単純な連番は扱いやすいが、用途によっては安全余地が不足する。

生成器を適切に用いれば、衝突の回避と秘匿性を両立しやすい。特に認証やセッション管理では、再利用の有無が厳しく問題となる。

5 代表的なアルゴリズム

暗号学的に安全な擬似乱数生成器には、複数の設計系列がある。いずれも、少ない種から強い出力を作ることを目的とするが、内部の作り方は異なる。

5.1 暗号学的擬似乱数生成器

暗号学的擬似乱数生成器は、暗号原理を用いて予測抵抗性を高めた系列である。実装のしやすさ、性能、更新のしやすさの観点から選ばれる。

5.1.1 ブロック暗号系

ブロック暗号系は、暗号ブロックを反復的に処理して乱数を得る方式である。強い既存アルゴリズムを利用できるため、設計の見通しが立てやすい。

一方で、呼び出し方を誤ると安全性が落ちる。初期値やカウンタの管理が重要になる。

5.1.2 ハッシュ関数系

ハッシュ関数系は、入力を要約しつつ一方向性を活用する。状態混合と出力圧縮を兼ねやすく、実装上の扱いも比較的明快である。

ただし、ハッシュ関数の使い方が不適切だと、出力の独立性が損なわれる。内部状態の更新規則と組み合わせて設計する必要がある。

5.1.3 膨張状態系

膨張状態系は、大きな内部状態を保持しながら、逐次的に値を生み出す。状態が広いぶん、観測から全体を推定しにくい利点がある。

その反面、実装の複雑さやメモリ使用量が増えることがある。性能と安全性の折り合いが選定の焦点になる。

5.2 既知の設計上の考慮

設計では、初期化の品質と出力後の耐性が特に重視される。細かな実装差が安全性に直結するため、理論だけでなく運用上の確認も必要である。

5.2.1 初期値の偏り

初期値に偏りがあると、出力系列の一部に偏向が残ることがある。これを避けるには、十分に混合された種を用いる。

初期段階の値をそのまま利用すると、まだ状態が安定していない可能性がある。立ち上がり時の慎重な取り扱いが有効である。

5.2.2 出力予測への耐性

出力予測への耐性は、観測された値から次の値を推定しにくい度合いである。強い方式ほど、観測データの蓄積が役に立ちにくい。

この性質を高めるには、内部状態の更新と秘密保持が欠かせない。単に出力長を増やすだけでは不十分である。

6 攻撃と脆弱性

暗号学的に安全な乱数生成器でも、攻撃や欠陥の影響を受ける。特に、状態の推測、材料不足、実装ミスは重大な問題になりやすい。

6.1 状態推測攻撃

状態推測攻撃は、出力や周辺情報から内部状態を求めようとする試みである。成功すると、以後の系列や過去の一部まで危険にさらされる。

6.1.1 出力観測による推測

攻撃者が連続出力を観測すると、状態更新の規則を逆手に取られる場合がある。とくに設計が単純だと、少数の値から手掛かりが得られやすい。

このため、観測可能な情報だけで全体を再現できない構造が必要になる。見かけの複雑さではなく、解析困難性が本質である。

6.1.2 部分漏えいへの悪用

内部状態の一部が漏れると、残りの部分も連鎖的に推測される危険がある。攻撃者は、断片情報をつなぎ合わせて全体像に近づく。

対策としては、漏えい箇所を局所化し、更新で古い部分を早く無効化することが有効である。再シードも補助手段になる。

6.2 エントロピー不足

エントロピー不足は、生成器に十分な不確実性が集まっていない状態である。起動直後や静かな環境では、とくに起こりやすい。

6.2.1 起動直後の危険性

起動直後は、まだ観測材料が少なく、同じ初期状態に近づきやすい。もしそのまま使うと、複数機器で似た結果が出ることがある。

そのため、初期化が完了するまで出力を抑制する設計が望ましい。安全な起動手順は実装の重要部分である。

6.2.2 低品質な入力の影響

制御しやすい入力や相関の強いデータだけを集めると、見かけほどの不確実性は得られない。低品質な材料は、むしろ誤った安心感を与える。

入力源の多様化と、質の判定が必要である。単一 स्रोतへの依存は避けるのが一般的である。

6.3 実装不備

実装不備は、設計自体が強くても安全性を損なう。再利用や誤用といった運用ミスも、広い意味では不備に含まれる。

6.3.1 乱数の再利用

同じ乱数を複数回使うと、独立性が失われる。鍵、ノンス、識別子の取り違えは、しばしば深刻な事故につながる。

再利用を防ぐには、用途ごとに生成方針を分け、記録管理を明確にする必要がある。使い回しを前提にした設計は避けるべきである。

6.3.2 乱数源の誤用

乱数源の誤用には、適切でないAPIの選択、初期化前の使用、出力の加工不足などがある。これらは、理論上の強さを無効化しやすい。

安全な利用には、文書化された推奨手順に従うことが重要である。独自解釈による変形は、しばしば危険を増やす。

7 標準化と評価

暗号学的に安全な乱数生成器は、実装ごとの差を抑えるために標準化や推奨事項が整備される。評価では、理論的根拠と実務的な再現性の両方が問われる。

7.1 仕様と推奨事項

仕様は、どのような性質を満たすべきかを示す。推奨事項は、実装者が安全な選択をしやすくするための指針である。

7.1.1 選定基準

選定基準には、予測耐性、状態保護、初期化のしやすさ、性能、検証の容易さがある。用途によっては、速度よりも保守性が優先される。

また、既存の標準部品との整合性も重視される。独自方式は、保守や監査の負担を増やしやすい。

7.1.2 実装指針

実装指針では、十分な種の確保、状態更新の保護、初期化完了前の利用回避などが挙げられる。安全な既定値を採ることも一般的である。

文書化された手順に従うことで、環境依存の失敗を減らせる。細部の省略が全体の弱点になりやすい。

7.2 品質評価

品質評価は、生成器が期待通りに働くかを確認する。数学的解析、実測、運用観察を組み合わせることで、より確かな判断ができる。

7.2.1 解析手法

解析手法には、統計検査、形式的検討、攻撃モデルに基づく評価がある。これらは、それぞれ異なる角度から安全性を照らす。

どれか一つで十分とは限らない。複数の観点を併用して、弱点を見落としにくくする。

7.2.2 検証手順

検証手順では、実装の再現試験、境界条件の確認、長期動作の観察が重視される。異常があれば、設計と運用の両面から見直す。

検証は一度きりではなく、更新や移植のたびに行うのが望ましい。環境変化で性質が変わることがあるためである。