Подпись Лэмпорта (Hk;hnv, Lzbhkjmg)

Перейти к навигации Перейти к поиску

Подпись Лэмпорта (англ. Lamport signature) — это криптосистема цифровой подписи с открытым ключом. Может быть построена на любой односторонней функции. Была предложена в 1979 году и названа в честь её автора, американского учёного, Лесли Лэмпорта[1].

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

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

[править | править код]

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

Чтобы создать открытый ключ, Алиса хеширует каждое из 512 чисел секретного ключа, таким образом получая 512 хешей по 256 бит каждый. Эти 512 хешей составляют открытый ключ Алисы, который она публикует.

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

[править | править код]

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

Стоит обратить внимание, что после того как Алиса использовала свой секретный ключ, он никогда не должен быть использован снова. Остальные 256 чисел, которые она не использовала в подписи, Алиса никогда не должна публиковать или использовать. Предпочтительно, чтобы она их удалила, так как иначе кто-то может получить к ним доступ и сгенерировать с их помощью поддельную подпись.

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

[править | править код]

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

Затем Боб хеширует каждое из 256 чисел из подписи Алисы и получает 256 хешей. Если эти 256 хешей в точности соответствуют 256 хешам, которые он только что получил из открытого ключа Алисы, Боб считает подпись подлинной. Если не соответствуют — то фальшивой.

Стоит обратить внимание, что до того, как Алиса опубликует подпись к сообщению, никто не знает 2×256 случайных чисел в секретном ключе. Таким образом, никто не может создать правильный набор из 256 чисел для подписи. После того, как Алиса опубликует подпись, никто всё ещё не знает остальные 256 чисел, и, таким, образом, не может создать подпись для сообщений, имеющих иной хеш[2].

Пусть Алиса передаёт сообщение M = «Lamport» Бобу, подписывая его подписью Лэмпорта и используя при этом 8-битную хеш-функцию. То есть, изначальное сообщение будет преобразовано в 8-битный хеш.

Генерация ключей

[править | править код]

Используя генератор случайных чисел, Алиса получает восемь пар случайных чисел. Эти 16 чисел являются закрытым ключом Алисы.

Закрытый ключ:

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

Открытый ключ:

Получившийся открытый ключ Алиса публикует в общий доступ.

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

[править | править код]

Алиса хочет подписать сообщение M = «Lamport». Для этого она вычисляет значение хеш-функции от этого сообщения и ставит в соответствие каждому биту хеша одно из значений в парах закрытого ключа, тем самым формируя подпись.

Подпись сообщения «Lamport»:

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

[править | править код]

Боб получает подписанное сообщение «Lamport» и хочет проверить, действительно ли его послала Алиса. Для этого он использует открытый ключ, который опубликовала Алиса. Он преобразует полученное сообщение в хеш и каждому биту в получившемся хеше ставит в соответствие число из пары в открытом ключе. Затем он хеширует подпись сообщения и сравнивает два получившихся набора чисел. Если они равны, то подпись настоящая, и сообщения действительно посылала Алиса.

Набор чисел, полученный из открытого ключа:

Хеш подписи:

Так как данные наборы равны — подпись настоящая.

Математическое описание

[править | править код]

Пусть  — положительное число, пусть  — набор сообщений и пусть  — односторонняя функция.

Для каждого и , сторона, подписывающая сообщение, случайно выбирает и вычисляет .

Секретный ключ состоит из значений . Открытый ключ состоит из значений .[3]

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

[править | править код]

Пусть  — сообщение.

Подпись сообщения — это .

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

[править | править код]

Сторона, валидирующая подпись, проверяет для всех .

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

Криптостойкость

[править | править код]

Криптостойкость подписей Лэмпорта основана на криптостойкости хеш-функции.

Для каждой хеш-функции, которая генерирует n-битный дайджест, идеальная стойкость к восстановлению прообраза и к восстановлению второго прообраза подразумевает для каждого выполнения хеш-функции 2n операций и 2n бит памяти в классической вычислительной модели. Используя алгоритм Гровера, восстановление прообраза значения идеальной хеш-функции ограничено сверху O(2n/2) операциями в квантовой вычислительной модели[4].

Подпись нескольких сообщений

[править | править код]

Одним секретным ключом Лэмпорта может быть подписано только одно единственное сообщение. Это значит, что если подписано какое-то количество сообщений, должно быть опубликовано такое же количество открытых ключей. Но, если использовать дерево Меркла, составленное из открытых ключей, то вместо публикации всех открытых ключей, можно публиковать только вершину дерева. Это увеличивает размер подписи, так как часть хеш-дерева приходится включать в подпись, но это даёт возможность использовать один единственный хеш для проверки множества подписей. По такой схеме можно подписать сообщений, где  — глубина дерева Меркла. То есть теоретически мы можем использовать один открытый ключ для любого количества сообщений[5].

Генерация ключей

[править | править код]
Дерево Меркла с восемью листовыми элементами

Для начала необходимо сгенерировать закрытых одноразовых ключей Лэмпорта и открытых одноразовых ключей Лэмпорта . Далее для каждого открытого ключа , где , вычисляется его хеш . И на основе этих значений строится дерево Меркла.

Пронумеруем узлы дерева таким образом, что индекс обозначает расстояние от этого узла до листового элемента, а индекс обозначает порядковый номер узла слева направо на одном уровне .

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

Таким образом, мы имеем дерево, корневой элемент которого и является нашим открытым ключом .

Подпись сообщения и его проверка

[править | править код]
Вычисление пути до вершины в дереве Меркла

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

 — соответствующий открытому ключу листовой элемент дерева. Путь от листового элемента дерева к его вершине состоит из элементов , где  — листовой элемент, а  — вершина дерева. Чтобы вычислить этот путь, нам необходимы все дети узлов . Мы знаем, что узел  — дочерний элемент узла . Чтобы вычислить следующий узел на пути к вершине нам нужны оба дочерних элемента узла . Поэтому нам нужно знать «брата» узла . Назовём его . Итак, . Следовательно, нам нужны узлов , чтобы вычислить вершину дерева. Мы вычисляем их и сохраняем.

Эти узлы в совокупности с одноразовой подписью сообщения составляют итоговую подпись .

Получатель сообщения имеет в распоряжении открытый ключ , сообщение и подпись . Сначала он проверяет одноразовую подпись сообщения . Если она подлинна, получатель вычисляет . И далее для вычисляет . Если оказывается равна , то подпись считается подлинной.

Различные оптимизации и реализации

[править | править код]

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

[править | править код]

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

Тем же способом ключ может быть использован вместе с CSPRNG, чтобы создать множество ключей Лэмпорта. Предпочтительны CSPRNG, имеющие высокую криптостойкость, такие как BBS.

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

[править | править код]

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

Хеширование сообщения

[править | править код]

Схема цифровой подписи Лэмпорта не требует, чтобы сообщение m было захешировано перед тем, как оно будет подписано. Хеширование может быть использовано, например, для подписания длинных сообщений, где подписываться будет хеш сообщения, а не оно само[6].

Сравнение с другими криптосистемами

[править | править код]

Основные преимущества схемы одноразовой подписи Лэмпорта заключаются в том, что она может быть построена на любой односторонней функции, и в том, что её алгоритм подписи и проверки сообщения существенно быстрее алгоритмов систем многоразовой подписи. В то же время схема имеет ряд недостатков. Во-первых, недостатком является одноразовость ключей. То есть, при подписи каждого нового сообщения приходиться генерировать новую пару, что приводит к усложнению системы. Во-вторых, схема имеет недостаток в виде большого размера подписи и пары из открытого и закрытого ключей[7].

Данная система имеет потенциал в свете того, что потенциальная разработка квантового компьютера угрожает криптостойкости многих широко используемых алгоритмов, таких как RSA, в то время, как подпись Лэмпорта останется криптостойкой и в этом случае[8]. В совокупности с деревьями Меркла, криптосистема Лэмпорта может быть использована для проверки подлинности множества сообщений, выступая как довольно эффективная схема цифровой подписи[9].

Примечания

[править | править код]
  1. Lamport, 1979, с. 2.
  2. Lamport, 1979, с. 3—5.
  3. Katz, с. 2.
  4. М. И. Анохин, Н. П. Варновский, В. М. Сидельников, В. В. Ященко, «Схемы Лампорта и Наора -- Юнга». Дата обращения: 17 декабря 2013. Архивировано 17 декабря 2013 года.
  5. Michael Szydlo, EFFICIENT USE OF MERKLE TREES. Дата обращения: 24 ноября 2013. Архивировано 17 апреля 2017 года.
  6. Lamport, 1979, с. 6.
  7. Zaverucha, 2010, с. 1.
  8. Garcia, с. 10.
  9. Вадим Малых, «Долговременное хранение электронных документов». Дата обращения: 13 декабря 2013. Архивировано 13 декабря 2013 года.

Литература

[править | править код]
  • Lamport L. Constructing digital signatures from a one-way function. — SRI International Computer Science Laboratory, 1979.
  • Peikert K. Theoretical Foundations of Cryptography. — Georgia Tech, 2010. Архивная копия от 19 декабря 2013 на Wayback Machine
  • Katz J. Introduction to Cryptography. — University of Maryland.
  • Zaverucha G. Stinson R. Cheriton R. Short One-Time Signatures. — University of Waterloo, 2010.
  • Garcia L. On security and efficiency of the Merkle signature scheme. — Darmstadt.