Шифр “Кузнечик” и язык 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/

Похожие записки:



Далее - мнения и дискуссии

(Сообщения ниже добавляются читателями сайта, через форму, расположенную в конце страницы.)

Комментарии читателей блога: 5

  • 1. 31st May 2016, 03:51 // Читатель Jeff Zanooda написал:

    А смысл? В больших процессорах AES поддерживается аппаратно, а для маленьких есть Speck. Замечательный кстати блочный шифр, и по размеру кода и по скорости. Годится даже для генерации псевдослучайных чисел.

  • 2. 31st May 2016, 14:36 // Читатель sarin написал:

    осталось только уговорить всех пользователей, к коим относятся, например, налоговая инспекция, что AES – ок. желание иметь свой собственный, разработанный по известным критериям, шифр вполне понятно и обосновано.

    сейчас реализации новых российских стандартов в области защиты информации востребованы. и будут востребованы ещё сильнее ввиду развития электронного документооборота. чужие реализации, особенно с использованием железа, конечно, хорошо. но иногда алгоритм должен работать целиком на том языке, на котором работает исходное приложение, а виртуальная машина может соответствующего API не содержать. когда надо зашифровать несколько килобайт хоть жаваскрипт сойдёт.

    как-то раз обнаружил на джитхабе шесть копий репозитория релизации стрибога на джаве моего авторства (ну там кода Олександра Казимирова с си переписанного есть ;)). до этого два года был уверен, что проект заметил только гугловый бот.

    так что представленная Вами реализация наверняка будет использована во множестве проектов.

    вот только в шапке не смог найти ничего про условия использования.

    и ещё, мне кажется, что если размещать такие вещи в каких-то популярных и жирных репозиториях, то больше людей смогут этот код найти и использовать.

  • 3. 31st May 2016, 16:13 // Александр Венедюхин ответил:

    Как только (и если) доведу данный код до ума – попробую, конечно, продвинуть его дальше, в популярные репозитории.

  • 4. 31st May 2016, 22:49 // Александр Венедюхин ответил:

    > А смысл?

    В принципе, смысл только в том, что неплохо иметь выбор. “Кузнечик”, в отличии от предыдущих ГОСТовых шифров, выглядит довольно-таки современно. Конечно, по популярности ему с AES никак не сравниться, как и по степени, так сказать, исследованности, но некоторые всё же предпочитают российские шифры, по разным причинам. Более строго я не готов сформулировать. (Конкретно, в данном случае – я просто написал пример на Go, который ещё довольно серьёзно нужно дорабатывать.)

  • 5. 2nd June 2016, 01:16 // Читатель Андрей П. написал:

    Не нужно откладывать публикацию в github/bitbucket на потом. Сразу там – может, кто поправит уже на ранней стадии

Написать комментарий

Ваш комментарий:

Введите ключевое слово "4Q5R2" латиницей СПРАВА НАЛЕВО (<--) без кавычек: (это необходимо для защиты от спама).

Если видите "капчу", то решите её. Это необходимо для отправки комментария ("капча" не применяется для зарегистрированных пользователей). Обычно, комментарии поступают на премодерацию, которая нередко занимает продолжительное время.