Во первых, сообщение дополняется, чтобы его длина была кратной 512 битам . Используется то же дополнение, что и в MD5: сначала добавляется 1, а затем нули так, чтобы длина полученного сообщения была на 64 бита меньше числа, кратного 512, а затем добавляется 64-битовое представление длины оригинального сообщ е-ния.
Инициализируются пять 32-битовых переменных (в MD5 используется четыре переменных, но рассматриваемый алгоритм должен выдавать 160-битовое хэш-значение):
А = 0x67452301
В = 0xefcdab89
С = 0x98badcfe
D = 0x10325476
£ = 0xc3d2elfO
Затем начинается главный цикл алгоритма. Он обрабатывает сообщение 512-битовыми блоками и продолжается, пока не исчерпаются все блоки сообщения.
Сначала пять переменных копируются в другие переменные : Ав а,В в Ь, Св c, Db duE в е.
Главный цикл состоит из четырех этапов по 20 операций в каждом (в MD5 четыре этапа по 16 операций в каждом). Каждая операция представляет собой нелинейную функцию над тремя из а, Ъ, с, d и е, а затем выполняет сдвиг и сложение аналогично MD5. В SHA используется следующий набор нелинейных функций :
f,(X,Y,Z) = (1л Y) v ((Х) л Z) , для t=0 до 19
f,(X,Y,Z) = X®Y®Z , для t=20 до 39
ft(X,Y,Z) = (1л Y) v(Xa Z)v(YaZ) , для г=40 до 59
f,(X,Y,Z) = Х® Y® Z , для t=60 до 79
в алгоритме используются следующие четыре константы:
К, = 0х5а827999, для г=0 до 19
К, = 0x6ed9ebal , для t=20 до 39
К, = 0x8flbbcdc, для t=40 до 59
К, = 0xca62cld6, для t=60 до 79
(Если интересно, как получены эти числа, то :0х5а827999 = 21/2/4, 0x6ed9ebal = 31/2/4, OxSflbbcdc = 51/2/4, 0xca62cld6 = 101/2/4.)
Блок сообщения превращается из 16 32-битовых слов (М0 по М15) в 80 32-битовых слов (W0 no W19) с помощью следующего алгоритма:
^ = М(,дляг = 0по 15
Wt = W_3 © W,* ® Wt.u® WtA6) <« 1, для t = 16 по 79
(Вкачестве интересного замечания, в первоначальной спецификации SHA не было циклического сдвига вле-
во. Изменение "исправляет технический изъян, который делал стандарт менее безопасным, чем предполагалось " 1543]. NSA отказалось уточнить истинную причину изъяна.)
Если t - это номер операции (от 1 до 80), W, представляет собой г-ый подблок расширенного сообщения, а <«s - это циклический сдвиг влево на s битов, то главный цикл выглядит следующим образом :
FOR t = 0 to 79
TEMP = (а <<< 5) + f,(b,c,d) + e + Wt + Kt
e = d
d = c
c = b <« 30
b = a
a = TEMP
Ha 11-й показана одна операция. Сдвиг переменных выполняет ту же функцию, которую в MD5 выполняет использование в различных местах различных переменных .