Комментарии 64
void gen_gamma(struct gost_ctx_t *ctx)
{
ctx->n4 = ctx->n4 + C1;
ctx->n3 = ((u64) ctx->n3 + C2) % 0xffffffff;
ctx->n1 = ctx->n3;
ctx->n2 = ctx->n4;
encrypt_block(&ctx->n2, &ctx->n1, ctx);
}
В стандарте своеобразная трактовка операции сложения по модулю
2^32-1
. Должно быть:a + b (mod 2^32) ::= { a + b, if (a + b) < 2^32; a + b - 2^32, elsewhere }
a + b (mod 2^32 - 1) ::= { a + b, if (a + b) < 2^32; a + b - 2^32 + 1, elsewhere }
К сожалению, это частая ошибка при реализации ГОСТ 28147-89.
Вот обсуждение этой проблемы, найденной мной в gostcrypto:
github.com/rudonick/crypto/issues/1
С Магмой тоже находимся в непонимании — то ли 89-й гост, то ли что-то новое. Ещё до стандартизации ставили вопрос о порядке байтов, но что-то вменяемого нам никто не ответил.
1) Про тестовые примеры. Есть ошибочные контрольные примеры в ТК26TLS, изменения в документе с исправленными примерами должны быть утверждены на весеннем заседании ТК 26. Вы где-то еще ошибки находили?
2) Не могли бы Вы уточнить по поводу «корявости» документов? Практика создания документов «патчей» к стандартам (как ТК26TLS) себя изживает, новые документы ТК 26 создаются самодостаточными (ТК26АЛГ, ТК26ECC, ТК26SESPAKE). Какие есть предложения?
3) Магма, как неоднократно озвучивалось, это ГОСТ 28147-89 с фиксированными узлами замены из ТК26УЗ.
2) Одно из предложений — дать возможность публичного обсуждения проектов, разместив текстовые документы на github (или поднять на ТК26 gitlab). Учитывать комментарии, принимать пулл-реквесты (закрытй форум это конечно хорошо, но не всегда). Публиковать окончательные документы в txt-виде как основном. Во многих проектах, связанных с ASN.1 структурами и расширением стандартных структур/контейнеров есть неоднозначные моменты. Принимать исправления и выпускать errata как для RFC. То есть в целом наладить похожий, открырый для сообщества процесс.
3) Ниже про Магму откомментировали уже. Рекомендации типа, — «внимательно читайте стандарт», — это конечно хорошо, но стандарт он на то и стандарт, что должен быть в достаточной степени однозначным и недвусмысленным. Мы же не юриспруденцией занимаемся :-)
2) Вы правы в том, что в настоящий момент процесс избыточно закрыт. Но полную открытость обеспечивать тоже вредно – сотни школьников в комментариях утопили не одно благое дело с обсуждениями документов. А если Вы работаете в сфере ИБ и есть желание подключиться к процессу – это нетрудно сделать через секретариат ТК 26.
3) Вы в чем-то, конечно, правы, учитывая количество ошибочных из-за переворота байтов реализаций — даже крупные компании (не будем называть конкретно) предварительные релизы своих продуктов выпускали с подобными ошибками. Но, как я прокомментировал ниже, оба варианта указания данных имеют проблемы.
Данные тестовые вектора сформированы по аналогии с тестовыми векторами из RFC6070 [6] для алгоритма хэширования ГОСТ Р34.11-2012 512 бит [4].
Input:
P = "password" (8 octets)
S = "salt" (4 octets)
c = 1
dkLen = 64
DK = bc d1 9a 1c 42 3a 63 e7 2e 47 ef 0f 56 56 6c 72 67 45 d9 6a c1 a1 c1 27 b2 ed ad b4 5f b4 5b 30 7a ca 15 99 9e 91 f6 40 f4 81 8f 68 af 71 6e 30 fd 54 3c 52 02 6b bb 29 5d 10 0e b4 71 33 9f 46
Мой результат:
64 77 0a f7 f7 48 c3 b1 c9 ac 83 1d bc fd 85 c2 61 11 b3 0a 8a 65 7d dc 30 56 b8 0c a7 3e 04 0d 28 54 fd 36 81 1f 6d 82 5c c4 ab 66 ec 0a 68 a4 90 a9 e5 cf 51 56 b3 a2 b7 ee cd db f9 a1 6b 47
Все тестовые данные в новых стандартах, действительно, приведены «с переворотом байтов». Ошибкой (с формальной точки зрения) это не является, так как в начале стандарта в обозначениях это явно указано. Удобно это или нет? Для реализации, разумеется, нет (приходится переворачивать все входы и выходы), для формальной корректности стандарта и упрощения описания – в чем-то удобно. Разумеется, Магма в точности совпадает с ГОСТ 28147-89 с узлами замены ТК26-Z из соответствующих Рекомендаций ТК-26.
Весьма много разработчиков первые реализации новых ГОСТов выкатывают ошибочные, с переворотом байтов. Так что определенная проблема, действительно, есть, но рекомендация тут только одна — внимательно читать стандарт.
В документах ТК 26, замечу, все данные в основном приведены в little-endian, без переворотов. Но из-за этого в тексте иногда встречаются неочевидные обозначения.
Во-вторых, никто ни разу не говорил, что от старого ГОСТа были унаследованы режимы работы. Хоть ГОСТ Р 34.12-2015 и совпадает с ГОСТ 28147-89 в версии «Магма», но режим имитовставки в ГОСТ Р 34.13-2015 введен другой. Кроме того, другой в ГОСТ Р 34.13-2015 используется и режим гаммирования.
В-третьих, насчет реализации на сайте ТК 26, все же давайте не путать стандарты и тестовые реализации. Если видите ошибку, так потратьте чуток времени, напишите авторам. Поверьте, никто ошибочную реализацию отстаивать не будет, если ошибки и впрямь есть.
По поводу RFC, авторы всех российских проектов всегда будут рады критике. Навскидку, сейчас по линии IETF у российских коллег идет работа по двум проектам RFC: по сопутствующим алгоритмам и по протоколу SESPAKE. Присоединяйтесь, пишите авторам на почту, критикуйте, предлагайте коррективы – участвуйте.
Писать по стандартам ГОСТ Р 34.1х-2015 можно на находящийся в ведении ИнфоТеКСа секретариат ТК 26 (лучше сразу попросить перенаправить на конкретных авторов), по документам по сопутствующим алгоритмам и SESPAKE – например, напрямую Станиславу Смышляеву из КРИПТО-ПРО (кстати, утвержденные российские версии документов по алгоритмам и по SESPAKE ТК 26 выложило на своем сайте).
Весьма много разработчиков первые реализации новых ГОСТов выкатывают ошибочные, с переворотом байтов.О, я тоже наступил на эти грабли! Вопрос как от неспециалиста в теории криптографии: уступает ли реализация с кривым порядком байт правильной, с точки зрения надёжности-безопасности?
github.com/sftp/gost28147/commit/bb382c79c954ff413b633fab4a511afd43ce150a
В куске про ЭЦП надо уточнять, поддерживается ли версия -2012 года, с размером ключа 512 бит.
Про 28147-89/Р 34.11-94. Их много кто поддерживает, но не много где есть возможность использовать разные S-BOX.
Было бы интересно посмотреть криптоанализ, а также анализ на типичные ошибки при реализации криптографии (например, уязвимость к тайминг атакам).
https://habrastorage.org/files/084/c25/36f/084c2536fe7044cf83f19fbcaaf45cd0.png
То что он просто склеивает и помещает все данные в память: это да, не оптимально. Но тоже сделано осознанно: чтобы код оставался максимально простым. Ориентируется его применение исключительно для тестовых целей, например чтобы сравнить какую-нибудь другую реализацию, быстренько на коленке что-то посчитать, но конечно не для «боя».
* В ссылке к Стрибогу https://code.google.com/archive/p/jstribog/ — в URL я вижу JS, возможно написано оно не на Java, а на JavaScript. Прощу прощения если не так, JS-enabled броузера нет чтобы проверить.
* Кривая ссылка к Стрибогу и 34.10 на libressl.org (лишний http://)
* ccgost engine в OpenSSL уже нет. Зато 34.10 есть в LibreSSL, а Стрибог в https://github.com/gost-engine/engine
Я создал вот такой сайт: http://www.cypherpunks.ru/gost/ в котором на русскоязычных страницах перенёс исправленные ссылки:
* http://www.cypherpunks.ru/gost/ru34122015.html#g_t34122015Impl
* http://www.cypherpunks.ru/gost/ru34112015.html#g_t34112015Impl
* http://www.cypherpunks.ru/gost/ru3410.html#g_t3410Impl
@ru_crypt.
Подбираюсь к реализации Кузнечика, перед этим сверяю старые реализации ГОСТ 28147-89 с тем, что написано в ГОСТ Р 34.12-2015/ГОСТ Р 34.13-2015. Правильно ли я понимаю, что пример из стандарта ГОСТ Р 34.12-2015 надо читать так:
Если ключ K задан как массив байт
{0xcc, 0xdd, 0xee, 0xff, 0x88, 0x99, 0xaa, 0xbb, 0x44, 0x55, 0x66, 0x77, 0x00, 0x11, 0x22, 0x33, 0xf3, 0xf2, 0xf1, 0xf0, 0xf7, 0xf6, 0xf5, 0xf4, 0xfb, 0xfa, 0xf9, 0xf8, 0xff, 0xfe, 0xfd, 0xfc},
то при шифровании массива байт
{0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe}
получится массив байт
{0x3d, 0xca, 0xd8, 0xc2, 0xe5, 0x01, 0xe9, 0x4e}
K = ffeeddccbbaa99887766554433221100f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff.
То есть, массив байт для ключа следующий:
{0xff, 0xfe, 0xfd, ..., 0xee, 0xff}
Т.е. на уровне последовательностей байт 34.12-2015 отличается от того, как до сих пор применяли 28147-89?
Переформулирую вопрос: получается, что ключ считывается как единый вектор в формате Little endian от начала и до конца. В этом есть некая логика. По сути новый стандарт меняет порядок подключей в ключевом расписании по сравнению с традиционными способами применения ГОСТ 28147-89. Правильно ли я понимаю, что все предыдущие документы/стандарты, которые использовали ГОСТ 28147-89, например тот же ТК26CMS, оказываются несоответствующими ГОСТ Р 34.12-2015?
Текущие реализации ГОСТ 28147-89 по массиву {0xff, 0xfe, 0xfd, ..., 0xee, 0xff} строят ключевое расписание {0xfcfdfeff, 0xf8f9fafb, 0xf4f5f6f7, 0xf0f1f2f3, 0x33221100, 0x77665544, 0xbbaa9988, 0xffeeddcc}, а не {0xffeeddcc, 0xbbaa9988, 0x77665544, 0x33221100, 0xf0f1f2f3, 0xf4f5f6f7, 0xf8f9fafb, 0xfcfdfeff}, как записано в ГОСТ 34.12-2015.
Более того, такой («старый») способ построения ключевого расписания соответствует примеру из окончательной редакции проекта «Криптографические алгоритмы, сопутствующие
применению алгоритмов электронной цифровой подписи и функции хэширования»
Хэшируются ровно 4 блока, используются таблицы и превычисленные значения преобразований для нулевого и единичного IV.
Open-source реализации отечественных криптоГОСТов