128-битные значения на 64-битной архитектуре в C - PullRequest
0 голосов
/ 25 января 2012

Я дополняю SHA-512 на 64-битной архитектуре Linux в C. SHA-512 принимает 128 битов в качестве длины данных для хеширования. В настоящее время я беру два 64-битных длинных, чтобы получить 128-битное значение, но я намеренно помещаю нули в первые 64 бита, а длина сохраняется в оставшихся младших 64 битах. Почему я это делаю?

Ну, я думаю, что на 64-битных архитектурах я, вероятно, никогда не получу значение больше 2 ^ 64, или я могу? Является ли это правильным способом реализации SHA-512 на 64-битной архитектуре или есть какой-то способ обслужить 128-битные значения на 64-битных архитектурах, которых я не знаю? Следует отметить, что я внедряю SHA-512 в соответствии с FIPS 180-3.

Любая помощь будет очень ценной.

Привет

Ответы [ 2 ]

1 голос
/ 25 января 2012

Я надеюсь, что под "64-разрядными длинными целыми числами" вы действительно подразумеваете длинные беззнаковые целые числа ... Серьезно, не делайте свою собственную реализацию SHA-512, пока полностью не поймете, как выполняется арифметика bigint с использованием меньших целых чисел.

Если вы хотите реализовать что-то соответствующее, то используйте 128-битный полный.Если вы используете один единственный вызов функции для хеширования всего блока, вам вряд ли понадобятся полные 128 бит, 64 будет в порядке.Но чтобы соответствовать, вы должны разрешить хэшировать полный блок в пакетах.Таким образом, у вас есть 3 функции, подобные этим:

Init - Инициализирует внутреннее состояние для следующего хэширования.

Add - добавляет блок данных к текущему хэшированию с внутренней буферизацией неполных блоков ивнутренний счет 128-битного размера.Он занимает блок памяти, поэтому чистый интерфейс в стиле C будет использовать size_t для количества байтов.Тем не менее, 64-разрядное целое число без знака достаточно хорошо для предполагаемой цели и упрощает подсчет.

Готово - выполняет заполнение, завершает хеширование и возвращает окончательное значение хеш-функции.

Очевидно, этоДля подхода требуется дополнительная внешне видимая структура для хранения текущего состояния.

1 голос
/ 25 января 2012

128-битные целые числа в GCC

В качестве расширения целочисленный скалярный тип __int128 поддерживается для целей, имеющих целочисленный режим, достаточно широкий, чтобы удерживать 128-битные.Просто напишите __int128 для 128-разрядного целого числа со знаком или unsigned __int128 для 128-разрядного целого числа без знака.В GCC нет поддержки для выражения целочисленной константы типа __int128 для целей, имеющих длинное длинное целое число с шириной менее 128 бит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...