«Задача о рюкзаке» заключается в следующем: зная подмножество грузов, уложенных в ранец, легко подсчитать суммарный вес, но, зная вес, непросто определить подмножество грузов. Более подробно, пусть задана последовательность из n положительных чисел (n — «размер» рюкзака)
w = (w1, w2, …, wn) и s.
Задача состоит в том, чтобы найти такой бинарный вектор
x = (x1, x2, …, xn), (xi = 0 или 1),
чтобы
.
Если каждому двоичному числуx поставить в соответствие некоторую букву алфавита, то её можно было бы передавать в зашифрованном виде просто как сумму s. Для произвольного набора чисел wi задача восстановления x по s является NP-трудной.
Мерклу удалось получить обратную к числу s функцию, которая давала бы вектор x, зная только некий «секретный» ключ, и он предложил $100 тому, кто сможет раскрыть ранцевую систему Меркла — Хеллмана.
Рассмотрим её подробнее.
Меркл использовал не произвольную последовательностьwi, а супервозрастающую (superincreasing), то есть такую, что
.
Нетрудно убедиться, что для такого набора чисел решение задачи является тривиальным. Чтобы избавиться от этой тривиальности и понадобилось ввести «секретный ключ», а именно два числа: q такое, что и r такое, что НОД(r, q) =1.
И теперь вместо первоначального набора чисел wi будем использовать числа bi=rwi mod q. В оригинальных статьях Меркл рекомендовал использовать n порядка 100, где n — число элементов супервозрастающей последовательности («размер» рюкзака).
В итоге получаем: открытый ключ — (b1, b2, …, bn), закрытый ключ — (w1, w2, …, wn; q, r).
– сообщение x = (x1, x2, ..., xn)
- вычисляем y = b1x1 + b2x2 + , ..., + bnxn
Дешифрование
- вычисляем s = yr-1 mod q
- решаем задачу для s для супервозрастающей последовательности (w1, w2, ..., wn), т.е. находим двоичное число x
Награда досталась А. Шамиру (Adi Shamir) после публикации им в марте 1982 года сообщения о раскрытии ранцевой системы Меркла — Хеллмана с одной итерацией. Заметим, что Шамир сумел построить ключ, не обязательно равный секретному, но позволяющий раскрыть шифр.
Итак, это была одна из неудачных, но очень интересных попыток построения криптосистемы на основе задачи о рюкзаке.
В системе Меркла — Хеллмана ключи состоят из последовательностей. Открытый ключ представляет собой «сложную» последовательность, закрытый ключ состоит из «простой» или супервозрастающей последовательности, а также двух дополнительных чисел — множителя и модуля, которые используются как для преобразования супервозрастающей последовательности в «сложную» (генерация открытого ключа), так и для преобразования суммы подмножества «сложной» последовательности в сумму подмножества «простой» (дешифрование). Последняя задача решается за полиномиальное время.
Сначала исходный текст необходимо представить в двоичном виде и разбить его на блоки, равные по длине с открытым ключом. Далее из последовательности, образующей открытый ключ, выбираются только те элементы, которые по порядку соответствуют 1 в двоичной записи исходного текста, игнорируя при этом элементы, соответствующие 0 биту. После этого элементы полученного подмножества складываются. Найденная в результате сумма и есть шифротекст.
Дешифрование является возможным в силу того, что множитель и модуль, используемые для генерации открытого ключа из супервозрастающей последовательности, используются также и для преобразования шифротекста в сумму соответствующих элементов супервозрастающей последовательности. Далее, с помощью простого жадного алгоритма, можно дешифровать сообщение, используя O(n) арифметических операций.
Число q выбирается таким образом, чтобы гарантировать единственность (уникальность) шифротекста. В случае, если оно будет хотя бы чуть меньше, может возникнуть ситуация, что одному шифротексту будут соответствовать несколько исходных (открытых) текстов. r должно быть взаимно просто с q, в противном случае оно не будет иметь мультипликативного обратного по модулю q, существование которого необходимо для дешифровки.
Теперь построим последовательность
β = (β1, β2, …, βn),
где каждый элемент вычисляется по следующей формуле
βi = rwi mod q.
β будет открытым ключом, в то время как закрытый ключ образует последовательность (w, q, r).
Чтобы прочитать исходный текст, получатель должен определить биты сообщения , которые удовлетворяли бы формуле
Такая задача была бы NP-сложна в случае, если бы βi были случайно выбранными значениями. Однако значения βi были выбраны таким образом, что дешифровка сводится к простой задаче при условии, что закрытый ключ (w, q, r) известен.
Ключ к определению исходного текста заключается в том, чтобы найти целое число s, которое является мультипликативным обратным r по модулю q. Это значит, что s удовлетворяет уравнению sr mod q = 1, что эквивалентно существованию целого числа k такого, что sr = kq + 1. Поскольку r взаимно просто с q, найти s и k возможно с использованием расширенного алгоритма Евклида. Далее получатель шифротекста вычисляет
Отсюда
Из того, что rs mod q = 1 и βi= rwi mod q, следует
Тогда
Сумма всех wi меньше, чем q. Отсюда значение также находится в интервале [0,q-1]. Таким образом, получатель должен определить из условия, что
.
А это уже простая задача, поскольку w — супервозрастающая последовательность. Пусть wk — наибольший элемент в w. Если wk > c' , то αk = 0; если wk ≤c' , то αk = 1. Далее вычитаем произведение wk×αk из c' и повторяем эти шаги до тех пор, пока не вычислим α.
Чтобы дешифровать сообщение, Боб умножает полученное им значение на мультипликативное обратное r по модулю q.
1129 * 442 mod 881 = 372
После этого Боб раскладывает 372 следующим образом. Сначала он выбирает наибольший элемент из w, который меньше, чем 372, и вычисляет их разность. Далее он выбирает следующий наибольший элемент, который меньше, чем полученная разность, и повторяет эти действия, пока разность не станет равной нулю.
372 - 354 = 1818 - 11 = 77 - 7 = 0
Элементы, которые были выбраны из w , будут соответствовать 1 в двоичной записи исходного текста.
01100001
Переводя обратно из двоичной записи, Боб получает, наконец, искомое «a».
↑Ralph Merkle and Martin Hellman, Hiding Information and Signatures in Trapdoor Knapsacks, IEEE Trans. Information Theory, 24(5), September 1978, pp525-530.
↑Adi Shamir, A Polynomial Time Algorithm for Breaking the Basic Merkle-Hellman Cryptosystem. CRYPTO 1982, pp279-288. Архивированная копия (неопр.). Дата обращения: 6 декабря 2005. Архивировано 24 апреля 2005 года.
Шнайер Б. Прикладная криптография. Протоколы, алгоритмы, исходные тексты на языке Си = Applied Cryptography. Protocols, Algorithms and Source Code in C. — М.: Триумф, 2002. — 816 с. — 3000 экз. — ISBN 5-89392-055-4.