CRYSTALS-Dilithium
CRYSTALS-Dilithium — один из алгоритмов постквантовой криптографии, основанный на задачах теории решёток. Представлен в 2018 на семинаре CHES, опубликован в 2021 году, авторы — Лео Дюкас (Léo Ducas), Айке Кильц (Eike Kiltz), Танскред Лепуан (Tancrède Lepoint), Вадим Любашевский, Петер Швабе (Peter Schwabe), Грегор Зайлер (Gregor Seiler), Дамиан Стеле (Damien Stehlé).

Причины создания 
Основные причины создания алгоритма и цели, которых добивались создатели:

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

Общая схема алгоритма

Генерация ключа 
  — генерация матрицы, элементами которой являются полиномы в кольце , эта матрица — первая часть публичного ключа.
  — случайные векторы, секретные ключи, размеров l и k соответственно, каждый коэффициент этих векторов — это элемент , с малыми коэффициентами у многочленов: эти коэффициенты не больше .
  — вторая часть публичного ключа.
 Публичный ключ — пара , приватный ключ — набор .

Подпись 
  — генерация вектора-маски , состоящего из многочленов с коэффициентами меньше, чем . Выбор параметра — отдельная задача, так как  должен быть достаточно большим, чтобы подпись не раскрывала секретный ключ, но при этом достаточно маленьким, чтобы подпись было сложно подделать.
  — вычисление , и присваивание старших битов этого произведения . При этом каждый коэффициет  в  может быть представлен в виде , где ; тогда - это вектор, включающий в себя все .
  — создание «испытания»  как хэш исходного сообщения  и . На выходе  — это многочлен в , имеющий ровно 60 коэффициентов, которые равны  или , остальные коэффициенты — нули. Причина такого распределения в том, что  должен иметь малую норму и быть размером не меньше . Для хэширования здесь удобно использовать вариацию алгоритма тасования Фишера-Йетса, которая позволяет сохранить нужное число ненулевых коэффициентов.
  — вычисление потенциальной подписи . Если бы алгоритм подписывания сообщения оканчивался на этом шаге, то подпись была бы небезопасной из-за возможной утечки секретного ключа. Чтобы избежать зависимости подписи от секретного ключа, используется протокол Фиата-Шамира с прерыванием:
 Выбора параметра  как максимум из коэффициентов . Так как в  только 60  и наибольший коэффициент в  — это , то .
 Если один из коэффициентов  больше, чем , то процедура подписи начинается заново. Эта проверка необходима для сохранения безопасности.
 Если любой коэффициент младших битов  больше, чем , процедура подписи начинается заново. Эта проверка необходима для корректности работы алгоритма и обеспечения безопасности.
 Подпись — пара .

Верификация подписи 
  — вычисление на стороне, проверяющей подпись.
 Если хотя бы один коэффициент  больше, чем , то подпись не верна.
 Если хэш исходного сообщения и  не равен , то подпись не верна.
 На этом шаге подпись прошла все проверки и оказалась верной.

Улучшения упрощённой схемы 
 Передача матрицы как части публичного ключа занимает слишком много ресурсов памяти, поэтому вместо матрицы можно передать «семя»  для генерации нужной матрицы и использованием, например, SHAKE-128;
 после этого возникает другая возможность оптимизации — улучшение развёртывания семени  в матрицу . На этом этапе нужно уделить внимание выбору функции хэширования, чтобы дехэширование занимало не слишком много времени, так как матрица используется на этапах и создания подписи, и её верификации;
 в старшие биты  практически не зависят от младших битов , потому что  умножается на многочлен  с небольшими весами (коэффициентами). Поэтому можно не включать в публичный ключ младшие биты , что позволит ещё больше уменьшить размер публичного ключа. Но из-за этого не всегда можно будет правильно подтвердить подпись, поэтому в подпись также включаются подсказки для проверяющего алгоритма. Эта подсказка содержит в себе ту часть произведения, которую мы потеряли, убрав младшие биты  из публичного ключа. Выигрыш здесь заключается в уменьшении размера публичного ключа и меньшем числе умножений при проверке подписи. Эти изменения позволяют уменьшить размер публичного ключа в 2.5 раза ценой увеличений рзамера подписи не больше, чем на 200 байт;
 можно улучшить скорость матричного умножения в схеме с помощью дискретного преобразования Фурье. Это известный способ улучшения эффективности умножения матриц в задачах и алгоритмах, основанных на решётках. ДПФ позволяет представить произведение двух полиномов как скалярное произведение двух векторов;
 с помощью добавления семени в секретные ключи и использования этого семени в хэшировании сообщения можно сделать  в пункте 1 подписи случайным вектором, а не детерминированным;
 базовые оптимизации пре-хэширования позволяют избежать повторных вычислений хэша «с нуля» при создании подписи;
 векторизация векторных и матричных вычислений способна дать ощутимое преимущество в вычислительной мощности данного алгоритма (25 % и больше);
 так как процедура подписи может выполняться несколько раз, то чтобы избежать определённости создания подписи (детерминированности), можно добавить счётчик в создание подписи и добавлять этот счётчик к хэшу, таким образом, делая процесс создания подписи более случайным, то есть с каждой попыткой хэширования, будет получаться новое значение хэша с одним и тем же исходным сообщением.

Безопасность 
Стандартным способом проверки безопасности для цифровых подписей является UF-CMA — это симуляция, где противник получает открытый ключ и и меет доступ к подписывающему свидетелю (оракулу) для подписи сообщений по своему выбору. Задача противника — придумать (сфальсифицировать) правильную подпись нового сообщения. Несколько более сильное требование безопасности, которое иногда полезно — это SUF-CMA (сильная непробиваемость при атаках с использованием выбранных сообщений), которое также позволяет противнику выиграть, создав другую подпись сообщения, которое он уже видел.

В классической модели случайного оракула (свидетеля), Dilithium является SUF-CMA на основе трудности стандартных задач MLWE и MSIS. Редукция, однако, не является жёсткой. Более того, поскольку алгоритм также должен противостоять квантовым атакам, необходимо рассматривать безопасность схемы, когда противник может запросить хэш-функцию на суперпозиции входных данных (то есть, безопасность в квантовой модели случайного оракула — QROM). Поскольку классическое доказательство использует лемму о вилке (которая по сути является раскруткой или размоткой), то редукция не переносится на квантовую среду.

Не известно контпримеров схем, на безопасность которых действительно влияет неприменяемость редукции. Например, такие схемы, как схема Шнорра устанавливают свои параметры, игнорирую нежёсткость редукции. Более того, единственное известное использование дополнительной мощности квантовых алгоритмов против схем, безопасность которых основана на квантово-устойчивых проблемах при классической редукции включают алгоритмы «типа Гровера», которые улучшают исчерпывающий поиск (хотя и было показано, что не может быть доказательство того, что протокол Фиата — Шамира безопасен в QROM).

Примечания 

Криптография
Криптография на решётках