2009-04-07 7 views
1

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

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

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

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

Благодаря

ответ

8

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

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

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

5

Это для переноса носителей, сумма длины * 8 хранится в двух 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) 
+0

Извините, но вы можете пойти [здесь] (http://chat.stackoverflow.com/rooms/56213/room-for-user2284570-and-eric-bainville), пожалуйста? – user2284570

0

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

+0

-1: mCount - это неподписанный int, и код фактически переносит переполнение на высокий int –

0

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

+0

К счастью для моего здравомыслия, я использовал RSA-реализацию алгоритма. Проблема в том, что, несмотря на то, что это хорошо известная и используемая реализация, мне все равно пришлось модифицировать некоторые небольшие части кода - хотя бы простые детали - чтобы соответствовать нашим рекомендациям и доказать 100% -ный охват кода. Хороший совет, хотя я, конечно, не сторонник повторного изобретения колеса. –

0

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

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

Смежные вопросы