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

Лабораторная работа 1.

Программирование учебной хеш-функции типа SHA-3


В настоящее время информационная безопасность стала неотъемлемой
частью любых цифровых операций. Ключевой роль в защите информации
играет понятие криптографической функции. Криптографические хеш-функции
— это выделенный класс хеш-функций, который имеет определённые
свойства, делающие его пригодным для использования в криптографии.
Преобразование, производимое хеш-функцией, называется
хешированием. Исходные данные называются входным массивом, «ключом»
или «сообщением». Результат преобразования (выходные данные)
называется хеш-кодом, хеш-суммой или просто хешем.
Иными словами, хеш-функция — это вычислительный метод, который
может отображать неопределенный размер данных в фиксированный размер
данных. Или, проще говоря, преобразование выводит числовое значение,
которое характеризуется входными данными. Криптографическая хэш-функция
использует необратимые (односторонние) математические функции, чтобы
сгенерировать хеш-значение из входных данных. Одним из распространенных
способов генерации криптографических хешей является использование
блочных шифров. К надежным с точки зрения криптографии хеш-функциям
должны быть предъявлены следующие основные требования:
Хеш-функция кандидата SHA-3 должна удовлетворять четырем условиям,
установленным NIST:
1. Хеш-функция кандидата должна быть реализована хорошо. Он
должен потреблять минимальные ресурсы, даже если хеширует большой
объем текста сообщения. Многие алгоритмы-кандидаты на самом деле не
могут удовлетворить это требование.
2. Подходящий алгоритм должен быть консервативным и безопасным.
Он должен противостоять известным атакам, сохраняя при этом высокий
коэффициент безопасности. Он должен иметь те же четыре размера хэша (224
бит, 256 бит, 384 бит или 512 бит), что и SHA-2, но при необходимости может
поддерживать более длинную разрядность хэша.
3. Алгоритм-кандидат должен принимать криптоанализ. Исходный код
и результаты анализа общедоступны для просмотра и комментариев
заинтересованными третьими сторонами. Любые дефекты, обнаруженные в
процессе анализа, должны быть устранены путем корректировки или
изменения конструкции.
4. Алгоритм-кандидат должен обеспечивать разнообразие кода. Он не
может использовать механизм Меркла-Дамгарда для генерации хэшей
сообщений.
История
Новый стандарт хеширования является последователем предшествующих
стандартов SHA-1 (принят в качестве национального стандарта США в 1995
году, длина хеша 128 бит) и SHA-2 (принят в качестве национального
стандарта США в 2002 году, переменная длина 224, 256 и 512 бит).
Ограничения SHA-1 и SHA-2
Оба стандарта SHA-1 и SHA-2 используют один и тот же механизм
обработки. Успешные атаки на SHA-1 повлияли также на безопасность SHA-2
при обработке текста сообщения. Возьмем пример с SHA-1: теоретически для
взлома методом грубой силы требуется как минимум 2 в 80-й степени (один
цикл цикла хеширования), чтобы столкнуться и взломать. Однако в феврале
2005 года Ван Сяоюнь (транслитерация) и его коллеги использовали атаки по
дифференциальному пути, чтобы завершить цикл коллизий цикла SHA-1 всего
с 2 до 69 степени. В августе 2008 года этот метод использовал Мартин. Кокран
подтвердил.
К 2012 г. Марк Стивенс использовал серию облачных серверов для
выполнения атаки по дифференциальному пути SHA-1. Коллизия атаки была
завершена в 58,5-й степени 2, и он оценил, что после 61-го цикла включения
питания хеш может быть сформирован.
Что касается SHA-2, атаки на хэши SHA-2 с ограниченным числом раундов
- единственная успешная категория. Атаки против 46 раундов SHA-2 (512-
битный вариант) и 41 раунда SHA-2 (512-битный вариант) являются наиболее
эффективными. Для взлома 256-битного варианта требуется 2253,6 цикла, а
для взлома 512-битного варианта - 2511,5 цикла.
Это одна из причин, почему NIST спонсировал конкурс SHA-3, который
также привел к разработке и внедрению Keccak.
В 2004—2005 годах несколько алгоритмов хеширования были атакованы,
в том числе были опубликованы серьезные атаки против алгоритма SHA-1,
утвержденного Национальным институтом стандартов и технологий (NIST). В
ответ NIST провел открытые семинары и 2 ноября 2007 года анонсировал
конкурс на разработку нового алгоритма хеширования. 2 октября 2012 года
победителем конкурса стал алгоритм Keccak и был стандартизован как новый
алгоритм SHA-3[6]. 5 августа 2015 года алгоритм утвержден и опубликован в
качестве стандарта FIPS 202[2][3].
Алгоритм был разработан Гвидо Бертони, Йоаном Дайменом, Жилем Ван
Аше из ST Microelectronics и Микаэлем Питерсом из NXP. Алгоритм основан на
более ранних хеш-функциях Panama и RadioGatún. Panama был разработан
Дайменом и Крейгом Клэппом в 1998 году, RadioGatún был реализован на
основе Panama Дайменом, Питерсом и Ван Аше в 2006 году. Основой
алгоритма Keccak является конструкция Sponge (Губка), которая является
новым способом проектирования хеш-функций.
Предыдущие функции были основаны на стратегии итерационного метода
Меркла — Дамгора, реализуемой в MD(x). Алгоритмы MD(x) основаны на
методе вычислений в цикле с использованием простых логических операций
типа OR, XOR, AND, NOT. поэтому становится возможным построение
коллизий с одинаковым, заранее выбранным префиксом. Однако, как показало
время алгоритмы MD(x) перестали быть безопасными из-за программ,
способных находить коллизии за сравнительно небольшое время.
В конкурсе SHA-3 в первый раунд оценки вошел 51 кандидатов. Из них 14
прошли во второй тур. В третьем раунде осталось всего 5 алгоритмов-
кандидатов. Из этих 5 победителем был объявлен Keccak (произносится как
«ket-chak»).
Перейдем к подробному рассмотрению одного из самых безопасных и
эффективных алгоритмов хеширования на сегодняшний день.
Губка — это итеративная конструкция для создания функции с
произвольной длиной на входе и произвольной длиной на выходе на основе
преобразований перестановки.
Алгоритм получения выходного значения хеш-функции с помощью
алгоритма SHA-3 можно разделить на несколько этапов:
Алгоритм
Алгоритм работает со строками S (state) фиксированной длины равной
b=25 ⋅ 2 , где 0 ≤ l≤ 6. Значит максимальное значение длины b=25 ⋅2 =1600. Эта
l 6

строка состоит из двух частей длины r и с ,r + с=b . Здесь r – это длина блока, на
которые разбивается исходное сообщение, а с – длина дополнительной части,
необходимой, чтобы к хеш-функции нельзя было применить атаку удлинения
сообщения, которым были подвержены предыдущие функции SHA-1 и SHA-2.
Хеш-функции семейства SHA-3 построены на основе конструкции
криптографической губки, в которой данные сначала «впитываются» в губку,
при котором исходное сообщение M подвергается многораундовым
перестановкам f, затем результат Z «отжимается» из губки.
На этапе «впитывания» блоки сообщения суммируются по модулю 2 с
подмножеством состояния, после чего всё состояние преобразуется с
помощью функции перестановки f.
На этапе «отжимания» выходные блоки считываются из одного и того же
подмножества состояния, изменённого функцией перестановок f. Размер части
состояния, который записывается и считывается, называется «скоростью»
(англ. rate) и обозначается r, а размер части, которая нетронута вводом /
выводом, называется «ёмкостью» (англ. capacity) и обозначается c .
Будем предполагать далее, что b=1600. Строка S представляется матрицей
размером 5 х 5 х 64. Алгоритм получения значения хеш-функции можно
разделить на несколько этапов:
1. Исходное сообщение M дополняется до строки P длины, кратной r, с
помощью функции дополнения (pad-функции).
2. Строка P делится на n блоков длины r:
3. «Впитывание»: каждый блок Pi дополняется нулями до строки длины b
бит и суммируется по модулю 2 со строкой состояния S длины b. Перед
началом работы функции все S равны нулю. Для каждого следующего
блока состояние — строка, полученная применением функции
перестановок f к результату предыдущего шага. Эта операция повторяет
l раз, где l – количество раундов перемешивания (обычно l=24 ).
4. «Отжимание»: пока длина Z меньше d - количества бит в результате хеш-
функции), к Z добавляется r первых бит состояния S, после каждого
прибавления к S применяется функция перестановок f. Затем Z
обрезается до длины d бит. Строка Z длины d бит возвращается в
качестве результата.
5. Строки Z, полученные от разных блоков, переводятся в числа и
суммируются по модулю 2d .

Таким образом, основой алгоритма служит функция перестановки f,


выполняющая преобразование строки длины 1600 бит, представленной
матрицей размером 5 х 5 х 64 , в такую же строку (матрицу). Функция содержит
несколько промежуточных преобразований: θ , ρ , π , χ ,ι .
Шаг θ .
Для всех iи k ,0 ≤ i<5 , 0 ≤ k < w, положим
C ( i , k )= A [ i ,0 , k ] ⊕ A [ i , 1 ,k ] ⊕ A [ i , 2 , k ] ⊕ A [ i, 3 , k ] ⊕ A [i, 4 , k ]
D ( i, k ) =C [ ( i−1 ) mod 5 , k ] ⊕ C [ ( i+1 ) mod 5 , ( k −1 ) mod w]

Для всех ( i , j, k ) , 0 ≤ i<5 , 0 ≤ j<5 , 0 ≤ k <w A' [ i , j , k ] = A [ i, j , k ] ⊕ D[i , k ]


Шаг ρ
Для всех k, 0 ≤ k < w A ' [0,0 , k ]= A [0,0 , k ]
Пусть первоначально (i,j)=(1,0). Для t от 0 до 23:
Для всех k, 0 ≤ k < w ,
A ' [i , j ,k ]= A ¿, (i , j)=¿
Шаг π
Для всех (i,j,k), 0 ≤ i<5 , 0 ≤ j<5 , 0 ≤ k <w A ' [i , j ,k ]= A [(i+ 3 j)mod 5 , i, k ]
Шаг χ
Для всех (i , j ,k ), 0 ≤ i<5 , 0 ≤ j<5 , 0 ≤ k <w
A [ i , j , k ] = A [ i, j , k ] ⊕¿
'

Шаг ι
Введем дополнительную функцию rc(t), где вход — целое число t, а выход -
бит. Если t mod 255=0, то возвращается 1. Пусть R=[10000000]. Для i от 1 до t
mod 255:
R=0∨¿ R
R [ 0 ] =R [ 0 ] ⊕ R [8 ]}
R [ 4 ] =R [ 4 ] ⊕ R[8]
R [ 5 ] =R [ 5 ] ⊕ R[ 8]
R [ 6 ] =R [ 6 ] ⊕ R [8]
R=Trun c 8 [R ]
Возвращается R [0 ].

Алгоритм ι( A , ir) i r — номер раунда.

Для всех (i , j ,k ), 0 ≤ i<5 , 0 ≤ j<5 , 0 ≤ k <w A ' [i , j ,k ]= A [i , j , k ]


Пусть RC — массив длины w, заполненный нулями. Для i от 0 доl:
RC [ 2 −1 ] =rc ( i+7 i r ) .
i

Для всех k, 0 ≤ k < w A' [ 0,0 ,k ] =A ' [ 0,0 , k ] ⊕ RC [k ]


Алгоритм перестановок
Для 12+2 l−nr ≤ ir ≤12+2 l−1 A ' =ι( χ (π ( ρ(¿ h eta( A)))) ,i r )

Пример реализации учебной функции хеширования h


(этот часть материала следующего задания)
1. Пусть параметры учебной функции будут меньше оригинальной.
Определим r =20 , c=25 , b=r + c=45=3 ×3 ×5.
2. Рассмотрим произвольное сообщение M, например,
M =' Laboratory work on hash functions '

Его длина равна 33 символам. В кодировке ASCII каждый символ


занимает 1 байт = 8 бит, поэтому все сообщение имеет длину L=33 ⋅ 8=264.
3. Переведем сообщение в битовую последовательность. Например,
первый символ ‘L’ имеет код ASCII 76, что соответствует
последовательности 10011002.
4. Дополним сообщение нулевыми битами до длины, кратной r=20, то есть
до 280. Итак у нас получится 14 блоков по 20 бит.
5. Рассмотрим первый блок: S = '10011001100001110001'. Первый элемент
имеет индекс 0, а последний – 19. Дополним блок S нулями до длины 45.
6. Разместим значения S в матрицу A размерности 3 ×3 ×5 . Элемент этой
матрицы A [ i , j , k ]=S [ i+ 3∗ j +9∗k ] . Например, A [ 3,2,1 ] =S [ 3+ 6+9 ]=S [ 18 ] =0
(предпоследний элемент исходного блока).
7. Определим далее функцию преобразования матрицы f (продолжение в
следующем задании).

Литература.
1. Алгоритм SHA-3 https://habr.com/ru/post/534082/
2. Федеральный стандарт NIST (англ.)
https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf
3. Ру-Википедия. Алгоритм SHA-3 https://ru.wikibrief.org/wiki/SHA-3
4. Ишмухаметов Ш.Т. Латыпов Р.Х., Столов Е.Л. Введение в теорию
кодирования и криптографию (часть 6).
5. https://kpfu.ru//staff_files/F_983962807/
Vvedenie_v_teoriyu_kodirovaniya_i_kriptorafiyu.pdf
6. Хеширование и SHA-256. Простыми словами и с примерами.
7. https://www.youtube.com/watch?v=xAVur2IV164&t=194s
8. https://keccak.team/files/Keccak-implementation-3.2.pdf
9. https://russianblogs.com/article/60561293587/
10. https://habr.com/ru/post/159073/
11. SHA-3 BitcoinWiki https://ru.bitcoinwiki.org/wiki/SHA-3
12. Алгоритм SHA-3 Хабр https://habr.com/ru/post/534082/
13. Новый стандарт шифрования SHA-3 – Keccak
14. https://russianblogs.com/article/60561293587/

Контрольные вопросы к описанию функции SHA-3


1. Что такое односторонние функции (one-way functions)?
2. Что является аргументом хеш-функции?
3. Что собой представляет выходное значение хеш-функции?
4. Какую длину имеет выходное значение и зависит ли оно от длины входа?
5. Какую длину имеют хеш-функции MD5, SHA-1 и SHA-2?
6. Что такое коллизии хеш-функции? Существуют ли хеш-функции без коллизий?
7. Является ли вычисление хеш-функции трудной вычислительной задачей?
8. Как можно вычислить значение аргумента хеш-функции по ее значению?
Например, пароль по его хешу?
9. В каких приложениях используются хеш-функции?
10.Какую роль играют хеш-функции в формировании электронной подписи?
11.В каком году была разработана функция SHA-3 и кто ее создатель?
12.В чем была необходимость создания функция SHA-3?
13.Чем отличается функция SHA-3 от SHA-1 и SHA-2?
14.Какую длину может иметь выходное значение SHA-3?
15.На блоки какой длины разбивается сообщение в SHA-3?
16.Сколько раундов преобразования выполняется для каждого блока?
17.Какие предопределенные параметры используются при выполнении этих
преобразований?
18.Какой размер имеет матрица состояний S?
19.Почему алгоритм называется губкой (dongee)?
20.Что происходит на стадии Absorbing dongee (наполнение губки) и на стадии
Squeezing (Выжимание губки)?
21.В каких приложениях используется SHA-3?

Вам также может понравиться