(57)【要約】  暗号的に安全な擬似乱数生成器は、シードを与えるエントロピーの１つ以上の予測不可能な源を得るように構成されている。数生成器の現在の内部状態は、現在の内部状態とシードとの関数として修正され、エントロピーを蓄積する。修正された内部状態は、内部状態とシードとに対して非線形フィードバック シフトレジスタの動作を使用することによって得ることができる。次に、擬似乱数は、数生成器の修正された内部状態に基づいて生成される。エントロピーの１つ以上の予測不可能な源は、シードに結合され得る。数生成器の内部状態は、１つ以上の予測不可能な源および現在の内部状態から得た追加のシードを用いて、連続的に修正され得る。さらに、数生成器の内部状態は、呼び出しアプリケーションから受信した新しいシードを用いて、オンデマンドで修正され得る。【選択図】      図１
2009506438.tif 000002
【特許請求の範囲】
【請求項１】
安全な擬似乱数生成器を操作する方法であって、
エントロピーの１つ以上の予測不可能な源を得て、シードを与えることと、
数生成器の現在の内部状態とシードとの関数として内部状態を修正することによって、数生成器の内部状態においてエントロピーを蓄積することと、
数生成器の修正された内部状態に基づいて、擬似乱数を生成することとを含む方法。
【請求項２】
修正された内部状態は、現在の内部状態とシードとに対して非線形フィードバック シフトレジスタの動作を使用することによって得られる請求項１記載の方法。
【請求項３】
エントロピーの１つ以上の予測不可能な源をシードに結合することをさらに含む請求項１記載の方法。
【請求項４】
数生成器によって生成された擬似乱数である初期化シードを、数生成器のシャットダウン時に記憶することと、
数生成器のスタートアップ時に、記憶されている初期化シードを用いて、数生成器のスタートアップの内部状態を初期化することとをさらに含む請求項１記載の方法。
【請求項５】
初期化シードはセキュア ファイル システムに記憶され、
数生成器のスタートアップの内部状態を初期化する前に、初期化シードの完全性が損なわれているかどうかを判断することと、
記憶されている初期化シードの完全性が損なわれているときは、別の予測不可能な源を使用して、数生成器のスタートアップの内部状態を初期化することとをさらに含む請求項４記載の方法。
【請求項６】
１つの暗号プリミティブオペレーションを使用し、数生成器の修正された内部状態を得て、擬似乱数を生成する請求項１記載の方法。
【請求項７】
１つの暗号プリミティブオペレーションは、２進ワード演算、一定のオフセットを有するビットシフト演算、またはテーブル検索の何れか１つを含む請求項６記載の方法。
【請求項８】
１つ以上の予測不可能な源から数生成器に連続的に再シーディングし、数生成器の内部状態を変更することをさらに含む請求項１記載の方法。
【請求項９】
予測不可能な源は、量子化可能な情報をもつ物理的な源を含む請求項８記載の方法。
【請求項１０】
呼び出しアプリケーションから受信した新しいシードを用いて数生成器に再シーディングし、数生成器の内部状態を変更することをさらに含む請求項８記載の方法。
【請求項１１】
安全な擬似乱数生成器は、非線形ＳＯＢＥＲ構造をもつ請求項１記載の方法。
【請求項１２】
修正された内部状態は、
状態レジスタの現在の内容との排他的論理和演算によって、数生成器の状態レジスタにシードをロードすることと、
複数の状態レジスタのワードシフトされた内容を非線形関数に供給して、結果を得ることと、
その結果と１つ以上の状態レジスタの１つとの間で排他的論理和演算を行って、フィードバックの数を得ることと、
第１の状態レジスタから第２の状態レジスタへ内容をシフトし、第３の状態レジスタにフィードバックの数をロードすることによって１つ以上の状態レジスタを修正することとによって得られる請求項１１記載の方法。
【請求項１３】
１つ以上の状態レジスタが、再シーディング動作間でシフトされる回数のカウンタを維持することと、
カウンタに基づいて、１つ以上の状態レジスタの１つを修正することとをさらに含む請求項１記載の方法。
【請求項１４】
擬似乱数が生成されるたびに変わる間隔カウンタを維持することと、
１つ以上の予測不可能な源から数生成器に再シーディングし、間隔カウンタによって定義された間隔でのみ、数生成器の内部状態を変更することとをさらに含む請求項１記載の方法。
【請求項１５】
システム時間を用いて、間隔カウンタによって定義された間隔で数生成器に再シーディングすることをさらに含む請求項１４記載の方法。
【請求項１６】
シードが、少なくとも１２８ビット長であり、数生成器の内部状態が、１８ワードサイズのレジスタである請求項１記載の方法。
【請求項１７】
暗号的に安全な数生成器であって、
シード情報の１つ以上の予測不可能な源を得て、シードを与えるように構成されたシードローダと、
数生成器の内部状態を記憶する複数の状態レジスタとを含み、シードローダは、状態レジスタの現在の内容とシードとに基づいて状態レジスタに再びシードを与え、数生成器の内部状態を修正し、エントロピーを蓄積し、
数生成器の修正された内部状態に基づいて、擬似乱数を生成するように構成された擬似乱数生成器をさらに含む、暗号的に安全な数生成器。
【請求項１８】
修正された内部状態は、状態レジスタの内容とシードとに対して非線形フィードバック シフトレジスタの動作を使用することによって得られる請求項１７記載の数生成器。
【請求項１９】
擬似乱数生成器は、
数生成器のシャットダウン時に、初期化シードを生成し、
初期化シードを記憶するようにさらに構成されている請求項１７記載の数生成器。
【請求項２０】
シードローダは、数生成器の再始動時に、記憶されている初期化シードを用いて複数の状態レジスタを初期化するようにさらに構成されている請求項１９記載の数生成器。
【請求項２１】
シードローダは、
１つ以上の予測不可能な源から得た新しいシードを複数の状態レジスタに連続的にロードするようにさらに構成されている請求項１７記載の数生成器。
【請求項２２】
予測不可能な源は、量子化可能な情報をもつ物理的な源を含む請求項１７記載の数生成器。
【請求項２３】
シードローダは、
呼び出しアプリケーションから得た新しいシードを複数の状態レジスタへロードするようにさらに構成されている請求項１７記載の数生成器。
【請求項２４】
１つの暗号プリミティブオペレーションは、状態レジスタに再びシードを与え、擬似乱数を生成するのに使用される請求項１７記載の数生成器。
【請求項２５】
シードローダ、複数の状態レジスタ、および擬似乱数生成器は、非線形ＳＯＢＥＲ構造として構成される請求項１７記載の数生成器。
【請求項２６】
エントロピーの１つ以上の予測不可能な源を得て、シードを与える手段と、
数生成器の現在の内部状態とシードとの関数として内部状態を修正することによって、数生成器の内部状態においてエントロピーを蓄積する手段と、
数生成器の修正された内部状態に基づいて、擬似乱数を生成する手段とを含む数生成器。
【請求項２７】
エントロピーの１つ以上の予測不可能な源をシードに結合する手段をさらに含む請求項２６記載の数生成器。
【請求項２８】
数生成器によって生成された擬似乱数である初期化シードを、数生成器のシャットダウン時に記憶する手段と、
数生成器のスタートアップの内部状態を初期化する前に、初期化シードの完全性が損なわれているかどうかを判断する手段と、
記憶されている初期化シードの完全性が損なわれているときは、別の予測不可能な源、
そうでなければ、記憶されている初期化シード、の何れか一方を用いて、数生成器のスタートアップの内部状態に再びシードを与える手段とをさらに含む請求項２６記載の数生成器。
【請求項２９】
エントロピーの１つ以上の予測不可能な源から得た追加のシードを用いて現在の内部状態を連続的に修正する手段と、
呼び出しアプリケーションから受信した新しいシードを用いて現在の内部状態をオンデマンドで修正する手段とをさらに含む請求項２６記載の数生成器。
【請求項３０】
エントロピーの１つ以上の予測不可能な源からシードを得て、
現在の内部状態とシードとの関数として数生成器の内部状態を修正し、数生成器にエントロピーを蓄積し、
数生成器の修正された内部状態に基づいて、擬似乱数を生成するように構成された処理デバイスと、
数生成器の内部状態を記憶する１つ以上の内部状態レジスタを含むメモリデバイスとを含む処理回路。
【請求項３１】
処理回路は、
数生成器によって生成された擬似乱数である初期化シードを、数生成器のシャットダウン時にメモリデバイスに記憶し、
数生成器のスタートアップの内部状態を初期化する前に、初期化シードの完全性が損なわれているかどうかを判断し、
記憶されている初期化シードの完全性が損なわれているときは、別の予測不可能な源、
そうでなければ、記憶されている初期化シード、の何れか一方を用いて、数生成器のスタートアップの内部状態に再びシードを与えるようにさらに構成されている請求項３０記載の処理回路。
【請求項３２】
処理回路は、
エントロピーの１つ以上の予測不可能な源から追加のシードを連続的に得て、数生成器の内部状態を修正し、
呼び出しアプリケーションから受信した新しいシードに基づいて、数生成器の内部状態を修正するようにさらに構成されている請求項３０記載の処理回路。
【請求項３３】
処理回路は、
現在の内部状態とシードとに基づいて、１つの暗号プリミティブオペレーションと非線形フィードバック関数とを使用することによって、内部状態を修正するようにさらに構成されている請求項３０記載の処理回路。
【請求項３４】
擬似乱数を生成する１つ以上の命令をもつ機械読み出し可能媒体であって、命令は、プロセッサによって実行されたときに、プロセッサに、
エントロピーの１つ以上の予測不可能な源からシードを得ることと、
現在の内部状態とシードとの関数として、数生成器の内部状態を修正し、数生成器にエントロピーを蓄積することと、
数生成器の修正された内部状態に基づいて、擬似乱数を生成することとを行わせる機械読み出し可能媒体。
【請求項３５】
プロセッサによって実行されたときに、プロセッサに、
現在の内部状態とシードとに基づいて、１つの暗号プリミティブオペレーションと非線形フィードバック関数とを使用することによって、内部状態を修正することを行わせる１つ以上の命令をさらにもつ請求項３４記載の機械読み出し可能媒体。
【請求項３６】
プロセッサによって実行されたときに、プロセッサに、
シード情報の１つ以上の予測不可能な源から追加のシードを連続的に得て、数生成器の内部状態を修正することと、
呼び出しアプリケーションから受信した新しいシードに基づいて、数生成器の内部状態を修正することとを行わせる１つ以上の命令をさらにもつ請求項３４記載の機械読み出し可能媒体。
【発明の詳細な説明】
【発明の分野】
【０００１】
米国特許法第１１９条のもとでの優先権の主張
本特許出願は、２００５年８月２４日に出願され、本発明の譲受人に譲渡され、参照によって本明細書に明示的に取り入れられる仮出願第６０／７１１，１４８号（“Cryptographically Secure Pseudo-Random Number Generator”）に対して優先権を主張している。
【０００２】
本発明は、暗号法（cryptography）、より具体的には、電子デバイスにおける擬似乱数の安全な(secure)生成に関する。
【発明の背景】
【０００３】
乱数の生成は、多くの応用を有し、例えば、暗号使用（cryptographic use）（例えば、暗号化および完全性の保護に使用される鍵、セキュリティプロトコルに使用されるナンス（nonce）、等）を含む。真の乱数は、平均よりも高い確率で予測することが不可能である。現実の世界では、完全な乱数源を得ることは非常に困難である。
【０００４】
回路部品からの熱雑音のような物理的な源（physical source）は、ときどき、非常に良いランダムな出力を生成する。しかしながら、物理的な源は外部干渉にさらされ、これは出力に相当なバイアスを負わせ得る。さらに、物理的な源は、それが新しいエントロピー(ランダム性)を与えることができる速さにおいて制限される。多くの応用は、乱数を長時間待つことができない。さらに、ハードウェア依存の生成器は、ときどき、長い期間の後で故障し、そのような場合に、非常に悪い乱数を生成する。
【０００５】
擬似乱数を生成する確定的アルゴリズムを使用する擬似乱数生成器(pseudo-random number generator, PRNG）が、しばしば使用される。ＰＲＮＧは、非常に高速で数を生成することができる。シード（seed）と呼ばれるランダムな入力を与えられると、非常に長い擬似乱数列を確定的に生成することができる。このシードについての知識がないと、生成器とランダムな源とを区別するのは実行不可能（infeasible）であるか、または非常に困難である。利用可能な多くのＰＲＮＧがある一方で、大部分はセキュリティの応用のために設計されていない。ＰＲＮＧは確定的アルゴリズムを使用するので、それらはハッキングにさらされ、そのためにＰＲＮＧのセキュリティを弱める。例えば、線形合同生成器（linear congruential generator）は、ＰＲＮＧとして広く使用されているが、短い出力列が解析された後で壊され得る。
【０００６】
暗号の応用では、通常、初期化ベクトル、鍵、ナンス（nonce）、ソルト（salt）、等に“ランダムな（random）”数を使用する。一般に、暗号的に安全なＰＲＮＧ(cryptographically secure PRNG, CSPRNG)は、ランダムビット列からその出力を区別することが実行不可能であるような安全なやり方で、予測不可能な入力を用いてシードを与えられる（seed）。本明細書で定義されているように、ＣＳＰＲＮＧは、普通のＰＲＮＧの全ての特性をもち、さらに、少なくとも２つの他の特性をもつ。これらの特性の１つは、“次のビットの試験（next bit test）”と呼ばれ、生成器から生成されたｍビットの列を与えられたとき、実行可能な方法では、（ｍ＋１）番目のビットを、２分の１よりも相当に高い確率で予測できないことを示す。第２の特性は、“悪質なシーディングに対する耐性（malicious seeding resistance）”と呼ばれ、攻撃が、一定期間の間ＣＳＰＲＮＧへの入力を全てまたは部分的に制御することができても、ＣＳＰＲＮＧからの任意のランダムな出力を予測または再生することが依然として実行不可能であることを示す。
【０００７】
擬似乱数生成方式は、ＣＳＰＲＮＧにおいて比較的に直接的（straightforward）である。これは、例えば、カウンタモードまたは出力フィードバックモードで実行されるブロック暗号、シードを暗号鍵として使用するストリーム暗号、またはハッシングの入れ子構造(nested structure)であり得る。ＣＳＰＲＮＧの設計における複雑な部分は、ＣＳＰＲＮＧにシードを与える(seed)、および再びシードを与える(reseed)やり方である。再シーディング(reseeding)は、以前にシードを与えられたＣＳＰＲＮＧの順序論理（sequential logic）を、新しいシードを用いて更新するのに使用されるプロセスである。このような再シーディングは、確定的数生成アルゴリズムを壊す（break）のをより困難にする。
【０００８】
多数の標準化されたＣＳＰＲＮＧの設計、例えば、ＦＩＰＳ １８６−２、ＡＮＳＩ Ｘ９．１７−１９８５ Ａｐｐｅｎｄｉｘ Ｃ、ＡＮＳＩ Ｘ９．３１−１９９８ Ａｐｐｅｎｄｉｘ Ａ．２．４、およびＡＮＳＩ Ｘ９．６２−１９９８ Ａｎｎｅｘ Ａ．４が存在する。都合の悪いことに、これらの設計の多くは、ある環境下では十分ではない。例えば、ＡＮＳＩ Ｘ９．１７のＰＲＮＧの２つの設計の欠点は、Ｊ．Ｋｅｌｓｅｙ、他による文献（Fast Software Encryption, 5th International Workshop Proceedings, Springer-Verlag, 1998）において確認（identify）されている。
【０００９】
ヤロー（Yarrow）およびフォーチュナ（Fortuna）は、２つの周知のＣＳＰＲＮＧの設計である。文献(“Yarrow-160: Notes on the Design and Analysis of the Yarrow Cryptographic Pseudorandom Number Generator”, J. Kelsey, B. Schneier, およびN. Ferguson著, Sixth Annual Workshop on Selected Areas in Cryptography, Springer Verlag, 1999年8月、並びに“Practical Cryptography”, N. Ferguson およびB. Schneier著,Wiley発行, 2003年)参照。
【００１０】
ヤローおよびフォーチュナの両者は、エントロピーの蓄積のための複雑な方式にサポートされて再シーディングを制御する。最も速いエントロピー プールの源が準備できたとき、ヤローは、再シーディングのためのエントロピーを評価する具体的な方法を指定せず、一方でフォーチュナは、システムに周期的に再びシードを与える。これらの両者は、擬似乱数生成のためにカウンタモードでブロック暗号を使用し、再シーディングのためにハッシュアルゴリズムを拡張的に使用する。カウンタモードにおけるブロック暗号および再シーディングのためのハッシュアルゴリズムの使用は、計算上コスト高であり、時間がかかる。
【００１１】
したがって、より良い、複雑さをより軽減し、および／またはより効率的な擬似乱数生成器が必要とされている。
【発明の概要】
【００１２】
安全な擬似乱数生成器を操作する方法が与えられる。方法は、（１）エントロピーの１つ以上の予測不可能な源を得て、シードを与えることと、（２）数生成器の現在の内部状態とシードとの関数として内部状態を修正することによって、数生成器の内部状態においてエントロピーを蓄積することと、（３）数生成器の修正された内部状態に基づいて、擬似乱数を生成することとを含む。修正された内部状態は、現在の内部状態とシードとに対して非線形フィードバック シフトレジスタの動作を使用することによって得ることができる。エントロピーの１つ以上の予測不可能な源は、シードに結合され得る。
【００１３】
初期化シードは、数生成器のシャットダウン時に記憶され得る。初期化シードは、数生成器によって生成された擬似乱数である。次に、数生成器のスタートアップの内部状態は、数生成器のスタートアップ時に、記憶されている初期化シードを用いて初期化することができる。初期化シードは、セキュア ファイル システム（secure file system）に記憶されている。数生成器のスタートアップの内部状態の初期化前に、初期化シードの完全性が損なわれているかどうかについて判断される。記憶されている初期化シードの完全性が損なわれているときは、別の予測不可能な源を使用して、数生成器のスタートアップの内部状態を初期化する。
【００１４】
１つの暗号プリミティブオペレーション（cryptographic primitive operation）が、数生成器の修正された内部状態を得て、擬似乱数を生成するのに使用される。１つの暗号プリミティブオペレーションは、２進ワード演算、一定のオフセットを有するビットシフト演算、またはテーブル検索（table lookup）の何れか１つであり得る。
【００１５】
数生成器は、１つ以上の予測不可能な源から連続的に再びシードを与えられ、数生成器の内部状態を変更し得る。予測不可能な源は、量子化可能な情報をもつ物理的な源を含む。さらに、数生成器は、呼び出しアプリケーションから受信した新しいシードを用いて再びシードを与えられ、数生成器の内部状態を変更し得る。
【００１６】
数生成器の修正された内部状態は、（１）１つ以上の状態レジスタの現在の内容との排他的論理和演算によって、数生成器の１つ以上の状態レジスタにシードをロードすることと、（２）複数の状態レジスタのビットシフトされた内容を非線形関数に供給し、結果を得ることと、（３）結果と１つ以上の状態レジスタの１つとの間で排他的論理和演算を行って、フィードバックの数を得ることと、（４）第１の状態レジスタから第２の状態レジスタへ内容をシフトし、第３のレジスタにフィードバックの数をロードすることによって１つ以上の状態レジスタを修正することとによって得ることができる。
【００１７】
別の特徴は、１つ以上の状態レジスタが再シーディング動作間でシフトされる回数のカウンタを維持する。次に、１つ以上の状態レジスタの１つは、カウンタに基づいて修正される。
【００１８】
追加の特徴は、擬似乱数が生成されるたびに変更する間隔カウンタ（interval counter）を維持する。数生成器は、１つ以上の予測不可能な源から再びシードを与えられ、間隔カウンタによって定義された間隔においてのみ、数生成器の内部状態を変更する。数生成器は、システム時間を用いて、間隔カウンタによって定義された間隔で再びシードを与えられ得る。シードは、少なくとも１２８ビット長であり、数生成器の内部状態は、１８ワードサイズのレジスタである。
【００１９】
別の実施形態は、暗号的に安全な数生成器であって、（１）シード情報の１つ以上の予測不可能な源を得て、シードを与えるように構成されたシードローダと、（２）数生成器の内部状態を記憶する複数の状態レジスタとを含み、シードローダは状態レジスタの現在の内容とシードとに基づいて、状態レジスタに再びシードを与え、数生成器の内部状態を修正し、エントロピーを蓄積し、（３）数生成器の修正された内部状態に基づいて、擬似乱数を生成するように構成された擬似乱数生成器をさらに含む、暗号的に安全な数生成器を与える。修正された内部状態は、状態レジスタの内容とシードとに対して非線形フィードバック シフトレジスタの動作を使用することによって得られる。擬似乱数生成器は、（１）数生成器のシャットダウン時に初期化シードを生成し、（２）初期化シードを記憶するようにさらに構成され得る。シードローダは、数生成器の再始動時に、記憶されている初期化シードを用いて、複数の状態レジスタを初期化するようにさらに構成され得る。シードローダは、１つ以上の予測不可能な源から得た追加のシードを用いて、複数の状態レジスタを連続的に修正するようにさらに構成され得る。予測不可能な源は、量子化可能な情報をもつ物理的な源を含み得る。
【００２０】
シードローダは、さらに、呼び出しアプリケーションから受信した新しいシードを用いて、複数の状態レジスタをオンデマンドで修正し得る。１つの暗号プリミティブオペレーションは、状態レジスタに再びシードを与え、擬似乱数を生成するのに使用され得る。
【００２１】
別の実施は、（１）エントロピーの１つ以上の予測不可能な源からシードを得て、（２）数生成器の内部状態を、現在の内部状態とシードとの関数として修正し、数生成器にエントロピーを蓄積し、（３）数生成器の修正された内部状態に基づいて、擬似乱数を生成するように構成された処理デバイスを含む処理回路を与える。処理回路は、数生成器の内部状態を記憶する１つ以上の内部状態レジスタを含むメモリデバイスをさらに含み得る。処理回路は、（１）数生成器によって生成された擬似乱数である初期化シードを、数生成器のシャットダウン時にメモリデバイスに記憶し、（２）数生成器のスタートアップの内部状態を初期化する前に、初期化シードの完全性が損なわれているかどうかを判断し、（３）（ａ）記憶されている初期化シードの完全性が損なわれているときは、別の予測不可能な源を用いて、（ｂ）そうでなければ、記憶されている初期化シードを用いて、数生成器のスタートアップの内部状態に再びシードを与えるようにさらに構成され得る。処理回路は、（１）シード情報の１つ以上の予測不可能な源から得た追加のシードを用いて、内部状態を連続的に修正し、（２）呼び出しアプリケーションから受信した新しいシードを用いて、内部状態をオンデマンドで修正するようにさらに構成され得る。
【００２２】
別の実施は、擬似乱数を生成する１つ以上の命令を有する機械読み出し可能媒体であって、命令は、プロセッサによって実行されたときに、プロセッサに、（１）エントロピーの１つ以上の予測不可能な源からシードを得ることと、（２）数生成器の内部状態を、現在の内部状態とシードとの関数として修正し、数生成器にエントロピーを蓄積することと、（３）数生成器の修正された内部状態に基づいて、擬似乱数を生成することとを行わせる、機械読み出し可能媒体を与える。
【好ましい実施形態の詳細な説明】
【００２３】
次の説明では、実施形態の完全な理解をもたらすように、具体的な詳細を与える。しかしながら、当業者は、これらの具体的な詳細がなくても、実施形態が実行され得ることが分かるであろう。例えば、不要な詳細で実施形態を不明瞭にしないように、回路は、ブロック図で示されるか、または全く示されていないこともある。他の例では、周知の回路、構造、および技術は、実施形態を不明瞭にしないように詳細に示され得る。
【００２４】
さらに、実施形態がフローチャート、流れ図、構造図、またはブロック図として示されるプロセスとして説明され得ることに注目する。フローチャートは、動作を順次のプロセスとして説明し得るが、動作の多くは並行してまたは同時に行うことができる。さらに、動作の順序は並べ替えてもよい。その動作が完了すると、プロセスは終了する。プロセスは、方法、機能、手続き、サブルーチン、サブプログラム、等に相当し得る。プロセスが機能に相当するとき、その終了は、機能が呼び出し機能またはメイン機能に戻ることに相当する。
【００２５】
さらに、記憶媒体は、データを記憶する１つ以上のデバイス、例えば、読み出し専用メモリ(read-only memory, ROM)、ランダム アクセス メモリ(random access memory, RAM)、磁気ディスク記憶媒体、光記憶媒体、フラッシュ メモリ デバイス、および／または情報を記憶する他の機械読み出し可能媒体を表わし得る。“機械読み出し可能媒体（machine readable medium）”という用語は、ポータブルまたは固定の記憶デバイス、光記憶デバイス、無線チャネル、並びに命令および／またはデータを記憶、収容、あるいは搬送することができる種々の他の媒体を含むが、それらに限定されない。
【００２６】
さらに、実施形態は、ハードウェア、ソフトウェア、ファームウェア、ミドルウェア、マイクロコード、またはその組合せによって実施され得る。ソフトウェア、ファームウェア、ミドルウェア、またはマイクロコードにおいて実施されるとき、必要なタスクを行うプログラムコードまたはコードセグメントは、記憶媒体または他の記憶手段のような機械読み出し可能媒体に記憶され得る。プロセッサは必要なタスクを行い得る。コードセグメントは、手続き、機能、サブプログラム、プログラム、ルーチン、サブルーチン、モジュール、パッケージソフト（software package）、クラス、あるいは命令、データ構造、またはプログラム文（program statement）の組合せを表わし得る。コードセグメントは、情報、データ、引き数、パラメータ、またはメモリ内容を送信および／または受信することによって、別のコードセグメントまたはハードウェア回路に連結され得る。情報、引き数、パラメータ、データ、等は、適切な手段、とくに、メモリの共有、メッセージの受け渡し（passing）、トークンの受け渡し、およびネットワーク送信によって、受け渡し、転送、または送信され得る。
【００２７】
１つの特徴は、セキュリティアプリケーションにおいて、数生成器に再びシードを与え、擬似乱数列を得る、暗号的に安全な擬似乱数生成器(cryptographically secure pseudo-random number generator, CSPRNG)のための斬新なアルゴリズムを与える。１つの実施において、ストリーム暗号非線形ＳＯＢＥＲ（Non-Linear SOBER, NLS）生成器は、ステートフルな再シーディング機構（stateful reseeding mechanism）が異なる物理的な源からのエントロピーを蓄積し続けるように修正された。(HAWKES、Philip、他、“Primitive Specification NLS”、〔オンライン〕、〔2006-08-21で検索される〕を参照。インターネット<URL: www.ecrypt.eu.org/stream/ciphers/nls/nls.pdf>から検索される）。ＮＬＳは、単純なワード指向動作（word-oriented operation）に基づいて秘密鍵を生成するのに使用される同期ストリーム暗号である。
【００２８】
さらに、従来技術と異なり、この再シーディング方式は、数生成器を既知の状態にリセットせず、したがって数生成器をハッキングする機会を低減する。その代わりに、生成器の次の状態は、現在の状態と新しいシードとの関数である。
【００２９】
さらに、別の特徴は、システムがシャットダウンする前に、安全なシード（secure seed）を生成して記憶し、その後で、システムが再始動するときに、それを使用して、システムを初期化する。
【００３０】
別の態様は、ＣＳＰＲＮＧのアクティブおよびパッシブな再シーディングの両者を与える。アクティブな再シーディングは、生成器（ＣＳＰＲＮＧ）によって規則的または連続的に行われる。パッシブな再シーディングは、ＣＳＰＲＮＧを起動し（invoke）、それら自身のエントロピーを生成器（ＣＳＰＲＮＧ）に個々に与えるアプリケーションによって行われる。新しいエントロピーは、現在の状態によっても影響を受けるようなやり方で、ＣＳＰＲＮＧの順序論理の状態を変更する。この斬新なＣＳＰＲＮＧには、２５７６個の可能な状態があるので、アプリケーションは、それ自身のエントロピーを与えることに基づいて、次の状態を推定することができない。
【００３１】
さらに別の特徴は、擬似乱数のストリームが、最新の設計よりも相当に速く、生成され得ることである。ストリーム暗号ＮＬＳにおいて使用される動作は、３２ビットプロセッサのために十分に最適化されている。その結果、ランダムビットは、プロセッサインテンシブ（processor intensive）であるカウンタモードのブロック暗号を使用するもの(例えば、ヤロー（Yarrow）およびフォーチュナ（Fortuna）)よりも、ソフトウェアおよび埋め込みハードウェアにおいて相当に速く生成される。
【００３２】
さらに、再シーディングおよびエントロピーの蓄積ために、比較的に複雑でない構造を与え、それによって実施コストおよびプロセッサの必要を低減する。ヤローおよびフォーチュナは両者とも、ハッシュコンテキストの多数の部分を必要とし、エントロピーをローカルに保持する。対照的に、開示される数生成方式は、外部アプリケーションのインターフェースを与え、シード関数を外部で呼び出す。その結果、エントロピーの蓄積のために、特別なローカルメモリを割り振る必要がない。実際に、幾つかの実施形態において、７２バイトのみが、生成器の内部状態を記憶するのに必要とされ得る。状態遷移中に、エントロピーの入力は、内部状態ビットの長い範囲に拡散される。
【００３３】
さらに、ＣＳＰＲＮＧの１つの実施は、非線形フィードバック シフトレジスタを使用して、擬似乱数列を生成する。この軽量の再シーディング機構および非線形内部構造は、暗号のセキュリティを強化し、システム効率を最適化するように選択される。
【００３４】
図１は、暗号的に安全な擬似乱数生成器(cryptographically secure pseudo-random number generator, CSPRNG)を実施するように修正され得るストリーム暗号ＮＬＳを示すブロック図である。ストリーム暗号ＮＬＳ104では、秘密鍵102を使用して、ストリーム暗号104を発見不可能な状態に構成する。鍵スケジューラ106は、ストリーム暗号ＮＬＳ104の状態(例えば、順序論理)を構成し得る。さらに、内部状態レジスタ108がストリーム暗号ＮＬＳ104によって維持され得る。ストリーム暗号ＮＬＳ104は、１２８ビット長よりも長い秘密鍵102をサポートし、１８ワードサイズのレジスタ（ｒ〔０〕ないしｒ〔１６〕、およびコンスト（Konst））108を使用して、ストリーム暗号ＮＬＳ104の内部レジスタ状態を記憶し得る。秘密鍵102の長さと状態レジスタ108とにより、ブルート フォース アタック（brute force attack）を使用してストリーム暗号ＮＬＳ104を壊す試みを実行不可能にする。鍵ストリーム生成器110は、内部状態レジスタ108と秘密鍵102とに基づいて、出力鍵ストリーム112を生成する。出力鍵ストリーム112を使用し、平文データ114を暗号文116へ暗号化することができる。ＮＬＳは、モジュロ２加算を使用して、ストリーム暗号出力(すなわち、鍵ストリーム)112と平文114とを混合（mix）する加法的ストリーム暗号（additive stream cipher）である。
【００３５】
ストリーム暗号ＮＬＳ104は、高速乱数生成のためにわずかに修正され、セキュリティアプリケーションに十分に強い数生成器を実施し得る。単純な、有効な、および／または効率的なシーディングおよび再シーディング機構は、異なる源からエントロピーを集め、安全に、少ない処理オーバーヘッドで、乱数を生成するように実施される。数生成器の次の状態は、現在の状態と新しいシードとの関数である。数生成器は、最初に、物理的な源からの十分にランダムなビットを用いて、システムによってシードされる。数生成器が長い間再びシードを与えられなくても、最初のシードを推定することは、１２８ビットの鍵ストリーム暗号を解読する（break）のと同じくらい困難であり、これは計算上実行不可能（infeasible）である。数生成器の特徴として、出力は、ランダムビット列と区別できないはずである。例えば、数生成器の擬似乱数出力は、
【数１】
2009506438.tif 000003
【００３６】
として定義される数であり、これはストリーム暗号ＮＬＳによって使用される出力アルゴリズムである。擬似乱数は、初期化ベクトル、キー、ナンス、ソルト、等として使用され得る。
【００３７】
本発明を説明するために、数生成器は、３２ビットの演算のために最適化され、３２ビットの演算は、３２ビットプロセッサ、例えば、複雑命令セットコンピュータ（Complex Instruction Set Computer, CISC）プロセッサのインテル ペンティアム（登録商標）シリーズおよび縮小命令型コンピュータ(Reduced Instruction Set Computer, RISC)プロセッサのＡＲＭシリーズ上で実施することができる。ここで、“ワード（word）”という用語は、３２ビットのストリングを指し、“バイト（byte）”という用語は、８ビットのストリングを指す。しかしながら、当業者には、開示されたＣＳＰＲＮＧは、異なるビット数で別の演算のために実施され得ることが明らかであるだろう。
【００３８】
図２は、１つの実施にしたがって、擬似乱数生成器202が別々の関数としてどのように表わされ得るかを示している。シード関数ＳＥＥＤ（ ）204は１つ以上の予測不可能な源206をシードとして使用し、生成器202を構成する。具体的には、１つ以上の予測不可能な源206は、シードを生成する１つ以上の異なる物理的な源を含み得る。幾つかの実施において、各予測不可能な源206からの情報は、別々のシードに量子化され、別々のシードは、シード関数ＳＥＥＤ（ ）204に順次に供給される。他の実施において、予測不可能な源206の２つ以上からの情報は量子化され、１つのシードに結合され（例えば、乗算、ＸＯＲ、等）、その１つのシードがシード関数ＳＥＥＤ（ ）204にパラメータとして供給される。シード関数ＳＥＥＤ（ ）204が、パラメータとして“シード”により呼び出される（invoke）されるたびに、数生成器202の内部状態は、内部状態レジスタのシフティングに関与する非線形動作によって更新される(すなわち、“再びシードを与えられる(reseeded)”)。
【００３９】
擬似ランダム列生成関数ＲＡＮＤ（ ）208は、数生成器202の内部状態を使用し、擬似ランダム出力210を得る。生成された擬似乱数(出力)210は、ナンス、初期化ベクトル、等として使用され得る。
【００４０】
予測不可能な源206は、量子化可能な情報の異なる源から得ることができる。例えば、送信エラー、帯域幅中の雑音ピーク、プロセッサの温度の読み出し、ＣＤＭＡサーチャ、等のような物理的な源を、シードへの入力として使用することができる。
【００４１】
入力源206の幾つかがハッカーによって操作される場合、ハッカーの攻撃は、１つ以上の源から数生成器202に連続的にまたは頻繁に再シーディングすることによって、阻止される傾向がある。シードは、予測不可能な入力206を用いて連続的または頻繁に更新されるので、ハッカーは、入力源206の幾つかを操作することによって新しい擬似ランダム出力210を予測することができ難くなる。
【００４２】
図３は、シード関数204の一例を示すブロック図である。数生成器が最初に始動されるとき、状態レジスタイニシャライザ302(ＮＬＳ_ＩＮＩＴＳＴＡＴＥ)は、数生成器の状態レジスタを初期化する。例えば、フィボナッチ数は、状態レジスタｒ〔０〕ないしｒ〔１６〕を初期化するのに使用される。コンスト（Konst）レジスタもランダムに選択された数(例えば、０ｘ６９９６ｃ５３ａ)に初期化される。例えば、特定の固定値が、相互運用性のためにコンストに使用され得る。第２に、シードローダ304(ＮＬＳ＿ＬＯＡＤＫＥＹ)は、排他的論理和
【数２】
2009506438.tif 000004
【００４３】
を使用して、シード300を状態レジスタ(ｒ〔０〕ないしｒ〔１６〕）へ１ワードずつロードする。シード300の長さも、ワードとしてロードされ得る。シードローダ304は、さらに、非線形フィードバックモードにおいて状態レジスタ((ｒ〔０〕ないしｒ〔１６〕）を同時にシフトし、シード300が任意の長さをもつことを可能にする。第３に、コンスト（Konst）生成器306(Konst generator, GENKONST)は、現在の生成器の状態と現在のコンスト値とに基づいて、新しいコンスト値でコンストレジスタを更新する。このコンスト値は、擬似乱数の出力210中に定数として使用される。
【００４４】
図４は、シーディング関数204によって使用される状態レジスタイニシャライザ302の一例を示すブロック図である。数生成器が最初に始動されると、その状態レジスタが初期化される。状態レジスタイニシャライザ302は、数生成器の状態レジスタｒ〔０〕．．．ｒ〔１６〕を初期化するフィボナッチ数テーブル402を含み得る。例えば、ｒｔ〔０〕＝ｒｔ〔１〕＝１、およびｒｔ〔ｉ〕＝ｒｔ〔ｉ−１〕＋ｒｔ〔ｉ−２〕（なお、２≦ｉ≦１６）。定数404は、コンスト（Konst）レジスタを初期化するのに使用される。定数404の値は、そのビット列内に幾つかのエントロピーをもつことが好ましい任意の数であり得る。
【００４５】
図５は、一例にしたがって数生成器にシードを与える（seed）、および／または再びシードを与える(reseed)のに使用され得るシードローダ304によって行われる関数を説明するブロック図である。シードローダ304は、シード入力の全ビットが結果の状態レジスタの全ビットに確実に影響を与えるようにする非線形機構を含み得る。(HAWKES、Philip、他、“Primitive Specification NLS”、〔オンライン〕、〔2006-08-21で検索される〕を参照。インターネット<URL: www.ecrypt.eu.org/stream/ciphers/nls/nls.pdf>から検索される）。インクルーダ（Includer）関数501は、シード514の各ワードを状態レジスタｒ〔１５〕のモジュロ２３２に加える。シード長（バイト）も状態レジスタｒ〔１５〕に加えられる。ディフューザ（Diffuser）関数503は、状態レジスタｒ〔０〕ないしｒ〔１６〕のレジスタのシフティング500を行い、したがって、ｒｔ＋１〔ｉ〕＝ｒｔ〔ｉ＋１〕（なお、ｉ＝０．．．１５）になる。フィードバック関数502は、（ｒｔ〔０〕＜＜＜１９）＋（ｒｔ〔１５〕＜＜＜９）＋Ｋｏｎｓｔとしてその入力を得る。なお、“＜＜＜ｋ”は、ｋビットの左ロテーション（left rotation）を示す。フィードバック関数502の出力は、ｒｔ〔４〕とＸＯＲ504され、フィードバック内容508を得る。状態レジスタｒｔ〔１６〕は、フィードバック内容508に設定され、一方でｒｔ＋１〔４〕 ＸＯＲ ｏｕｔｐｕｔ（ｔ＋１）に設定される。なお、ｏｕｔｐｕｔ（ｔ＋１）の関数208は、擬似乱数出力210である。しかしながら、シードローダ304の一部として呼び出されるときは、ｏｕｔｐｕｔ(ｔ＋１)208は数生成器の内部で保持され、外部アプリケーションに与えられない。
【００４６】
フィードバック関数502は、４つの８×８の代入ボックス（Substitution-box）に基づいて、３２ビットのマッピングを行い得る。
【００４７】
レジスタシフタ500の出力が１サイクルに収まる可能性は非常に低いが、それでも可能性はある。このような周期的な出力が現れるのを防ぐために、カウンタｔを使用して、最後の再シーディング動作以後にレジスタシフタ500によってシフトされたワード数のカウントを維持し得る。カウンタｔは状態レジスタに加えられ、周期的な出力が現れるのを防ぐ。例えば、ｔが（２１６＋１）の倍数であるとき、ｒ〔２〕は、ｒ〔２〕＋ｔ（モジュロ２３２）に設定される。他の実施において、カウンタｔは、異なる演算を行うことによって、異なるレジスタ（例えば、ｒ〔０〕ないしｒ〔１６〕）に加えられる、および／またはレジスタに挿入され得る。
【００４８】
１つの実施において、シード514はインクルーダ関数501を使用してロードされ、次に、ディフューザ関数503が呼び出される。次に、シードの長さは、インクルーダ関数501を使用してロードされ、ディフューザ関数503は１７回呼び出されて、シード入力の全ビットが、結果の状態レジスタｒ〔０〕．．．ｒ〔１６〕の全ビットに非線形に確実に影響を与えるようにする。
【００４９】
図６は、ＮＬＳ鍵スケジューリングから修正されたシード関数を実行する方法を示している。シードは、１つ以上の予測不可能な源に基づいて得られ（602）、パラメータとしてシード関数に渡される。シードは、幾つかのエントロピーを含むが、完全にランダムである必要のない、任意の長さをもつバイトストリングとして定義される。例えば、シードを生成する源は、プロセッサの温度、通信リンクエラー、チャネル内における検出された周波数ピーク、等のような物理的な源からの測定値を量子化することによって得ることができる。
【００５０】
シード関数が呼び出されると、state_initializedフラグがチェックされ（604）、生成器の状態レジスタが初期化されたかどうかを判断する。従来のストリーム暗号ＮＬＳアルゴリズムは、再シーディング時に状態レジスタをリセットまたはクリアし、それによって、エントロピーを蓄積しない。対照的に、現在の修正されたアルゴリズムは、(例えば、状態レジスタをクリアせずに)現在の状態レジスタと新しいシードを結合することによって、エントロピーを蓄積する。生成器が始動した後で、シード関数が始めて呼び出されると、内部状態レジスタ（例えば、ｒ〔０〕ないしｒ〔１６〕、コンスト（Konst）、等）は初期化され（606）、state_initializedフラグは、生成器の状態レジスタが初期化されたことを示すように設定される（608）。例えば、ＮＬＳ ＩＮＩＴＳＴＡＴＥ関数が呼び出されて、ＮＬＳアルゴリズムのために予め定められた内部状態レジスタを初期化し得る。そうでなければ、状態レジスタは、(設定されたstate_initializedフラグによって示されているように)既に初期化されており、初期化ステップはスキップされる。
【００５１】
数生成器の新しい状態が現在の状態とシードとの関数として得られると、シードはＮＬＳ ＬＯＡＤＫＥＹ関数に渡される（610）。例えば、シードおよびその長さは、ＸＯＲを使用して、状態レジスタにロードされ、新しい状態は、現在の状態とシードとの両者の関数になる。したがって、現在のシードの知識を使用して、生成器の前の状態、現在の状態、または次の状態を推定するのは、実現不可能である。システムは、新しい予測不可能なシードからのエントロピーを数生成器に加え続ける。さらに、シード関数は、数生成器を呼び出すアプリケーションによって呼び出され（invoke）され得る。この意味で、アプリケーションは、シード関数を呼び出して（call）、ランダム性のためにエントリピーを与え、予測不可能なやり方で生成器状態を変更する。その結果、同じ入力シードを用いた再シーディングは、異なる時間において、異なる出力をもたらす。このことは、同じシードが使用されるときは必ず同じ出力列を生成する一般的なＰＲＮＧと区別できる。次に、現在の生成器の状態に基づいて、コンスト（Konst）値が更新される（612）。例えば、ＮＬＳ ＧＥＮＫＯＮＳＴ関数を呼び出して、漸進的に変化する（evolving）生成器の状態から新しいコンスト（Konst）を得ることができる。コンストは、既に説明したように、出力にマスクするのに使用され得る。出力緩衝器は、フラッシュされ（614）、次のシードを生成するために新しい擬似ランダムビットを保持する。
【００５２】
ＣＳＰＲＮＧを実施する便宜上、シードおよび擬似ランダム列の両者は、バイトのストリングであり得る。ストリーム暗号ＮＬＳはワード指向（word-oriented）であるので、シードは、ＳＥＥＤ（ ）によって内部で０ないし３バイトのゼロでパッドされる。同様に、ＲＡＮＤ（ ）が擬似ランダム列を出力緩衝器に送る前に、最後のワード内の余分な０ないし３バイトは捨てられる。
【００５３】
図２を再び参照すると、実施中に、周期的および／またはランダムに、幾つかの物理的な源を用いて生成器202にシードを与えることが望ましい。ＣＤＭＡ移動電話において利用可能な１つの提案される源は、サーチャからの低いオーダのエネルギサンプルである。サーチャはアンテナを使用し、マルチパスのエネルギピークを得る。これはランダム性のために連続的な源を与える。パケットストリームにおける遅延ジッタのような、幾つかのより低ランダムな源（low random source）を取り入れることができる。
【００５４】
生成器のランダム性のために予測不可能な物理的な源を取り入れることは、生成器の出力を予測する攻撃を妨害する。１つのタイプの攻撃において、ハッカーは、物理的な源の全てではないが、幾つかを制御し得る。解決案として、生成器に、全ての源を用いてパワーアップ中にシードを与える。出力列が生成されているときに、幾つかの源は真（real）のエントロピーをまだ与えているので、ハッカーは状態を推定することができない。別のタイプの攻撃では、ハッカーは、生成器にシードを与えるのに使用されている全ての利用可能な物理的な源を制御する。そのような場合、ＲＡＮＤ（ ）関数208を呼び出すアプリケーションが、生成器自体にシードを与えることによってエントロピーを得ることができる。例えば、そのアプリケーションは、源として、それ自身の予測不可能なイベントでＳＥＥＤ（ ）関数204を呼び出すことによって、生成器にシードし得る。
【００５５】
物理的な源の性質に応じて、パワーアップ中のシーディング手続きは、相当に時間がかかり得る。１つの改良では、セキュア ファイル システム(Secure File System, SFS)を使用し、パワー シャットダウン前に、シードファイルの権利（seed file right）を記憶する。図７は、擬似乱数生成器に関連付けられたセキュア ファイル システムにシードを記憶する方法を示している。セキュア ファイル システムは、暗号プリミティブを使用し、ファイル内容の機密性および完全性を保護する。デバイスがオフにされる前に、セキュア ファイル システムが利用可能であるとき（702）、システムはＲＡＮＤ（ ）を呼び出し、１２８ビットのストリングをシードとして生成する（704）。シードは、ＳＦＳにファイルとして記憶される（706）。
【００５６】
図８は、スタートアップ時に、シードファイルに記憶されたシードを使用して、擬似乱数生成器を初期化する方法を示している。例えば、ＣＤＭＡ移動電話におけるＣＳＰＲＮＧは、スタートアップ時に、このシードファイルを使用して初期化され得る。デバイスの初期化をパワーアップするとき（802）、システムは、セキュア ファイル システムが利用可能であるかどうかを判断する（804）。ＳＦＳがパワーアップ中に利用可能であるとき、シードファイルは完全性検証のために解読される（806）。成功すると（808）、内容はシードファイルから回復され（810）、ＳＥＥＤ（ ）関数にシードを与えるのに使用される（812）。シードファイルは、その内容が抽出されると、ＳＦＳから取り去られる。正常なパワーダウン手続きが損なわれると、このような構成は、同じシードが、次に電話がパワーアップするときに使用されるのを防ぐ。ＳＦＳが利用可能でないか、またはシードファイルが完全性の試験に失敗すると、予測不可能な源を使用し、（例えば）１２８ビットを第１のシードとして与える（814）。
【００５７】
１つの特徴によると、アプリケーションは、ＳＥＥＤ（ ）関数を使用することによって、それ自身のエントロピーを加えることができる。アプリケーションによって与えられるシードは、完全にランダムである必要はなく、幾つかの新しいエントロピーを含まなければならないだけである。これは、乱数の要求に対する任意のタイプの情報、例えば、システム時間またはＣＰＵサイクルカウンタであり得る。予測可能なデータを用いた再シーディングは安全であり、アプリケーションは、任意のやり方で入力データを“削除（trim）”する必要はない。予測可能なデータを使用して、エントロピーを加えるとき、それはばらばらに、または不規則な再シーディングパターンで使用され、アプリケーションがそれ自身のエントロピーを加える一方で、ハッカーが生成器を危険にさらすのを防ぐことができる。
【００５８】
図９は、アプリケーションがどのように数生成器に再びシードを与え得るかを示している。カウンタｎが既に初期化されているかどうかを判断するために、チェックが行われる（902）。初期化されていないときは、カウンタｎはパラメータＮ(例えば、３２)で初期化される（904）。次に、ＲＡＮＤ（ ）関数を使用して、乱数Ｒを生成する（906）。ＲＡＮＤ（ ）が呼び出されるたびに、カウンタｎは１ずつディクレメントされる（908）。ｎ＝０であるとき、数生成器は、system timeを入力源として用いるＳＥＥＤ（ ）関数を使用して、再びシードを与えられる（912）。カウンタｎはＮ／２＋（ＲモジュロＮ／２）にリセットされ、なお、Ｒは、アプリケーションが得た最新の乱数である（914）。そうではなく、ｎ≠０であるとき、再シーディングは行われない。再シーディングが頻繁に行われ過ぎると、システム時間は、エントロピーの蓄積を十分に大きく変えない。カウンタｎに応じて再シーディングを行うことによって、図９の方式は、２つの再シーディング呼び出し間の時間が十分に長い(すなわち、ＲＡＮＤ（ ）の実行のＮ／２回よりも長い)ことを保証する。（ＲモジュロＮ／２）が関与するので、再びシードを与えるときを予測するのは、より困難である。
【００５９】
１つの実施において、数生成器(すなわち、ＣＳＰＲＮＧ)は、保護されたメモリにおけるサーバプロセスとして実行され、一方でアプリケーションは、クライアントプロセスからのランダム列に再びシードを与える、またはそれを要求する。データは、プロセス間通信を使用して、ＣＳＰＲＮＧとアプリケーションとの間で伝達される。全てのランダム源を一緒に混合するために、全アプリケーションに対して１つのＣＳＰＲＮＧのインスタンスを維持することが望ましい。すなわち、数生成器およびレジスタ状態は、全ての呼び出しアプリケーションに使用される。
【００６０】
シード関数ＳＥＥＤ（ ）およびランダム出力関数ＲＡＮＤ（ ）は、最小（atomic）であり、相互に排他的であることに注意すべきである。例えば、攻撃者が、シード関数ＳＥＥＤ（ ）とＲＡＮＤ（ ）関数からのランダム列の出力との両者にアクセスすると仮定する。攻撃者は、不良の（poor）エントロピーの幾つかの既知の値でＣＳＰＲＮＧにシードを与え得る。生成器(すなわち、ＣＳＰＲＮＧ)は、他の独立の源によって、またはＳＦＳシードファイルからシードされているので、ＣＳＰＲＮＧの現在の状態を推測するのは依然として実行不可能である。内部状態が示されなければ、ＲＡＮＤ（ ）関数の出力列は予測可能ではない。
【００６１】
他方で、ＣＳＰＲＮＧが長い間再シーディングされずに実行されても、任意の攻撃の複雑さは、ストリーム暗号ＮＬＳを壊すのに劣らないであろう。徹底的な鍵探索が、ストリーム暗号ＮＬＳを壊すのに必要であり、現在の鍵探索技術に与えられた鍵のサイズ(例えば、１２８ビット)では、このようなブルートフォース サーチは実行不可能である。本明細書で説明されている実施形態によって生成されたランダムビットは、国立標準技術研究所（National Institute of Standards and Technology, NIST）の暗号アプリケーションのための乱数生成器および擬似乱数生成器の検証のための統計試験スイート（Statistical Test Suite for the Validation of Random Number Generators and Pseudo Random Number Generators for Cryptographic Applications, NIST Special Pub. 800-22)における全ての試験に合格した。
【００６２】
図１０は、暗号的に安全な擬似乱数生成器を実施するように構成された記憶媒体1002およびプロセッサ1004を含むコンピューティングデバイス1000を示すブロック図である。記憶媒体1002は、例えば、メモリデバイスおよび／またはハードドライブであり得る。記憶媒体1002は、プロセッサ1004によって実行されたときに、擬似乱数を生成する命令を記憶している。命令は、プロセッサ1004に（１）エントロピーの１つ以上の予測不可能な源を得て、シードを与えることと、（２）数生成器の現在の内部状態を、現在の内部状態とシードとの関数として修正し、エントロピーを蓄積することと、（３）数生成器の修正された内部状態に基づいて、擬似乱数を生成することと、（４）エントロピーの１つ以上の予測不可能な源にシードに結合することと、（５）シード情報の１つ以上の予測不可能な源から得たシードを用いて、現在の内部状態を修正し続けることと、および／または（６）呼び出しアプリケーションから受信した情報を用いて、現在の内部状態をオンデマンドで修正することとを行わせ得る。プロセッサは、（１）数生成器によって生成された擬似乱数である初期化シードを、数生成器のシャットダウン時に記憶し、（２）数生成器のスタートアップ時の内部状態を初期化する前に、初期化シードの完全性が損なわれているかどうかを判断し、（３）（ａ）記憶されている初期化シードの完全性が損なわれているときは、別の予測不可能な源を用いて、（ｂ）そうでなければ、記憶されている初期化シードを用いて、数生成器のスタートアップの内部状態に再びシードを与えるようにさらに構成され得る。
【００６３】
したがって、（１）エントロピーの１つ以上の予測不可能な源を得て、シードを与える手段と、（２）数生成器の現在の内部状態を、現在の内部状態とシードとの関数として修正し、エントロピーを蓄積する手段と、（３）数生成器の修正された内部状態に基づいて、擬似乱数を生成する手段とを含む数生成器が与えられる。
【００６４】
図１１は、１つの実施にしたがって、擬似乱数生成器回路1100を示すブロック図である。擬似乱数生成器回路1100は、エントロピーの１つ以上の源を利用して、シードの数を生成するシード生成器1102と、生成器状態のメモリ1104と、シード生成器1102からのシードを利用して、鍵ストリームを得る数生成器1106とを含む。生成器回路1100は、本明細書に記載されている種々の実施形態にしたがって、その機能を実行するソフトウェアおよび／または埋め込みハードウェア構成要素を含み得る。
【００６５】
種々の実施にしたがうと、デバイス1000および／またはデバイス1100は、移動電話、パーソナル データ アシスタント(personal data assistant)、スマートフォン、サーバ、デスクトップコンピュータ、ラップトップコンピュータ、電子ゲーミングデバイス（electronic gaming device）、または他の種々の電子デバイスであり得る。さらに、デバイス1000および1100は、説明のために単純化されているが、デバイス1000および／または1100は、実施に応じて他の要素または構成要素を含み得る。
【００６６】
本明細書に説明されている斬新なアルゴリズムは、ソフトウェアおよび／または埋め込みハードウェアにおいて効率的に実施され得る。とくに、本発明は、外部アプリケーションのためのインターフェースを与え、シード関数ＳＥＥＤ（ ）を外部で呼び出すので、特別なローカルメモリを、エントロピーの蓄積のために割り振る必要はない。事実、本明細書に記載されている数生成アルゴリズムは、７２バイトのみを使用して、生成器の内部状態を記憶し、これは、メモリが限られている環境において魅力的である。対照的に、ヤロー（Yarrow）およびフォーチュナ（Fortuna）アルゴリズムは、通常、多数のハッシュコンテキスト(それぞれ、２および３２コンテキスト)を必要とし、エントロピーをローカルに保持する。さらに、ヤローまたはフォーチュナによって使用されるブロック暗号は、ラウンド鍵（round key）を記憶するのに、より多くのメモリを必要とする。
【００６７】
本明細書に説明されている幾つかの実施形態は、幾つかの既存の技術よりも、より少ないオーバーヘッドで、より高速の再シーディングを与える。とくに、ｍバイトの情報での再シーディングにかかる時間は、ｍ＋７２バイトの擬似ランダム出力を生成するのにかかる時間とほぼ同じであり得る。対照的に、ヤローは、再シーディングのために、エントロピー入力をＰｔ＋２回ハッシュする。なお、Ｐｔは、負でないユーザ定義のパラメータである。３２個のエントロピーのプールが関与するとき、フォーチュナは、より複雑な再シーディング制御方式を有する。控え目にみて（conservatively）、ＮＬＳ鍵スケジューリングアルゴリズムがハッシュ関数と同じ時間複雑性をもつと仮定すると、ＣＳＰＲＮＧは、ヤローよりも少なくともＰｔ＋２倍速く、フォーチュナよりも３倍速く再シーディングを行う。
【００６８】
また別の特徴は、擬似ランダム列の生成の速度が、カウンタモードにおけるブロック暗号(例えば、ＡＥＳ)よりも相当に高速であることである。これは、ストリーム暗号ＮＬＳが、加算、ＸＯＲ、ロテーション（rotation）のような単純なワード演算を、一定のオフセットおよびテーブル索引（table lookup）と共に使用するからである。その結果、１バイトの出力は、例えば、インテル セントリーノ（Intel Centrino）プロセッサ上で平均７．３４７クロックかかり、これは、カウンタモードでブロック暗号を使用するほどプロセッサインテンシブではない。
【００６９】
したがって、開示された実施形態は、先行技術のものよりも、多くの点で優れているであろう。１つにおいて、それらは、ハッシュ関数とブロック暗号との組合せではなく、１つの暗号プリミティブのみを使用し得る。
【００７０】
図１、２、３、４、５、６、７、８、９、１０、および／または１１に示されている構成要素、ステップ、および／または機能の１つ以上は、擬似乱数生成の動作に影響を与えることなく、並べ替えられ得る、および／または１つの構成要素、ステップ、または機能に結合され得るか、あるいは幾つかの構成要素、ステップ、または機能において具現され得る。追加の要素、構成要素、ステップ、および／または機能も、本発明から逸脱することなく加えられ得る。図１、２、３、４、５、１０、および／または１１に示されている装置、デバイス、および／または構成要素は、図６、７、８、および／または９に記載されている方法、特徴、またはステップの１つ以上を行うように構成され得る。
【００７１】
当業者は、本明細書に開示されている実施形態に関連して説明されている種々の例示的な論理ブロック、モジュール、回路、およびアルゴリズムのステップが、電子ハードウェア、コンピュータソフトウェア、または両者の組合せとして実施され得ることも分かるであろう。ハードウェアとソフトウェアとのこの互換性を明らかに示すために、種々の例示的な構成要素、ブロック、モジュール、回路、およびステップは、それらの機能性に関して上述で概ね説明された。このような機能性がハードウェアとして実施されるか、またはソフトウェアとして実施されるかは、システム全体に課された個々の用途および設計の制約に依存する。
【００７２】
実施形態の説明は、例示することを意図しており、請求項の範囲を限定することを意図していない。したがって、提示された教示は、他のタイプの装置に容易に適用され、多くの代案、修正、およびバリエーションが当業者には明らかであるだろう。
【図面の簡単な説明】
【００７３】
【図１】暗号的に安全な擬似乱数生成器(ＣＳＰＲＮＧ)を実施するように修正され得るストリーム暗号ＮＬＳを示すブロック図。
【図２】１つの実施にしたがって、擬似乱数生成器が別々の関数としてどのように表わされ得るか示す図。
【図３】シード関数の一例を示すブロック図。
【図４】シーディング関数によって使用される状態レジスタ イニシャライザの一例を示すブロック図。
【図５】一例にしたがって、数生成器にシードを与える、および／または再びシードを与えるのに使用され得るシードローダによって行われる機能を示すブロック図。
【図６】ＮＬＳ鍵スケジューリングから修正されるシード関数を実行する方法を示す図。
【図７】擬似乱数生成器に関連付けられるセキュア ファイル システムにシードを記憶する方法を示す図。
【図８】スタートアップ時に、シードファイルに記憶されているシードを使用し、擬似乱数生成器を初期化する方法を示す図。
【図９】アプリケーションが数生成器にどのように再びシードを与え得るかを示す図。
【図１０】暗号的に安全な擬似乱数生成器を実施するように構成された記憶媒体およびプロセッサを含むコンピューティングデバイスを示すブロック図。
【図１１】１つの実施にしたがう擬似乱数生成器回路を示すブロック図。
【符号の説明】
【００７４】
1000・・・コンピューティングデバイス、1100・・・擬似乱数生成器回路。
【図１】
2009506438.tif 000005
【図２】
2009506438.tif 000006
【図３】
2009506438.tif 000007
【図４】
2009506438.tif 000008
【図５】
2009506438.tif 000009
【図６】
2009506438.tif 000010
【図７】
2009506438.tif 000011
【図８】
2009506438.tif 000012
【図９】
2009506438.tif 000013
【図１０】
2009506438.tif 000014
【図１１】
2009506438.tif 000015
【国際調査報告】
2009506438.tif 000016
2009506438.tif 000017
2009506438.tif 000018