Шифр “Кузнечик” и язык Go
Update (20/02/19): реализовал преобразования блока на ассемблере для платформы x86-64/amd64, это даёт прирост производительности в несколько раз – доступна новая версия, использовать лучше её.
“Кузнечик” это новый российский блочный шифр, в прошлом году стандартизованный ГОСТ Р 34.12-2015. Шифр работает с блоками в 128 бит, ключ имеет длину 256 бит. (Текущим аналогом является шифр AES.) На досуге я реализовал “Кузнечик” на языке Go. Это, конечно, реализация пока далёкая от оптимальной и строгой (в смысле “криптокода”). Например, работа с блоками написана “побайтово”, не используются другие достаточно очевидные оптимизации и штатные языковые конструкции Go (я пока не очень освоился с данным языком). Так сказать, альфа-версия. Приветствуются комментарии, поправки. Возможно, имеет смысл развивать дальше.
Исходники выкладываю на dxdt.ru:
исходный код модуля grasshopper (Kuznyechik, GOST R 34.12-2015);
небольшая программа для проверки работоспособности (реализован стандартный вектор проверки и один дополнительный);
оба файла в .tar.gz.
(Внутри исходников комментарии на английском.)
Некоторые технические пояснения. Работу данного шифра можно ускорить, если использовать достаточно большие таблицы с предвычисленными преобразованиями. Именно этот вариант и реализован. Впрочем, функций Decrypt – две. Одна версия использует все таблицы, вторая – только одну, в которой содержатся предвычисленные значения линейного преобразования. Сами таблицы не содержатся в исходном коде, а вычисляются вызовом функции инициализации. В Go есть штатная библиотека, реализующая режим аутентифицированного шифрования GCM. Обычно этот режим используют в связке с AES, но годится и другой шифр подходящей разрядности. Соответственно, есть идея реализовать связку Kuznyechik-GCM, которая уже является практически полезным инструментом (update: реализовал режим GCM).
(Напомню, в скобках, что сам по себе блочный шифр, реализующий зашифрование/расшифрование, является лишь низкоуровневым элементом криптосистемы – применять его в отдельности, наивным образом, нельзя. Нужен правильный режим использования. Сейчас правильным режимом считается тот или иной режим аутентифицированного шифрования, превращающий блочный шифр в потоковый и снабжающий данные кодом аутентификации имитовставкой.)
Англоязычное пояснение:
This post describes GOST R 34.12-2015 Kuznyechik reference implementation in Golang. More comments – in Go source code for Kuznyechik. There is a different version available.
Адрес записки: https://dxdt.ru/2016/05/30/7951/
Похожие записки:
- Техническое: имена в TLS и Nginx
- Постквантовая "гибридизация" криптосистем и перспективы стойкости
- FTC про "неправильные" QR-коды
- Сдвиги времени в сертификатах Let's Encrypt
- Техническое: где в ECDSA эллиптическая кривая
- Персоны и идентификаторы
- Тест SSLLabs и X25519Kyber768
- TLS 1.3 в Рунете
- Новые криптосистемы на тестовом сервере TLS 1.3
- Боты и dxdt.ru
- Stack Overflow и OpenAI
Комментарии читателей блога: 5
1 <t> // 31st May 2016, 03:51 // Читатель Jeff Zanooda написал:
А смысл? В больших процессорах AES поддерживается аппаратно, а для маленьких есть Speck. Замечательный кстати блочный шифр, и по размеру кода и по скорости. Годится даже для генерации псевдослучайных чисел.
2 <t> // 31st May 2016, 14:36 // Читатель sarin написал:
осталось только уговорить всех пользователей, к коим относятся, например, налоговая инспекция, что AES – ок. желание иметь свой собственный, разработанный по известным критериям, шифр вполне понятно и обосновано.
сейчас реализации новых российских стандартов в области защиты информации востребованы. и будут востребованы ещё сильнее ввиду развития электронного документооборота. чужие реализации, особенно с использованием железа, конечно, хорошо. но иногда алгоритм должен работать целиком на том языке, на котором работает исходное приложение, а виртуальная машина может соответствующего API не содержать. когда надо зашифровать несколько килобайт хоть жаваскрипт сойдёт.
как-то раз обнаружил на джитхабе шесть копий репозитория релизации стрибога на джаве моего авторства (ну там кода Олександра Казимирова с си переписанного есть ;)). до этого два года был уверен, что проект заметил только гугловый бот.
так что представленная Вами реализация наверняка будет использована во множестве проектов.
вот только в шапке не смог найти ничего про условия использования.
и ещё, мне кажется, что если размещать такие вещи в каких-то популярных и жирных репозиториях, то больше людей смогут этот код найти и использовать.
3 <t> // 31st May 2016, 16:13 // Александр Венедюхин:
Как только (и если) доведу данный код до ума – попробую, конечно, продвинуть его дальше, в популярные репозитории.
4 <t> // 31st May 2016, 22:49 // Александр Венедюхин:
> А смысл?
В принципе, смысл только в том, что неплохо иметь выбор. “Кузнечик”, в отличии от предыдущих ГОСТовых шифров, выглядит довольно-таки современно. Конечно, по популярности ему с AES никак не сравниться, как и по степени, так сказать, исследованности, но некоторые всё же предпочитают российские шифры, по разным причинам. Более строго я не готов сформулировать. (Конкретно, в данном случае – я просто написал пример на Go, который ещё довольно серьёзно нужно дорабатывать.)
5 <t> // 2nd June 2016, 01:16 // Читатель Андрей П. написал:
Не нужно откладывать публикацию в github/bitbucket на потом. Сразу там – может, кто поправит уже на ранней стадии