1

現在、MD5 ハッシュ アルゴリズム ベースの RSA データ セキュリティ コードを実装しています。UpdateData メソッドには、次のセクションがあります。

mCount[0] += (length << 3);

if (mCount[0] < (length << 3))
{
    mCount[1]++;
}

現時点では、if ステートメントが true と評価される方法を理解しようとしています (mCount[0] 値は 0 に初期化されます)。どんな助けでも大歓迎です。

ありがとう

4

5 に答える 5

8

mCount[0] 変数のオーバーフローが発生した場合に発生する可能性があります。

unsigned int i = 4294967295;//2^32-1
unsigned int j = 1;
i += j;
assert(i < j);

あなたが言及したコードのブロックは、処理するデータの量に応じて、おそらく複数回呼び出されます。したがって、mCount[0] は最終的にオーバーフローします。

于 2009-04-07T10:17:18.547 に答える
5

これはキャリー伝搬用で、長さ * 8 の合計が 2 つの 32 ビット ワードに格納されます (ここで、mCount は符号なし int の配列である可能性があります) mCount[1]:mCount[0]。

lo += a
if (lo < a) hi++; // true if overflow occurs: lo + a >= 2^32

は 64 ビット操作と同等です。

(hi:lo) += (0:a)
于 2009-04-07T10:24:32.380 に答える
0

Eric と Brian が指摘しているように、これは mCount[0] がオーバーフローしたときに発生し、500mb (2^29) ごとに発生するため、500mb を超えるファイル/データ ストリームをハッシュすると、このコード トリガーが表示されます。

2 つの 32 ビット カウンターを使用すると、カウンターが実際にオーバーフローする前に 2^61 バイトの入力が可能になります。

于 2009-06-22T22:05:49.153 に答える
0

これは、加算前に mCount[0] が負で、加算自体がオーバーフローしない場合に発生します。

于 2009-04-07T10:38:24.593 に答える