2017-07-16 15 views
0

ABCのCBCモードでは、各メッセージを一意にするためにIVを使用する必要があります。 IVはランダムで1回のみ使用する必要があります。それ以外の場合は、同じキーを使用した他の暗号テキストを復号化することができます。IVに使用する必要がありますか?

Cのrand()関数は、このIVを生成するのに適していますか?通常、現在の時刻にシードされているという事実により、何らかの攻撃に対して脆弱になっていますか?

+1

IVは、CBCモードでは予測不可能である必要があります。 'rand'が本当に現在の時刻だけをシードとして使うのなら、これは安全ではないかもしれません(全体的なプロトコルに依存します)。 –

+4

いいえ。 'rand()'は暗号的にランダムではありません。セキュリティが必要な場合は、非常に有用ではありません。その可能性は31ビットの擬似ランダム性しか得られず、単にセキュリティに役立つだけでは不十分です。 –

+0

@JonathanLeffler私はそれが再生攻撃を止めるのに十分ランダムでなければならないと思ったのですか? –

答えて

1

クイックアンサーはです。です。初期化ベクトルに暗号化されていない乱数ジェネレータを使用しないでください。初期化ベクトルは暗号化されずに送信されるため、これらの関数の1つによって生成されると考えることができます。しかし、これは弱点につながるはずです。私は説明します:あなたが貧しい人々(そして弱いランダムルーチンであるrand())を使うなら、あなたが生み出している可能性のあるIVのスペースを狭めるでしょう。例は十分です:

暗号化されたメッセージで8バイトのIVを使用しているとします。しかし、あなたが使用するランダム関数は8ビットのシードを持っています。そのような貧弱なランダム関数から生成される可能性のあるバイトシーケンスは256個しかありませんので、おそらく256個の可能なIVが生成されます(純粋なランダム性、または全面的に広がったハッシュ値)これを知っている攻撃者は、可能なIVの256スペース全体を再現して完全に役に立たなくすることができます。

+0

IVはクリアで送信されるため、攻撃者はそれを再現する必要はありません。そして、8ビットのシードはわずか256の異なるストリームを作成しますが、それらのストリーム内で未知の位置を持つことにより、より多くの8バイトのサブシーケンスが作成されます(ただし、アサーションが各呼び出しごとに再シードされる場合は、 。 – bartonjs

+0

@bartonjs、IVはクリアで送信されますが、あなたは正しいですが、サイズがあり、最大エントロピーで均等に考えられるビットで作られなければなりません。これらの要求のほとんどすべてが、小さな種子の良いエントロピー・ランダム・ジェネレータによって満たされますが、最後のものです。シードが8ビットしかない場合、最大256のIVを持ちますが、これはまったく萎縮ではありません。種子が再播かれたら、どの萎縮の世代を使用していますか?別のランダム生成器からそれを再シードしていますか?私のアプローチが見えますか? –

関連する問題