暗号的に安全な疑似乱数ジェネレータ(CSPRNG)の使用に関する基本的な質問があります。
CSPRNGの初期化に使用するシードのサイズはどのくらいですか?どのくらいの頻度で再シードする必要がありますか?そして、再シードされたエントロピーのサイズをどのように決定するのですか?
どんなポインタも役に立ちます。
重要なのはentropyです。
PRNG=暗号で安全にする理由は、攻撃者が次のバイトを予測できないことです。正確には、次のモデルでは、セキュリティを定義する3つの「セキュリティレベル」があります。
ビットの予測は常に0.5の確率で(純粋にランダムな推測で)実行できるため、攻撃者が実質的に上手に実行できないことが必要です。
一般的に、PRNGがこれらのプロパティをk + e≥128で満たすために通常は必要です。 "128"は従来の基本的に、攻撃者は可能なシード値を列挙し、既知の出力と一致するものを確認しようとします。攻撃者が実際のシードを見つけた場合、その後のすべての出力を100%の精度で予測できます。それ以外の場合、攻撃者は何も知らず、運ベースの推測、つまり各ビットの確率0.5に戻ります。
このレベルを達成するには、シードは少なくとも128ビットのエントロピーを表す必要があります。実際、「シード[〜#〜] s [〜#〜]はエントロピー128ビットを持っている」と言っているのは、実際に「攻撃者が推測しようとする攻撃者[〜#〜] s [〜 #〜]そして、最も可能性の高い値から始めて、最適な順序で連続して試行することにより、平均2の後に成功します。127 ここで重要なのは「平均」という用語です。エントロピーは確率と平均に関するものです。
nビットのエントロピーをnビット未満のデータに適合させることができないため、128ビットのエントロピーを得るには、少なくとも128ビットのデータが必要です。ただし、実際の「ランダムな」データは物理的な測定値から抽出され、偏っているので、表現するにはより多くのビットが必要です。たとえば、ユーザーからのキープレスのタイミングからランダム性を得ることができます。生物学的に言えば、ユーザーは正確なキープレスタイミングをマイクロ秒まで再現できないため、ナノ秒で表される2つのキープレス間の遅延は約10になります。エントロピーのビット-1秒の遅延では、ナノ秒でエンコードするために30ビットが必要です。
一般に、アプリケーションの作成者は、エントロピーを見積もるという複雑な作業を行う必要はありません。オペレーティングシステムはすでに物理的なソースからランダム性を集計し、これらの見積りを計算しています。 「ランダムなバイト」を与えるようにOSに要求する場合(Linuxシステムでは_/dev/urandom
_を開くか、WindowsではCryptGenRandom()
を呼び出すことにより)、すでにエントロピーの完全なビットを取得しています。したがって、128ビット(16バイト)を要求すると、PRNGに十分なシードが得られます。
(「128」は伝統的です。最も豊富な攻撃者に対する現在の技術的な限界は2に近いです75 オペレーション、および2を超えて増加する可能性は低い100 今後20年から30年で。 「128」は2の累乗であるため、暗号学者にはエレガントと見なされます。
あなたのPRNGが本当に暗号的に安全である場合、再シードは必要ありません-再シードの必要性は実際にはブレークとしてカウントされ、したがって=の概念と矛盾しますPRNG暗号的に安全です。
多くの人々と標準は、再シードを強く求めていますが、その主な理由は、実際には明記されていない理由により、あなたがmust再シードするという確立された教義のためです。 PRNGはnot暗号的に安全であり、実際にはコンピュータ上で実行されていなかった時代でした。これはコンピュータが発明される前だったためです。
したがって、監査人を幸せに保つために必要なだけ頻繁に再シードする必要がありますが、再シードまたは再シードしないというsecurityの問題については心配しないでください。人々は幸せで静かです。
(CSPRNGが暗号で保護されていない場合は、再シードによって皮膚が保存される可能性はほとんどありません。)
CSPRNGの初期化に使用するシードのサイズはどのくらいですか?
シード長および承認されたブロック暗号アルゴリズムのその他の要件は要約されています ここ :
どのくらいの頻度で再シードする必要がありますか?
シードは、攻撃者に知られていない限り安全です。これ以上の説明はできないと思います answer 。
CSPNRGエントロピーは Min Entropy 原理を使用して計算されます。