一部のデータ(サイズが数KB)を暗号化するためにワンタイムパッドを作成する必要があります。このようなワンタイムパッドを生成して、次のような基本的な乱数生成に関連するすべての疑似乱数の問題を回避するにはどうすればよいrand()
ですか?
これに使用できる既存の信頼できるツールまたはライブラリはありますか?
一部のデータ(サイズが数KB)を暗号化するためにワンタイムパッドを作成する必要があります。このようなワンタイムパッドを生成して、次のような基本的な乱数生成に関連するすべての疑似乱数の問題を回避するにはどうすればよいrand()
ですか?
これに使用できる既存の信頼できるツールまたはライブラリはありますか?
最近のほとんどのオペレーティング システムには、暗号的に安全な疑似乱数ジェネレーターがあります。
たとえば、Windows にはCryptGenRandomがあります。RNGCryptoServiceProviderクラスを使用して、.NET から同じストリームにアクセスできます。C++ から、Microsoft C++ ライブラリ関数rand_sを使用して同じストリームにアクセスできます。Python からは、os モジュールの関数urandom (リンク先ページの下部を参照) を使用してアクセスできます。
通常の PRNG とは異なり、CSPRNG は厳密な統計ランダム性テストに合格するように設計されています。また、初期状態または実行状態が攻撃者に利用可能になった場合でも、深刻な攻撃を受けても耐えられるように設計されています。
暗号学者が使用する「疑似ランダム」という用語は、技術に詳しくない読者には誤解を招く可能性があります。CSPRNG は、シードと呼ばれるランダム値のコレクションをより長い数列に拡張します。そのシーケンスは、シードがあれば再現可能ですが、優れた CSPRNG の場合、シードを少し変更すると、非常に異なるシーケンスが生成されます。したがって、シードの少なくとも一部が十分にランダムなプロセスを介して選択されている限り、攻撃者はシードの残りの部分に影響を与えることができたとしても、結果のシーケンスを予測することはできません。
軍事通信から事実上すべてのオンライン トランザクションを保護する暗号化に至るまで、多数の重要なシステムは、「暗号的に安全な疑似ランダム」と「ランダム」の間の機能的に同等のセキュリティに依存しています。
編集: Intel の Ivy Bridge プロセッサ シリーズを使用できる幸運な場合は、別の非常に興味深い代替手段があります。
真の乱数をアルゴリズムで生成することはできません。ハードウェアの支援が必要です。どんなに安全なアルゴリズム (暗号的に安全な PRNG など) を使用する場合でも、その PRNG に基づいてストリーム暗号を作成しているだけです。ワンタイムパッドではなくなりました。
Random.ORGを試してください。彼らは、大気ノイズに基づいて真の乱数を生成するさまざまな無料 (および有料) サービスを提供しています (または、少なくともそれが彼らの主張です)。