Кодовое покрытие MD5 - PullRequest
       15

Кодовое покрытие MD5

1 голос
/ 07 апреля 2009

В настоящее время я реализую код защиты данных RSA на основе хеш-алгоритма MD5, в методе UpdateData есть раздел, который гласит:

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

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

В данный момент я пытаюсь понять, как выражение if может когда-либо принимать значение true (значение mCount [0] инициализируется равным 0). Любая помощь будет принята с благодарностью.

Спасибо

Ответы [ 5 ]

8 голосов
/ 07 апреля 2009

Это может произойти при переполнении переменной mCount [0].

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

Блок кода, который вы упомянули, вероятно, вызывается несколько раз, в зависимости от объема обрабатываемых данных. Таким образом, mCount [0] в конечном итоге переполнится.

5 голосов
/ 07 апреля 2009

Это для переноса переноса, сумма длины * 8 хранится в двух 32-битных словах (здесь mCount, скорее всего, массив беззнаковых целых) mCount [1]: mCount [0].

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

эквивалентно 64-битной операции:

(hi:lo) += (0:a)
0 голосов
/ 23 июня 2009

Как указывают Эрик и Брайан, это происходит, когда mCount [0] переполняется, что происходит каждые 500 МБ (2 ^ 29), поэтому если вы хэшируете файлы / потоки данных размером более 500 МБ, вы увидите этот триггер кода.

Использование двух 32-битных счетчиков позволяет вводить 2 ^ 61 байт до того, как счетчик действительно переполнится.

0 голосов
/ 06 июня 2009

Я знаю, что это технически не является ответом на ваш вопрос программирования, но я, честно говоря, думаю, что наиболее ценный совет, который я могу вам дать, это то, что вы должны использовать широко используемый и хорошо проверенный алгоритм MD5 (или любой другой крипто), НЕ катите свои собственные. Как я могу выразить это деликатно ... этот совет вдвойне верен, если вы задаете вопросы о целочисленной математике. Дорога в ад усеяна телами людей, которые пытались внедрить хитрую криптографию самостоятельно, не полностью понимая, что они делают, и в итоге оставили в процессе зияющие дыры в безопасности. Будьте умны, используйте отлаженную реализацию кого-то другого, используйте свое драгоценное время для реализации тех частей системы, которые вы не можете получить из другого места.

0 голосов
/ 07 апреля 2009

Это будет происходить всякий раз, когда mCount [0] отрицателен перед добавлением, и если само добавление не переполняется.

...