Ранцевая криптосистема Меркла — Хеллмана

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

Ранцевая криптосистема Меркла-Хеллмана, основанная на «задаче о рюкзаке», была разработана Ральфом Мерклем и Мартином Хеллманом в 1978 году.[1] Это была одна из первых криптосистем с открытым ключом, но она оказалась криптографически нестойкой[2] и, как следствие, не приобрела популярности.

Описание[править | править исходный текст]

«Задача о рюкзаке» заключается в следующем: зная подмножество грузов, уложенных в ранец, легко подсчитать суммарный вес, но, зная вес, непросто определить подмножество грузов. Более подробно, пусть задана последовательность из n положительных чисел (n - "размер" рюкзака)

w = (w1, w2, ..., wn) и s.

Задача состоит в том, чтобы найти такой бинарный вектор

x = (x1, x2, ..., xn), (xi = 0 или 1),

чтобы

s=\sum_{i = 1}^n x_iw_i.

Если каждому двоичному числу x поставить в соответствие некоторую букву алфавита, то её можно было бы передавать в зашифрованном виде просто как сумму s. Для произвольного набора чисел wi задача восстановления x по s является NP-трудной.

Р.Мерклю удалось получить обратную к числу s функцию, которая давала бы вектор x, зная только некий «секретный» ключ, и он предложил $100 тому, кто сможет раскрыть ранцевую систему Меркля-Хеллмана.

Рассмотрим её подробнее.

Меркль использовал не произвольную последовательность wi, а супервозрастающую (superincreasing), то есть такую, что

w_{k+1}>\sum_{i = 1}^k w_i.

Нетрудно убедиться, что для такого набора чисел решение задачи является тривиальным. Чтобы избавиться от этой тривиальности и понадобилось ввести «секретный ключ», а именно два числа: q такое, что q>\sum_{i = 1}^n w_i и 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 + bnx
  • Расшифровка
  - вычисляем s = y'r-1 mod q
  - решаем задачу для s для супервозрастающей последовательности  (w1, w2, ..., 'wn), т.е. находим двоичное число x

Награда досталась А. Шамиру (Adi Shamir) после публикации им в марте 1982 года сообщения о раскрытии ранцевой системы Меркля-Хеллмана с одной итерацией. Заметим, что Шамир сумел построить ключ, не обязательно равный секретному, но позволяющий раскрыть шифр.

Итак, это была одна из неудачных, но очень интересных попыток построения криптосистемы на основе задачи о рюкзаке.

Генерация ключа[править | править исходный текст]

В системе Меркля-Хеллмана ключи состоят из последовательностей. Открытый ключ представляет собой «сложную» последовательность, закрытый ключ состоит из «простой» или супервозрастающей последовательности, а также двух дополнительных чисел – множителя и модуля, которые используются как для преобразования супервозрастающей последовательности в «сложную» (генерация открытого ключа), так и для преобразования суммы подмножества «сложной» последовательности в сумму подмножества «простой» (расшифровка). Последняя задача решается за полиномиальное время.

Шифрование[править | править исходный текст]

Сначала исходный текст необходимо представить в двоичном виде и разбить его на блоки, равные по длине с открытым ключом. Далее из последовательности, образующей открытый ключ, выбираются только те элементы, которые по порядку соответствуют 1 в двоичной записи исходного текста, игнорируя при этом элементы, соответствующие 0 биту. После этого элементы полученного подмножества складываются. Найденная в результате сумма и есть шифротекст.

Расшифровка[править | править исходный текст]

Расшифровка является возможной в силу того, что множитель и модуль, используемые для генерации открытого ключа из супервозрастающей последовательности, используются также и для преобразования шифротекста в сумму соответствующих элементов супервозрастающей последовательности. Далее, с помощью простого жадного алгоритма, можно расшифровать сообщение, используя O(n) арифметических операций.

Математическое описание алгоритма[править | править исходный текст]

Генерация ключа[править | править исходный текст]

Чтобы зашифровать n-битное сообщение, выберем супервозрастающую последовательность из n ненулевых натуральных чисел

w = (w1, w2, ..., wn).

Далее случайным образом выберем целые взаимно простые числа q и r такие, что

q>\sum_{i = 1}^n w_i.

Число q выбирается таким образом, чтобы гарантировать единственность (уникальность) шифротекста. В случае, если оно будет хотя бы чуть меньше, может возникнуть ситуация, что одному шифротексту будут соответствовать несколько исходных (открытых) текстов. r должно быть взаимно просто с q, в противном случае оно не будет иметь мультипликативного обратного по модулю q, существование которого необходимо для расшифровки.

Теперь построим последовательность

β = (β1, β2, ..., βn),

где каждый элемент вычисляется по следующей формуле

βi = rwi mod q.

β будет открытым ключом, в то время как закрытый ключ образует последовательность (w, q, r).

Шифрование[править | править исходный текст]

Чтобы зашифровать n-битное сообщение

α = (α1, α2, ..., αn),

где \alpha_i - это i-ый бит, т.е. \alpha_i \boldsymbol{\in}{0, 1}, вычислим число c, которое и будет шифротекстом.

c = \sum_{i = 1}^n \alpha_i \beta_i.

Расшифровка[править | править исходный текст]

Чтобы прочитать исходный текст, получатель должен определить биты сообщения \alpha_i, которые удовлетворяли бы формуле

c = \sum_{i = 1}^n \alpha_i \beta_i.

Такая задача была бы NP-сложна в случае, если бы βi были случайно выбранными значениями. Однако значения βi были выбраны таким образом, что расшифровка сводится к простой задаче при условии, что закрытый ключ (w, q, r) известен.

Ключ к определению исходного текста заключается в том, чтобы найти целое число s, которое является мультипликативным обратным r по модулю q. Это значит, что s удовлетворяет уравнению sr mod q = 1, что эквивалентно существованию целого числа k такого, что sr = kq + 1. Поскольку r взаимно просто с q, найти s и k возможно с использованием расширенного алгоритма Евклида. Далее получатель шифротекста вычисляет

c'\equiv cs \pmod{q}.

Отсюда

c' \equiv cs \equiv \sum_{i = 1}^n \alpha_i \beta_i s \pmod{q}.

Из того, что rs mod q = 1 и βi= rwi mod q, следует

\beta_i s\equiv w_i r s\equiv w_i\pmod{q}.

Тогда

c' \equiv \sum_{i = 1}^n \alpha_i w_i\pmod{q}.

Сумма всех wi меньше, чем q. Отсюда значение \sum_{i = 1}^n \alpha_i w_i также находится в интервале [0,q-1]. Таким образом, получатель должен определить \alpha_i из условия, что

c' = \sum_{i = 1}^n \alpha_i w_i..

А это уже простая задача, поскольку w - супервозрастающая последовательность. Пусть wk – наибольший элемент в w. Если wk > c' , то αk = 0; если wk ≤c' , то αk = 1. Далее вычитаем произведение wk×αk из c' и повторяем эти шаги до тех пор, пока не вычислим α.

Пример[править | править исходный текст]

w = {2, 7, 11, 21, 42, 89, 180, 354} - супервозрастающая последовательность.

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

\sum w = 706

Далее выберем простое число q, превосходящее полученное нами значение суммы.

q = 881

Выберем также число r из интервала [1,q)

r = 588

w, q и r образуют закрытый ключ.

Чтобы сгенерировать открытый ключ, построим последовательность β, умножая каждый элемент из последовательности w на r по модулю q.

2 * 588 mod 881 = 295
7 * 588 mod 881 = 592
11 * 588 mod 881 = 301
21 * 588 mod 881 = 14
42 * 588 mod 881 = 28
89 * 588 mod 881 = 353
180 * 588 mod 881 = 120
354 * 588 mod 881 = 236
Получим  β = (295, 592, 301, 14, 28, 353, 120, 236).

Последовательность β образует открытый ключ.


Пусть Алиса хочет зашифровать "a". Сначала она должна перевести "a" в двоичный код

01100001

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

a = 01100001
0 * 295
+ 1 * 592
+ 1 * 301
+ 0 * 14
+ 0 * 28
+ 0 * 353
+ 0 * 120
+ 1 * 236
= 1129

Чтобы расшифровать сообщение, Боб умножает полученное им значение на мультипликативное обратное r по модулю q.

1129 * 442 mod 881 = 372

После этого Боб раскладывает 372 следующим образом. Сначала он выбирает наибольший элемент из w, который меньше, чем 372, и вычисляет их разность. Далее он выбирает следующий наибольший элемент, который меньше, чем полученная разность, и повторяет эти действия, пока разность не станет равной нулю.

372 - 354 = 18
18 - 11 = 7
7 - 7 = 0

Элементы, которые были выбраны из w , будут соответствовать 1 в двоичной записи исходного текста.

01100001

Переводя обратно из двоичной записи, Боб получает, наконец, искомое "a".

См. также[править | править исходный текст]

Литература[править | править исходный текст]

Ссылки[править | править исходный текст]

  1. Ralph Merkle and Martin Hellman, Hiding Information and Signatures in Trapdoor Knapsacks, IEEE Trans. Information Theory, 24(5), September 1978, pp525–530.
  2. Adi Shamir, A Polynomial Time Algorithm for Breaking the Basic Merkle-Hellman Cryptosystem. CRYPTO 1982, pp279–288. http://dsns.csie.nctu.edu.tw/research/crypto/HTML/PDF/C82/279.PDF