Является ли обмен uint32 на uint64 доброкачественным, кроме (возможно) использования памяти? - PullRequest
1 голос
/ 24 апреля 2019

Фон

Недавно я обнаружил, что хеши md5 на больших R объектах, использующих пакет digest, не менялись при внесении небольших изменений. По-видимому, это связано с переполнением некоторых 32-битных переменных счетчика и отсутствием измененной части файла в алгоритме.

Используя текущую версию разработки digest для Linux, хэши замечают эти небольшие изменения в больших файлах, тогда как в Windows эти небольшие изменения пропускаются.

Я внес следующие изменения в текущую версию разработчика, которая поменяла местами несколько unsigned long int (unit32) переменных для unsigned long long int (uint64) переменных:

https://github.com/eddelbuettel/digest/compare/master...kendonB:testmd5

и теперь в Windows проблема исправлена, и хэши замечают изменения.

Вопрос

Доброкачественная ли замена этих 32-битных целочисленных переменных на 64-битные целочисленные переменные? Будет ли что-нибудь разрушено в 32-битных системах? На непонятных системах? Что-нибудь может пойти не так?

Дальнейший фон

https://github.com/eddelbuettel/digest/issues/97

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

MD5-хэш строки - это уникальное четко определенное значение, которое является важной особенностью MD5-хеша.Это позволяет использовать его для проверки.(Хотя криптографическое использование MD5 уже давно устарело.)

Так что, если определенная библиотека выдает неправильное хеш-значение, это ошибка, и она довольно серьезная, и об этом следует сообщать об этомавтор пакета.Существуют эталонные реализации хеша MD5, которые можно использовать для получения правильного значения хеша, но весьма вероятно, что команда md5sum также будет правильной, что может быть более простой проверкой.

Это, безусловно,Возможно, что рассматриваемая ошибка, если вы можете убедиться, что это ошибка, является результатом неожиданного 32-разрядного целочисленного переполнения.Но изменение крипто-библиотек - это не случайная работа, даже ошибочные реализации устаревших алгоритмов.«Кажется, работает», как правило, не является адекватной проверки алгоритма.Я бы предостерег от использования неподтвержденной модификации.Но это полезный совет для сопровождающего библиотеки.

0 голосов
/ 24 апреля 2019

В 32-разрядной системе 64-разрядное целое число обычно реализуется с использованием двух 32-разрядных регистров. Операции над таким целым числом приводят к двум инструкциям для загрузки и сохранения. Для чего-то вроде сложения используется add with carry. Об этом заботится компилятор.

Вы должны только убедиться, что используемый вами компилятор поддерживает такой тип.

Например, подписанные и неподписанные версии long long int (которые должны быть не менее 64 бит) были введены в C99. Поэтому вы должны использовать компилятор, поддерживающий эту функцию стандарта C99.

...