Алгоритм SHA (Secure Hash Algorithm) разработан в США как часть стандарта SHS (Secure Hash Standard), опубликованного в 1993 году. Но в нем были обнаружены уязвимости, которые привели к необходимости модифицировать алгоритм. Через два года была опубликована новая версия —SHA-1, получившая на сегодняшний день широкое распространение.
Получая на входе сообщение произвольной длины менее 2м бит, SHA-1 формирует 160-битное выходное сообщение (дайджест). Вначале преобразуемое сообщение М дополняется до длины, кратной 512 битам. Заполнитель формируется следующим образом: в конец преобразуемого сообщения добавляется 1, потом — столько нулей, сколько необходимо для получения сообщения, которое на 64 бита короче, чем кратное 512, после чего добавляют 64-битное представление длины исходного сообщения. Например, сели сообщение длиной 800 бит, го 801-й бит = 1, потом добавляем нули до 960 бит, после чего в оставшихся 64-разрядах записывается число «800», в итоге хэшируем 1024-битное сообщение. Общая схема преобразования представлена на рис. 2.18. Перед началом преобразований инициализируется пять 32-битных переменных:
А = 0×67 452 301;
В = 0xEFCDAB89;
С = 0×98BADCFE;
D = Ох 10 325 476;
Е = 0xC3D2ElF0.
Эти значения присваиваются также переменным о0, /?(), с0, do, с0. Преобразование производится над блоком сообщения размером 512 бит в 80 раундов. В процессе преобразования используются следующие нелинейные функции ft:
f (X, Y, Z)=(XaY) vi (-X)AZ) для t = 0−19;
f (X, Y, Z)=X®Y (r)Z для t = 20−39 и t = 60−79;
f (X, Y, Z)=(XaY) v (XaZ) v (YaZ) для t = 40−59.
рования значений W,
Рис. 2.18. Схема раунда алгоритма SH А-1.
В процессе преобразования используются четыре константы:
Блок исходного сообщения М представляется в виде 16-ти 32- разрядных подблоков М0, …, М15, которые используются для формиW,=(W,.з (c) W,.8 Ф W,_ 14Ф Иф,6)"<1 для г = 16−79.
Обозначение ««< X» — циклический сдвиг влево на X разрядов, «+» — сложение по модулю 232.
После преобразования очередного 512-бигного блока полученные значения a, b, с, d, е складываются со значениями А, В, С, D, Е соответственно, и начинается обработка следующего блока (или полученное значение в виде сцепления a, b, с, d, е подается па выход, если обработанный блок был последним).
Таким образом, на выходе получаем 160-битный дайджест исходного сообщения.