Использование штрихов пера с нечетким алгоритмом допуска в качестве ключа шифрования - PullRequest
12 голосов
/ 07 сентября 2010

Как я могу зашифровать / расшифровать с нечетким допуском?

Я хочу иметь возможность использовать обводку на InkCanvas в качестве ключа для моего шифрования, но при повторном дешифровании пользователю не нужно рисовать точный такой же символ, только похожий. Это можно сделать в .NET C #?

--- Обновление (9 сентября) ---

В идеале мне нужен алгоритм шифрования, который бы принимал любой ключ в определенном диапазоне ключей на основе некоторого базового ключа и функцию, определяющую допустимые различия.

Я делаю все шифрование / дешифрование локально, поэтому мне не нужно безопасно что-либо отправлять по проводам. И я не хочу хранить ключ, используемый для шифрования, поэтому мне не с чем будет сравнивать. Я мог бы придумать какой-нибудь метод для генерации одного и того же ключа для каждого подобного удара, но это было бы нелегко, если бы я хотел принять любой вид символа (не только буквы). Другой вариант, если ключ шифрования каким-то образом может принимать аналогичные ключи по замыслу, что я не знаю, если это возможно ...?

Ответы [ 7 ]

2 голосов
/ 15 сентября 2010

OK.Давайте разберем вашу проблему на две части.

1) Нечеткое 2) Шифрование

Реальность заключается в том, что обе эти концепции относительно стары, и их реализация существует уже много лет.Каждый из них хорошо справляется с рассматриваемой проблемой, но это не означает, что объединение этих двух является хорошей идеей.Я считаю, что ваше решение должно быть двухэтапным.

Прежде всего, стандарты шифрования отлично подходят для защиты данных с использованием ключа SINGLE EXACT.В вашем случае вам нужны симметричные алгоритмы шифрования, такие как AES или Rijndael.

Нечеткая часть решения также не так сложна.Как и любой другой метод нечеткого распознавания, вам необходимо выполнить извлечение признаков и создать вектор для передачи в алгоритм шифрования.Вы должны встроить нечеткость в свои функции.Например, количество штрихов, квадрант начальной точки для каждого такта, коэффициент кривизны для каждого такта и тому подобное.Этого будет достаточно для построения 32-битного вектора для перехода к алгоритму шифрования.

ОБНОВЛЕНИЕ

Я постараюсь сделать его более наглядным:

2 бита для количества ударов: 1, 2, 3, +3, что переводится в 00, 01, 10 и 11

2 бита для квадранта начала первого удара: TopLeft, TopRight, BottomLeft,BottomRightt кодирует в 00, 01, 10 и 11

2 бита для квадранта конца первого штриха: то же самое

2 бита для квадранта начала второго штриха: то же самое.Если второго хода нет, то 00.

2 бита для квадранта конца второго хода: то же самое.Если второго хода нет, то 00.

2 бита для квадранта начала третьего хода: то же самое.Если третьего такта нет, то 00.

2 бита для квадранта конца второго такта: то же самое.Если третьего хода нет, то 00.

2 бита для извилистости первого хода: прямой-> 00 ... Хороший круг-> 11.Это не будет очень легко, и вы можете уменьшить степень извилистости до 2 и использовать только один бит, но это «пососи и посмотри».

Так что это 16 бит.Вы можете оставить все остальное как ноль и попробовать посмотреть, как это работает.

Надеюсь, это поможет.

1 голос
/ 07 сентября 2010

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

0 голосов
/ 15 сентября 2010

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

Количество прямых
Количество закрытых областей
Количество использованного рисунка.

Стандартное отклонение точек на оси X.
Стандартное отклонение точек на оси Y.
Стандартное отклонение размера нарисованных фигур.

Сортированный список областей вложенных областей.

И т. Д.

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

0 голосов
/ 14 сентября 2010

Как я указывал в комментарии, я не знаю, что нечеткое шифрование является зрелой темой , так что давайте подумаем о том, что нужно делать в стороне. Поскольку вы выполняете шифрование / дешифрование локально, как насчет аппаратной реализации? Т.е. вы покупаете планшетный компьютер для биометрических измерений и укрепляете обычный ключ шифрования внутри него. Это будет выглядеть так:

  1. Планшетный компьютер установлен в режиме киоска , то есть имеет базовую защиту, предотвращающую переключение приложений в пользовательском интерфейсе. Он также защищен от физического воровства и взлома (например, хранится в хранилище)
  2. Пользователь подключает USB-ключ, содержащий зашифрованный файл.
  3. Планшетный компьютер определяет, какой чертеж следует ожидать из поля метаданных (например, из сертификата X509 , используемого для шифрования, если вы не возражаете против сверхинжиниринга ).
  4. Планшетный компьютер аутентифицирует пользователя с помощью соответствующей биометрической магии.
  5. Планшетный компьютер расшифровывает файл и предлагает сохранить его или просмотреть на экране.

Обратите внимание, что шаг 5 является слабым местом цепочки безопасности, поскольку атаки на средства просмотра документов (например, Acrobat Reader) становятся более преобладающими . Лучше использовать какую-нибудь схему песочницы, например, экземпляр VMWare.

0 голосов
/ 07 сентября 2010

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

Итак, предположим, Алиса хочет зашифровать какое-то сообщение 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 биометрическое шифрование , чтобы получить дополнительную информацию.

0 голосов
/ 07 сентября 2010

Если вы закодируете свои штрихи в виде изображений, есть нечеткие алгоритмы обнаружения сходства между изображениями . Конечно, если бы вы использовали такой подход, вы должны использовать двухсторонний метод шифрования, а не однонаправленный хэш, чтобы можно было восстановить исходное изображение.

0 голосов
/ 07 сентября 2010

Используйте некоторую форму OCR (оптическое распознавание символов), чтобы преобразовать обводку в обычный текст, а затем использовать этот текст в качестве ключа.Пока пользователь рисует все, что получает OCR-ed, в тот же текст, он сможет снова расшифровать.

...