1

私のプログラムはサーバーに接続します。サーバーの公開鍵はすでに知られています。次に、プログラムは初期化ベクトルとともにAESキーを暗号化し、サーバーに送信します。サーバーはメッセージを復号化し、今後はAESを使用して会話を暗号化します。

私の質問は、IVを生成する方法についてです。私が素朴な方法で現在の時刻を疑似ランダムジェネレーターにシードすると、攻撃者はおそらくIVについていくつかの非常に良い推測をする可能性がありますが、これは私が望んでいることではありません。

ハードウェアランダムジェネレーターは遅いだけでなく、どこでも利用できるわけではないので、別のアプローチを採用したいと思います。クライアントプログラムを最初に起動したとき、TrueCryptと同じように、ユーザーにランダムなマウスの動きをいくつかさせます。これで、マウスの動きによって作成された「ランダムビット」を保存し、ジェネレーターが必要な場合は、それらをシードとして使用します。もちろん、ランダムビットはシードとして使用するたびに更新する必要があります。そして、これが私の質問です。生成された最初の数個のランダムビットを新しい「ランダムビット」として保存することを考えました。(したがって、次にソフトウェアが起動したときにランダムエンジンを初期化するために使用されます。)これが十分にランダムであるかどうか、または疑似ランダムジェネレーターがここで推測可能なパターンを示すかどうかはわかりません。(私はおそらくstd :: mt19937 http://en.cppreferenceを使用します。)。

編集:チェーンモードが変更されるので、「最も高い」要件のモードで機能させたいと思います。私が正しく覚えていれば、これはCBCになります。

注意:私が書いているソフトウェアは純粋に実験的なものです。

4

3 に答える 3

2

キーの場合と同じように、暗号化PRNGを使用します。

WindowsではCryptGenRandom/RtlGenRandomを使用し、Linux/Unixではを使用します/dev/urandom。それらはOSによってシードされるので、あなたはそれを世話する必要はありません。

本当に独自のPRNGを作成したい場合は、Fortunaを調べてください。メルセンヌツイスターは使用しないでください。

于 2012-11-24T11:38:50.630 に答える
1

使用する予定のチェーンモードを明確にする必要があります。初期化ベクトルのセキュリティ要件は、それに大きく依存します。

たとえば、CBCモードでは、IVは予測不可能で一意である必要があります。CTRモードの場合、一意である必要があり、必ずしも予測できないわけではありません。

于 2012-11-24T11:32:30.237 に答える
-1

疑似ランダムジェネレーターは、ユーザーに結果を予測させたくない場合(ゲームのサイコロの目など)には便利ですが、コンピューターに結果を計算させたくない場合には価値がありません。暗号化の場合、疑似ランダム性はまったく使用しないでください。

ランダム性が必要な場合は、実際のランダムデータが必要です。あなたが書いているように、マウスの動きはそのための良い情報源です。/ dev / randomについて話していないことを考えると、Windowsで実行していると思いますが、残念ながら、実行中にランダム性は収集されません。したがって、これは自分で行う必要があります。ユースケースに応じて、起動時にランダム性デーモンを実行して、ランダムデータを収集し続け、プログラムが必要なときにデータを取得できるようにするか、プログラムの起動時にマウスを動かすようにユーザーに依頼することができます。

または、Windowsが実際のランダムデータを必要としない場合は、Windowsを使用したくないと判断することもできますが、それはオプションではないと思います。;-)

于 2012-11-24T09:15:34.397 に答える