Функция SHA-1 (Security Hash Algorithm) является стандартом для выработки цифровой подписи в США и ряде других стран.
Она получает на вход данные произвольной, в том числе и нулевой длины, а на выход выдает значение длиной 20 байт. Применительно к предыдущим обозначениям имеем, что L = 20 байт, а B = 64 байта.
Последовательность работы функции следующая.
Шаги 1 и 2 работы функции идентичны функции MD5.
3. Внутреннее состояние функции инициализируется стандартными значениями (здесь младшие байты идут первыми):
H0 = 0x01234567 H1 = 0x89ABCDEF
H2 = 0xFEDCBA98 H3 = 0x76543210
H4 = 0xF0E1D2C3
Для дальнейших вычислений также используются три функции, выполняющие побитные операции:
F1(X,Y,Z) = XY Ú`XZ
F2(X,Y,Z) = X xor Y xor Z
F3(X,Y,Z) = XY Ú XZ Ú YZ
Кроме того, применяются четыре константы:
K1 = 0x5A827999; K2 = 0x6ED9EBA1;
K3 = 0x8F1BBCDC; K4 = 0xCA62C1D6.
4. Исходное состояние функции меняется путем последовательной обработки блоков данных по 512 бит, которая выполняется на основе следующих соотношений (пп. 4-6).
Обозначим:
Wj – j-е слово из 32-х бит в блоке (т.е. от 0 до 15). Причем слово формируется с учетом порядка (сначала идут младшие байты);
N <<< s – циклический сдвиг слова N на s бит влево;
Å – сложение по модулю 232, т.е. при переполнении слова в 32 бита, соответствующий разряд просто игнорируется.
Текущее состояние функции переписывается для преобразований:
A = H0; B = H1; C = H2; D = H3; E = H4.
Вычисляются дополнительные 64 комбинации 32-х разрядных комбинаций:
Wi = (Wi–3 xor Wi–8 xor Wi–14 xor Wi–16) <<< 1; i = 16 … 79.
5. Для всех комбинаций Wi (i = 0 … 79) производятся последовательные вычисления:
T = (A <<< 5) Å F(B,C,D) Å E Å Wi Å K;
E = D; D = C; C = B <<< 30; B = A; A = T.
Причем для соответствующих номеров используются различные функции и константы, они указаны в табл. 9.5.
Таблица 9.5
Диапазон i
Функция
Константа
00 … 19
F1
K1
20 … 39
F2
K2
40 … 59
F3
K3
60 … 79
F2
K4
6. После преобразования вычисляется новое состояние хэш-функции:
H0 = A Å H0; H1 = B Å H1; H2 = C Å H2;
H3 = D Å H3; H4 = E Å H4.
7. Когда обработка последнего блока завершится, результатом хеширования будет состояние функции. Причем в порядке возрастания значимости байты следуют так: H0, H1, H2, H3, H4.