1. Процедура save_abc сохраняет значения в Hi
aa = a;
bb = b;
cc = c.
2. Процедура pass(a, b, c, mul) выполняет следующие действия:
round (a, b, c, x0, mul);
round (b, c, a, x1, mul);
round (c, a, b, x2, mul);
round (a, b, c, x3, mul);
round (b, c, a, x4, mul);
round (c, a, b, x5, mul);
round (a, b, c, x6, mul);
round (b, c, a, x7, mul).
3. Процедура round (a, b, c, x, mul) выполняет следующие действия:
c ^= x;
a -= t1[c_0] ^ t2[c_2] ^ t3[c_4] ^ t4[c_6];
b += t4[c_1] ^ t3[c_3] ^ t2[c_5] ^ t1[c_7];
b *= mul;
где c_i – это i -ый байт регистра c (0≤ i ≤7), b_i – это i -ый байт регистра b, где a_i – это i -ый байт регистра a.
x0,x1,x2,…,x7 – 64-хбитные блоки.
В алгоритме необходимо инициализировать блоки S (t1, t2, t3, t4)
Каждый из четырех 64-битовых S-блоков содержит 256 элементов:
S1,0, S1,1, …, S1,255
S2,0, S2,1, …, S2,255
S3,0, S3,1, …, S3,255
S4,0, S4,1, …, S4,255
Блоки инициализируются. Эта строка состоит из шестнадцатеричных цифр pi (меньше начальной тройки).
Например:
S1,0 = 0x243f6a8808d31319
S1,1 = 0x85a308d3243f6ad3
S1,2 = 0x123198a2e5a308d3
и т. д.
4. Процедура key_schedule выполняет следующие действия:
x0 -= x7 ^ 0xA5A5A5A5A5A5A5A5;
x1 ^= x0;
x2 += x1;
x3 -= x2 ^ ((~x1)<<19);
x4 ^= x3;
x5 += x4;
x6 -= x5 ^ ((~x4)>>23);
x7 ^= x6;
x0 += x7;
x1 -= x0 ^ ((~x7)<<19);
|
|
x2 ^= x1;
x3 += x2;
x4 -= x3 ^ ((~x2)>>23);
x5 ^= x4;
x6 += x5;
x7 -= x6 ^ 0x0123456789ABCDEF;
5. Процедура feedforward выполняет следующие действия:
a ^= aa;
b -= bb;
c += cc;
Рис. Таблица хеширования
Таблица хеширования описывает функцию Tiger. Переменные y0, y1,..., y7 и z0, z1,..., z7 определяют значения x0, x1,..., x7 на втором и третьем этапах, соответственно. В итоге, значения регистров состояния Hn является выходным значением Tiger/192.
RipeMD
RIPEMD один из алгоритмов криптографического хэширования.
Имеет длину результирующего дайджеста 128 или 160 бит. Разработан Hans Dobbertin, Antoon Bosselaers и Bart Preneel (http://homes.esat.kuleuven.be/~bosselae/ripemd160.html).
Из-за проблем, связанных с MD4 и MD5, европейская организация RACE Integrity Primitives Evaluation (RIPE) разработала стандарт RIPEMD-160. Он также был разработан на основе MD4, но генерирует дайджест длиной 160 бит. Однако так же как и SHA-1, этот алгоритм значительно менее эффективен, чем MD5.
Пример: В обоих примерах хэш-функций, закодирван символ "a".
RIPEMD-128 | 86be7afa339d0fc7cfc785e72f578d33 |
RIPEMD-160 | 0bdc9d2d256b3ee9daae347be6f4dc835a467ffe |
Haval
HAVAL — это однонаправленная хэш-функция переменной длины. Функция HAVAL (Y. Zheng, J. Pieprzyk, J. Seberry) является модификацией функции MD5. Алгоритм HAVAL обрабатывает сообщение блоками размером в 1024 разряда, что в два раза больше, чем в алгоритме MD5. В HAVAL используется восемь 32-разрядных переменных сцепления, то есть в два раза больше, чем в MD5, и переменное число раундов обработки, от трех до пяти (на каждом раунде исполняется 16 шагов). Функция HAVAL может выдавать хэш-значения размером в 128, 160, 192, 224 или 256 разрядов (Haval128, Haval160, Haval192, Haval224, Haval256).
В алгоритме HAVAL простые нелинейные функции MD5 заменены сильно нелинейными функциями 7 переменных, каждая из которых удовлетворяет строгому лавинному критерию. На всех раундах применяется одна функция, но на каждом шаге к входным данным применяются различные операции перестановки. Используется новый порядок обработки сообщения, и на каждом шаге (за исключением первого раунда) используется своя прибавляемая константа. Также в алгоритме используются два циклических сдвига. Сердцевиной алгоритма являются такие операции:
|
|
TEMP = (f(j,A,B,C,D,E,F,G) < < 7) + (H < < < 11) + M[i][r(j)] + K(j)
H = G;G = F;F = E;E = D;D = C;C = B;B = A;A = TEMP
Переменное количество раундов и переменный размер вычисляемого алгоритмом значения означают, что существует 15 версий алгоритма. Атака на алгоритм MD5, выполненная ден Боером и Босселаерсом (англ.), не применима к алгоритму HAVAL, из-за наличия в нем операции циклического сдвига.
http://www.nic.funet.fi/pub/crypt/hash/haval/haval-hash.c
CRC
Алгоритм вычисления контрольной суммы (CRC, англ. cyclic redundancy check, проверка избыточности циклической суммы) — способ цифровой идентификации некоторой последовательности данных, который заключается в вычислении контрольного значения её циклического избыточного кода. Популярность КС обусловлена тем, что подобная проверка просто реализуема в двоичном цифровом оборудовании, легко анализируется, и хорошо подходит для обнаружения общих ошибок, вызванных наличием шума в каналах передачи данных.
Принцип КС основан на использовании свойств двоичного многочлена, в виде которого представляется исходная битовая последовательность блока данных. При этом каждый бит такой последовательности соответствует одному из полиномиальных коэффициентов. Так, к примеру, десятичное число 90 (1011010 в двоичной записи) соответствует многочлену следующего вида:
P(x) = 1 * x6 + 0 * x5 + 1 * x4 + 1 * x3 + 0 * x2 + 1 * x1 + 0 * x0
Подобным же образом в виде многочлена может быть представлен любой из блоков обрабатываемых данных.
При вычислении контрольного кода по методу КС используется свойство поведения многочленов, позволяющее выполнять с ними любые арифметические действия. Контрольный код рассчитывается, как остаток от деления по модулю 2 многочлена полученного из исходной битовой последовательности на некоторый другой заранее определённый многочлен (такой многочлен называется порождающим или примитивным).
R(x) = P(x) * xrmodG(x)
где
R(x) — контрольный код многочлена P(x).
P(x) — исходный многочлен.
G(x) — порождающий многочлен.
r — степень порождающего многочлена.