Чтобы создать секретный ключ, Алиса использует генератор случайных чисел для получения 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-битный хеш.
Алиса хочет подписать сообщение M = «Lamport». Для этого она вычисляет значение хеш-функции от этого сообщения и ставит в соответствие каждому биту хеша одно из значений в парах закрытого ключа, тем самым формируя подпись.
Боб получает подписанное сообщение «Lamport» и хочет проверить, действительно ли его послала Алиса. Для этого он использует открытый ключ, который опубликовала Алиса. Он преобразует полученное сообщение в хеш и каждому биту в получившемся хеше ставит в соответствие число из пары в открытом ключе. Затем он хеширует подпись сообщения и сравнивает два получившихся набора чисел. Если они равны, то подпись настоящая, и сообщения действительно посылала Алиса.
Криптостойкость подписей Лэмпорта основана на криптостойкости хеш-функции.
Для каждой хеш-функции, которая генерирует n-битный дайджест, идеальная стойкость к восстановлению прообраза и к восстановлению второго прообраза подразумевает для каждого выполнения хеш-функции 2n операций и 2n бит памяти в классической вычислительной модели. Используя алгоритм Гровера, восстановление прообраза значения идеальной хеш-функции ограничено сверху O(2n/2) операциями в квантовой вычислительной модели[4].
Одним секретным ключом Лэмпорта может быть подписано только одно единственное сообщение. Это значит, что если подписано какое-то количество сообщений, должно быть опубликовано такое же количество открытых ключей. Но, если использовать дерево Меркла, составленное из открытых ключей, то вместо публикации всех открытых ключей, можно публиковать только вершину дерева. Это увеличивает размер подписи, так как часть хеш-дерева приходится включать в подпись, но это даёт возможность использовать один единственный хеш для проверки множества подписей. По такой схеме можно подписать сообщений, где — глубина дерева Меркла. То есть теоретически мы можем использовать один открытый ключ для любого количества сообщений[5].
Для начала необходимо сгенерировать закрытых одноразовых ключей Лэмпорта и открытых одноразовых ключей Лэмпорта . Далее для каждого открытого ключа , где , вычисляется его хеш . И на основе этих значений строится дерево Меркла.
Пронумеруем узлы дерева таким образом, что индекс обозначает расстояние от этого узла до листового элемента, а индекс обозначает порядковый номер узла слева направо на одном уровне .
В нашем дереве хеш значения являются листовыми элементами, то есть . Каждый нелистовой узел дерева представляет из себя хеш-значение от соединения вместе двух детей, то есть , и так далее.
Таким образом, мы имеем дерево, корневой элемент которого и является нашим открытым ключом .
Чтобы подписать сообщение по нашей схеме, сначала нужно подписать его одноразовой подписью Лэмпорта . Это делается, используя одну из пар открытых/закрытых ключей .
— соответствующий открытому ключу листовой элемент дерева. Путь от листового элемента дерева к его вершине состоит из элементов , где — листовой элемент, а — вершина дерева. Чтобы вычислить этот путь, нам необходимы все дети узлов . Мы знаем, что узел — дочерний элемент узла . Чтобы вычислить следующий узел на пути к вершине нам нужны оба дочерних элемента узла . Поэтому нам нужно знать «брата» узла . Назовём его . Итак, . Следовательно, нам нужны узлов , чтобы вычислить вершину дерева. Мы вычисляем их и сохраняем.
Эти узлы в совокупности с одноразовой подписью сообщения составляют итоговую подпись .
Получатель сообщения имеет в распоряжении открытый ключ , сообщение и подпись . Сначала он проверяет одноразовую подпись сообщения . Если она подлинна, получатель вычисляет . И далее для вычисляет . Если оказывается равна , то подпись считается подлинной.
Вместо создания и хранения всех случайных чисел секретного ключа, можно хранить одно единственно число соответствующего размера. Обычно размер выбирается таким же, как и размер одного случайного числа в закрытом ключе. Этот ключ можно использовать как зерно для генератора случайных чисел (CSPRNG), чтобы можно было воссоздать всю последовательность случайных чисел секретного ключа, когда это понадобиться.
Тем же способом ключ может быть использован вместе с CSPRNG, чтобы создать множество ключей Лэмпорта. Предпочтительны CSPRNG, имеющие высокую криптостойкость, такие как BBS.
Подпись Лэмпорта может быть использована вместе со списком хешей, что делает возможным включать в открытый ключ только один хеш. То есть, вместо значений — . Чтобы иметь возможность сравнивать случайные числа в подписи с хешем в открытом ключе, все неиспользуемые в открытом ключе хеши, то есть, значения для любого , должны быть включены в подпись. В результате открытый ключ становится существенно короче, а размер подписи увеличивается примерно в два раза.
Схема цифровой подписи Лэмпорта не требует, чтобы сообщение m было захешировано перед тем, как оно будет подписано. Хеширование может быть использовано, например, для подписания длинных сообщений, где подписываться будет хеш сообщения, а не оно само[6].
Основные преимущества схемы одноразовой подписи Лэмпорта заключаются в том, что она может быть построена на любой односторонней функции, и в том, что её алгоритм подписи и проверки сообщения существенно быстрее алгоритмов систем многоразовой подписи. В то же время схема имеет ряд недостатков. Во-первых, недостатком является одноразовость ключей. То есть, при подписи каждого нового сообщения приходиться генерировать новую пару, что приводит к усложнению системы. Во-вторых, схема имеет недостаток в виде большого размера подписи и пары из открытого и закрытого ключей[7].
Данная система имеет потенциал в свете того, что потенциальная разработка квантового компьютера угрожает криптостойкости многих широко используемых алгоритмов, таких как RSA, в то время, как подпись Лэмпорта останется криптостойкой и в этом случае[8]. В совокупности с деревьями Меркла, криптосистема Лэмпорта может быть использована для проверки подлинности множества сообщений, выступая как довольно эффективная схема цифровой подписи[9].