Проблема здесь в том, что ключ, который используется для шифрования (Штрих или что-то, полученное из Штриха), должен быть отправлен вместе с зашифрованным сообщением.В противном случае протокол дешифрования не сможет сравнить такт дешифрования с оригиналом.
Итак, предположим, Алиса хочет зашифровать какое-то сообщение M
.Она единственная, кто должен расшифровать сообщение, так что Боба нет на картинке.Алиса генерирует нечеткий ключ шифрования Ke
и шифрует M
, чтобы стать Me
: Encrypt(M,Ke) = Me
.Отправленное сообщение: (Ke,Me)
.На принимающей стороне Алиса выдает ключ нечеткой расшифровки Kd
.Некоторые алгоритмы проверяют, что Ke ~ Kd
и Me
расшифрованы: Decrypt(Me,Ke) = M
.Обратите внимание, что это симметричное шифрование;Kd
используется только для проверки того, что он «достаточно равен» Ke
.
Конечно, проблема в том, что Ke
отправляется в виде открытого текста вместе с сообщением, поэтому Eve можно просто взять ключ и расшифровать Me
.Тем не менее, Ke
необходимо на принимающей стороне, чтобы сравнить его с Kd
.Итак, как мы можем отправить Ke
вместе с сообщением, чтобы Ева не смогла подслушать?Мы могли бы создать хеш Ke
и отправить его через строку: (Hash(Ke),Me)
.Однако на принимающей стороне не было бы никакого способа проверить «достаточное равенство» между Ke
и Kd
на основе Hash(Ke)
.
Мы могли бы придумать некоторый алгоритм, который генерирует значение на основе Ke
такой, что если Ke ~ Kd -> V(Ke) ~ V(Kd)
(если Ke
и Kd
похожи, то сгенерированные значения похожи).Отправляем сообщение (V(Ke),Me)
получателю.Однако теперь Еве было бы относительно легко определить Ke
на основе V(Ke)
.Она начинает со случайного ключа-кандидата: KeC
и, используя наш алгоритм, определяет V(KeC)
.Если это не похоже на V(Ke)
в сообщении, она вносит некоторые радикальные изменения в кандидата KeC
и пытается снова.Подойдя ближе к V(Ke)
сообщения, она вносит меньшие изменения в KeC
и т. Д.
. Поэтому невозможно создать безопасную схему шифрования, если мы разрешим отправку Ke
вместе с сообщением.,Это означает, что Ke
должен быть передан Trent , доверенной третьей стороне.В этом случае Трент может быть базой данных приложения.Теперь схема выглядит следующим образом:
Алиса генерирует Ke
, сообщение M
и уникальный идентификатор Id
.Ke
хранится в нашей базе данных Трента вместе с Id
.M
шифруется с использованием обычной схемы шифрования, которая использует Ke
в качестве ключа: Me = Encrypt(M,Ke)
.Сообщение, отправленное получателю: (Me,Id)
.
. На принимающей стороне Алиса получает сообщение (Me,Id)
.Алиса генерирует Kd
.Основываясь на Id
, мы получаем соответствующий Ke
от Трента и сравниваем его с Kd
.Если есть совпадение, мы расшифровываем Me
: M = Decrypt(Me,Ke)
.
Единственная проблема теперь - когда у вас есть нарушитель Мэллори с доступом к Тренту.Он может запросить у Трента значения Ke
, основанные на случайных идентификаторах.Чтобы предотвратить это, вы не должны включать Id
в сообщение, чтобы сообщение просто стало (Me)
.Теперь вам нужно придумать стратегию, чтобы получить кандидатов Ke
от Трента только с использованием Kd
.Это, конечно, возможно, потому что вы можете сравнить Kd
со всеми Ke
в базе данных, вернуть наиболее «похожий» Ke
и попробовать это в качестве ключа расшифровки.Эта стратегия предполагает, что инсульт каждого человека (или Ke) достаточно различен.
Приведенная выше стратегия заимствована из биометрического шифрования, где вы храните биометрические данные в базе данных и используете их для идентификации или аутентификации людей.Попробуйте найти в Google биометрическое шифрование , чтобы получить дополнительную информацию.