Классическая задача об укладке рюкзака формулируется следующим образом. Пусть имеется множество предметов с указанием их веса, некоторые представители которого укладываются в рюкзак. Зная вес наполненного рюкзака (без учета веса самого рюкзака), необходимо определить содержимое рюкзака.
Опишем задачу о рюкзаке с использованием вектора рюкзака и вектора данных. Вектор рюкзака представляет собой набор из n различных чисел (аналогично множеству различных предметов, укладываемых в рюкзак), т.е.
. Вектор данных – множество двоичных символов, т.е.
, где
. Вес
наполненного рюкзака есть сумма подмножества компонентов вектора рюкзака, определяемая как
.
Тогда задачу о рюкзаке можно сформулировать следующим образом: по заданному значению S и известном
определить
.
Пример 13.2.1. Пусть
. Пусть
. Требуется определить
. Методом проб можно установить, что
.
Тогда
. ð
В этом простом примере решение было найдено методом проб и ошибок, однако если в заданном множестве
не 10, а 100 и более различных чисел, то задача может стать вычислительно неосуществимой. Следовательно, по заданному вектору
нахождение S при известном
осуществляется просто, как
. Однако решение обратной задачи, т.е. нахождение
по известному
и заданному S представляет собой трудную в вычислительном плане задачу, и, значит,
может рассматриваться как односторонняя функция.
Для организации схемы шифрования на основе этой задачи необходима не просто односторонняя функция, а функция с лазейкой, в качестве которой выступает быстровозрастающая последовательность компонентов вектора
. Вектор
будет быстровозрастающим, если для его компонентов выполняется соотношение
,
т.е. каждый компонент вектора
больше суммы предшествующих ему компонентов. Тогда если
является быстровозрастающим, то последний элемент
, т.е.
принимает значение единица, если
, и
– в противном случае. Все предшествующие элементы
находятся согласно соотношению
(13.3)
где
.
Пример 13.2.2. Пусть
, а
. Очевидно, что
является быстровозрастающим. Тогда из (13.3) следует, что
. ð
Из примера очевидным образом следует, что в случае наличия быстровозрастающего
, т.е. лазейки, определение
осуществляется достаточно просто, в противном же случае задача отыскания
становится трудно осуществимой. Следовательно, в качестве части секретного ключа необходимо использовать быстровозрастающую последовательность
и именно с учетом этого положения строить схему шифрования.
Данная схема шифрования, известная также как схема Меркла–Хэллмана, основана на образовании вектора
, который не является быстровозрастающим. Следовательно, задача отыскания
по
при известном S не является легкоразрешимой. При этом схема обязательно должна содержать лазейку в виде быстровозрастающего вектора
, который позволит разрешенным пользователям легко решить задачу.
Первоначально образуем быстро возрастающий вектор
и выберем простое число P, при котором выполняется следующее неравенство
.
Затем случайным образом выберем число
и вычислим
, такое что
. (13.4)
Вектор
и числа
являются секретными. Затем из элементов
сформируем вектор
, компоненты которого определяются как
.
Формирование вектора
согласно последнему соотношению знаменуют собой формирование вектора рюкзака с лазейкой. Так, если нужно передать сообщение, описываемое вектором
, то первоначально
умножается на
, что дает число S, вычисляемое как
,
которое и передается по открытому каналу связи.
Санкционированный пользователь получает S и, используя соотношение (13.4), превращает его в
вида

.
Поскольку разрешенный пользователь знает засекреченный быстровозрастающий вектор
, для отыскания
он может использовать
.
Пример 13.2.3. Предположим, что абонент A хочет создать общедоступную и конфиденциальную схему шифрования. Первоначально он создает быстровозрастающий вектор
, размерность которого n определяются потребностями абонента. Затем он определяет число P из условия

и число W, такое что
, при котором
. Пусть, например,
,
, так, что
, которые и образуют секретный ключ пользователя.
Образовав секретный ключ, абонент A переходит к формированию общедоступного ключа, в качестве которого выступает вектор
, содержащий «лазейку»:
,
так что
.
Предположим, что пользователь B собирается послать сообщение абоненту A. Если
, то пользователь B создает следующее число

и передает его пользователю A. Последний преобразует его в
по алгоритму
,
которое, в свою очередь, определяется как
. Учитывая, что вектор
является быстровозрастающим, на основании алгоритма (13.3) абонент A легко восстановит вектор
.
Поскольку
, то
. Далее
,
следовательно,
. Аналогично для
:
,
то
. Продолжая следовать алгоритму (13.3), получаем
. Так что в итоге имеем
.
Схем Меркла–Хэллмана в настоящее время считается взломанной, поэтому для реализации криптосистем с открытыми ключами используется алгоритм RSA.