Введение

Схема криптографической подписи
В криптографии, подпись Лампорта или схема одноразовой подписи Лампорта — это метод создания цифровой подписи. Подписи Лампорта могут быть построены на основе любой криптографически стойкой односторонней функции; как правило, используется криптографическая хеш-функция. Хотя потенциальное развитие квантовых компьютеров представляет угрозу для безопасности многих распространенных видов криптографии, таких как RSA, считается, что подписи Лампорта с использованием хеш-функций большого размера останутся безопасными даже в этом случае. Каждый ключ Лампорта может быть использован только для подписи одного сообщения. Однако множество подписей Лампорта можно обрабатывать с помощью одного дерева Меркла, таким образом, один ключ дерева Меркла может использоваться для множества сообщений, что делает эту схему достаточно эффективной цифровой подписью. Криптосистема подписи Лампорта была изобретена в 1979 году и названа в честь её изобретателя, Лесли Лампорта.

Пример

У Алисы есть 256-битная криптографическая хеш-функция и генератор безопасных случайных чисел. Она хочет создать и использовать пару ключей Лампорта, то есть, секретный ключ и соответствующий открытый ключ.

Создание ключевой пары

Для создания приватного ключа Алиса использует генератор случайных чисел, чтобы получить 256 пар случайных чисел (всего 2 × 256 чисел), каждое из которых имеет размер 256 бит, то есть в общей сложности 2 × 256 × 256 бит = 128 Кибит. Это её приватный ключ, и она сохранит его в безопасном месте для последующего использования. Для создания публичного ключа она вычисляет хеш каждого из 512 случайных чисел в приватном ключе, таким образом получая 512 хешей, каждый размером 256 бит. (Всего также 128 Кбит.) Эти 512 хешей формируют её публичный ключ, которым она поделится со всем миром.

Подпись сообщения

Позже Алиса хочет подписать сообщение. Сначала она вычисляет хеш-сумму сообщения длиной 256 бит. Затем, для каждого бита хеша, в зависимости от значения бита, она выбирает одно число из соответствующей пары чисел, составляющих её секретный ключ (то есть, если бит равен 0, выбирается первое число, а если бит равен 1, выбирается второе). Это создает последовательность из 256 чисел. Поскольку каждое число имеет длину 256 бит, общий размер её подписи составит 256 × 256 бит = 65536 бит = 64 Кибит. Эти (первоначально случайно сгенерированные) числа и являются её подписью, и она публикует их вместе с сообщением. Важно отметить, что после использования секретного ключа Алисы, он больше никогда не должен использоваться повторно. Она должна уничтожить остальные 256 чисел, которые не были использованы для создания подписи. В противном случае, каждая последующая подпись, использующая тот же секретный ключ, снижает уровень безопасности, позволяя злоумышленникам в дальнейшем создавать поддельные подписи.

Проверка подписи

Тогда Боб хочет проверить подпись Алисы к сообщению. Он также вычисляет хеш сообщения, чтобы получить 256-битную хеш-сумму. Затем он использует биты в хеш-сумме, чтобы выбрать 256 хешей из открытого ключа Алисы. Он выбирает хеши тем же способом, которым Алиса выбирала случайные числа для подписи. То есть, если первый бит хеша сообщения равен 0, он выбирает первый хеш из первой пары, и так далее. Затем Боб вычисляет хеш для каждого из 256 случайных чисел в подписи Алисы. Это дает ему 256 хешей. Если эти 256 хешей точно совпадают с 256 хешами, которые он только что выбрал из открытого ключа Алисы, то подпись верна. Если нет, то подпись недействительна. Важно отметить, что до публикации подписи Алисы никто не знает 2×256 случайных чисел в закрытом ключе. Таким образом, никто другой не может создать правильный список из 256 случайных чисел для подписи. И после того, как Алиса опубликовала подпись, другие все еще не знают остальные 256 случайных чисел и, следовательно, не могут создавать подписи, подходящие к другим хешам сообщений.

Официальное описание

Ниже приведено краткое описание работы подписей Лампорта, представленное в математической форме. Следует отметить, что "сообщение" в данном описании – это блок фиксированного, разумного размера, который может быть (но необязательно является) результатом хеширования произвольно длинного сообщения, подписываемого подписью.

Ключи

Пусть *n* – положительное целое число, а *M* – множество сообщений. Пусть *f* – односторонняя функция. Для *m* и *k* подписывающий случайным образом выбирает *r* и вычисляет *s = f(r, m)*. Частный ключ, *r*, состоит из *n* значений. Публичный ключ состоит из *n* значений *s*.

Краткий секретный ключ

Вместо создания и хранения всех случайных чисел приватного ключа, можно хранить один ключ достаточного размера. (Обычно такого же размера, как одно из случайных чисел в приватном ключе.) Этот единственный ключ затем может быть использован в качестве начального значения для криптографически стойкого генератора псевдослучайных чисел (CSPRNG) для создания всех случайных чисел приватного ключа по мере необходимости. Важно отметить, что криптографически стойкая хеш-функция (или, по крайней мере, функция, выход которой не складывается по XOR с начальным значением) не может быть использована вместо CSPRNG, поскольку подпись сообщения раскроет дополнительные случайные значения из приватного ключа. Если злоумышленник получит доступ к подписи раньше предполагаемых получателей, он сможет подделать подпись, уменьшив уровень безопасности вдвое с каждым удвоением раскрытых случайных значений из приватного ключа. Аналогичным образом, один ключ можно использовать вместе с CSPRNG для создания множества ключей Лампорта. Желательно использовать постквантово-защищенный CSPRNG с произвольным доступом. Следует отметить, что классические CSPRNG, такие как BBS, использовать не следует.

Краткий открытый ключ

Подпись Лампорта может быть объединена с хэш-списком, что позволяет публиковать только верхний хэш, а не все хэши из открытого ключа. Таким образом, для проверки подлинности по верхнему хэшу, подпись должна включать случайные числа и неиспользованные хэши из хэш-списка открытого ключа, что увеличивает размер подписи примерно вдвое. То есть, необходимо включить значения для всех . Неиспользованные хэши не требуется включать в подпись, если вместо хэш-списка используется криптографический аккумулятор.

Краткие ключи и подпись

Сжатие подписи Винтерница уменьшает размер приватного и публичного ключей чуть менее чем в два раза, а размер подписи – вдвое меньше этого значения. Вычислительная сложность увеличивается чуть более чем в два раза. Вместо использования криптографически стойкого генератора псевдослучайных чисел (CSPRNG) достаточно криптографически стойкой хеш-функции. Также можно использовать хеш-список для сокращения публичного ключа до одного значения, но за счет удвоения размера подписи, как описано в предыдущем разделе.

Публичный ключ для нескольких сообщений

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