Вы находитесь на странице: 1из 3

JH — семейство из четырёх криптографических хеш-функций: JH-224, JH-256, JH-384 и JH-

512.
Алгоритмы этих хеш-функций отличаются только значением одного внутреннего параметра —
длины (в битах)  выходного значения (которая и указана после дефиса в названии). Далее в
статье при описании алгоритма я буду считать этот параметр частью входных данных для
удобства, говоря о JH, как об одном алгоритме или одной хеш-функции.
Хеш-функция JH входит в пятёрку финалистов второго тура SHA-3. В процессе этого конкурса
она была улучшена. В статье рассматривается последняя на данный момент версия, которую
также можно назвать JH42 (так как главное изменение состояло в том, что число раундов в
функции компрессии стало равно 42). Дата выхода документации по ней — 16 января 2011
года.
При хешировании входное сообщение дополняется и разделяется на части, которые далее
последовательно обрабатываются так называемой функцией компрессии. Эта функция
описана в спецификации в общем виде — то есть с переменным параметром d, меняя
который можно конструировать JH-подобные хеш-функции (тем более криптостойкие, чем
больше d). В JH исходно d=8.
При выборе финалиста в конкурсе SHA решающую роль играют не криптографические
характеристики (они у всех функций отличные), а гибкость и оптимальность в программной и
аппаратной реализации. На тему аппаратной реализации существует много исследований,
например[1].

Содержание

 1Алгоритм[2]

o 1.1Уточнения
 1.1.1О названии элементов битовых векторов
 1.1.2Обозначение конкатенации
o 1.2Используемые функции — обобщённый случай
 1.2.1S-box  —  Si(x)

 1.2.2Линейное преобразование пар ячеек —  L(A,B)


 1.2.3Перемешивание  —  Pd

 1.2.4Преобразование-раунд —  Rd(A,C)
 1.2.5Преобразование  Ed

 1.2.6Функция свёртки  Fd(H,M)


o 1.3Используемые функции — адаптация к аппаратной реализации при d=8
 1.3.1Выражение преобразования L через простые операции с битами
 1.3.2Константы  H0  при разных  lhash

 1.3.3Константы  C  раундов  R8

 1.3.4Позиции полубайтов после перемешивания  P8

o 1.4Используемые функции — адаптация к программной реализации при d=8


 1.4.1примеры реализации на языке C
 1.4.2Функция  SBox
 1.4.3Функция  LinTrans
 1.4.4Функция  Permutation
 1.4.5Функция E8, адаптированная к программной реализации
o 1.5Исходные данные
 1.5.1Входной параметр
 1.5.2Входное сообщение
o 1.6Алгоритм вычисления JH(M0)
 2Криптоанализ
 3См. также
 4Примечания
 5Ссылки
Алгоритм[2][править | править код]
Уточнения[править | править код]
О названии элементов битовых векторов[править | править код]
Будем считать, что у всех обсуждаемых тут битовых векторов есть начало и конец, причём
бит, расположенный в начале (слева) является первым, имеет позицию 0 и
считается наиболее значимым, соответственно, бит, расположенный в конце (справа),
является последним, имеет позицию с наибольшим номером, на один меньшим, чем число
разрядов вектора, и считается наименее значимым.
То же самое, за исключением номера позиции, будем подразумевать для векторов, состоящих
из битовых векторов, например, для сообщения, состоящего из блоков, или блока, состоящего
из полубайтов. С номером же позиции какой-либо составной части битового вектора,
состоящей из нескольких бит, будет путаница, создаваемая для удобства. Так, номера
позиций полубайтов в блоке будут начинаться с нуля, а номера позиций блоков в
сообщении — с единицы…

Пример[показать]

Обозначение конкатенации[править | править код]


Пусть вектор  состоит из последовательно идущих векторов , тогда этот факт будет
обозначаться так: 

Используемые функции — обобщённый случай[править | править


код]
Здесь описаны функции, с помощью которых можно строить JH-подобные алгоритмы, меняя
параметр 
S-box —  Si(x)[править | править код]
Это функция, преобразующая s-блок (то есть размеры её входного и выходного значений
одинаковы и равны 4 битам). В алгоритме используются 2 таких функции:  и . Их таблицы
значений такие:

0 1 2 3 4 5 6 7 8 9 a b c d e f

9 0 4 b d c 3 f 1 a 2 6 7 5 8 e

3 c 6 d 5 7 1 9 f 2 0 4 b a e 8

Линейное преобразование пар ячеек —  L(A,B)[править | править код]


Эта функция преобразует пару s-блоков (то есть размеры её входного и выходного значений
одинаковы и равны 8 битам). Наиболее лаконичную запись она имеет в терминах конечных
полей многочленов.
Рассмотрим конечное поле многочленов над  степени не выше 3-ей. Оно изоморфно полю ;
установим стандартное для таких случаев соответствие межу полем многочленов и полем
чисел: многочлен будет соответствовать числу, равному значению многочлена при . Выберем
для этого поля многочленов следующий примитивный многочлен:
.
Тогда, если рассматривать , как функцию, преобразующую 2 многочлена, а числа и буквы —
как многочлены, то
,
где «» и «» — операции умножения и сложения в данном поле многочленов.
Перемешивание —  Pd[править | править код]
Функция  является композицией трёх более простых перемешиваний, преобразующих массив
из  битовых векторов (то есть размеры их входных и выходных значений одинаковы и
равны  битам, где  — число бит в одном элементе этого массива):
Приведем алгоритмы этих перемешиваний, обозначив за  и  (где  и  — битовые векторы
одинакового размера для всех ) — входной и выходной векторы соответственно:
 :
 :
 :
Преобразование-раунд —  Rd(A,C)[править | править код]
На вход подается - мерный вектор . Выход — - мерный вектор. Так же
на вход подается -битная константа .
Вектор  представляется в виде массива из  полубайт: .
Потом над каждым полубайтом  производится преобразование  или  в
зависимости от значения  (если , то , иначе — )
Далее над каждой парой вида  производится линейное
преобразование .
И в конце концов результаты опять группируются в вектор, биты
которого подвергаются перемешиванию .
Это выражается в виде формулы:
Преобразование  Ed