Fortuna は、Bruce Schneier と Niels Ferguson によって発明され、暗号化での使用を目的とした擬似乱数生成器です。ローマのチャンスの女神フォルトゥナにちなんで名付けられました。
より具体的には、Fortuna は暗号化擬似乱数ジェネレーターのファミリーです。その設計は実装に関して非常に柔軟です。ジェネレーターはいくつかの部分に分かれています。
- シードを受け取ると無限シーケンスを生成するジェネレーター自体
- エントロピーアキュムレータはさまざまなソースからランダムデータをフェッチし、エントロピーが十分である場合に新しいシードをジェネレータに送信します。
- コンピューターが起動するとすぐに数値の生成を開始できるように十分な情報を保存するシード ファイル
ジェネレーターはブロック暗号アルゴリズムに基づいています。 Schneier 氏は、 「Practical Cryptography」の中で、AES、Serpent、または Twofish の使用を提案しています。このアイデアは、暗号化アルゴリズムをカウンターモードで使用することです。つまり、増加するカウンターの値を連続的に暗号化します。ただし、カウンターには有限数の状態があり、したがって生成されるシーケンスも有限であるため、この手順では十分ではありません。このため、暗号化キーは定期的に変更されます。 1 MB を超えるデータが生成されると、キーは自動的に変更されます。キーは各メインクエリの後にも変更されます。
エントロピー アキュムレータは、過度に複雑で安全でないエントロピー推定器を使用せずに、データインジェクション攻撃に耐性を持つように設計されています。いくつかのエントロピーグループを考慮します。各エントロピー ソースは、その情報を異なるグループに均一に分散します。このシステムの背後にある主なアイデアは、毎回グループを変更することで新しいシードを生成することです。より正式には、シードの n 回目の作成中に、 2 k がn を除算する場合にのみグループkが使用されます。言い換えれば、グループk は、合計時間に対して 1/2 kの期間だけ使用されます。 k を増加すると、新しいシードが送信される頻度は減りますが、その一方で、より多くのエントロピーが蓄積されます。
シードの生成は、SHA-256 を使用したグループの 2 つのハッシュによって行われ、この値は暗号化アルゴリズムのキーとして使用されます。
抵抗
攻撃者がシステムに入るすべてのエントロピーのソースを制御できる場合、システムは完全に脆弱になります。この場合、完全に決定論的となり、この仮定に抵抗できるアルゴリズムは存在しません。攻撃者がいくつかのエントロピー ソースをキャプチャすると、エントロピー アキュムレータ内にエントロピーを収集し続ける特定のグループが存在することになります。統計的に準備が整うとすぐに、新しいシードが生成されます。このため、システムはデータ インジェクションに対して耐性がありますが、送信された不正なデータのサイズ、侵害されたソースの数、およびグループの数によっては、回復に時間がかかります。
Fortuna は 32 のグループを使用するため、この制限によりシードが 1秒あたり 10 回を超えて生成されることが防止されます。このままでは、十分なグループがなくなるまでに 13 年かかります。シュナイアーとファーガソンにとってはこの期間で十分と思われる。非常に高い生成レートを必要とする実装の場合は、いつでもグループの数を増やすことができます。

フォルトゥナとノコギリソウの違い
Fortuna は、Schneier、Kelsey、Ferguson によって設計された別のジェネレーターである Yarrow の改良版です。主な違いはエントロピー アキュムレータに関するものです。 Yarrow は、受け取ったエントロピーを決定するために追加のメカニズムを必要とし、2 つのグループのみを使用しました。さらに、使用されたハッシュ関数は、SHA-256 の 2 回の反復ではなく、SHA-1 (Yarrow-160) の 1 回の反復でした。

