Сопоставление значения с другим значением и обратно
Представьте значение, скажем "1234". Я хочу отобразить это значение на другое значение, скажем, "abcd". Ограничения:
- Длина целевого значения равна начальному значению
- Отображение должно быть уникальным. Например, 1234 должен отображаться только в abcd и viseversa
- Процесс картирования должен быть (очень) сложным, чтобы угадать. Например, умножение на 2 считается
- Отображение должно быть обратимым
- Начальное значение является целым числом
- Целевое значение может быть любого типа
Это должен быть базовый алгоритм, в конце концов я напишу его на Ruby, но здесь это не имеет значения.
Я думал по следующим направлениям:
SECRET = 1234
def to(int)
SECRET + int * 2
end
def fro(int)
(int - SECRET) / 2
end
Очевидно, что это нарушает ограничения 1 и 3.
Конечная цель - анонимизировать записи в моей базе данных. Я мог бы быть из-за этого.
2 ответа
Во-первых, я думаю, что ваши цели слишком амбициозны: почему ограничение 6?
Во-вторых, технически вам нужна биекция из области целых чисел.
В-третьих, ваше ограничение 3 противоречит принципу Керхоффа. Вам было бы лучше с хорошо известным алгоритмом, управляемым секретным ключом, где секретный ключ трудно получить, даже если вы знаете результаты для большого набора целых чисел.
В-четвертых, что вы анонимизируете против? Если вы имеете дело с личной информацией, как вы защитите себя от статистического анализа, который показывает, что Xyzzy на самом деле Джон Доу, основываясь на отношениях с другими данными? Есть некоторые исследования по противодействию таким векторам атаки (например, g-anonymization).
В-пятых, используйте существующие криптографические примитивы, а не пытайтесь изобретать свои собственные. Существуют алгоритмы шифрования (например, AES в режиме цепочки блоков шифрования), которые хорошо протестированы - AES хорошо поддерживается всеми современными платформами, в частности, Ruby. Однако шифрование по-прежнему не дает анонимности записей в каком-либо сильном смысле.
Возможно, стоит рассказать немного подробнее о том, что вы пытаетесь достичь. Предположительно, вы беспокоитесь о том, что какой-то злой человек завладеет вашими данными, но разве не возможно, что этот злой человек также будет иметь доступ к коду, который получил доступ к вашей базе данных? Что мешает им изучить алгоритм, проверяя ваш код?
Если вы действительно хотите анонимизировать данные, то это, как правило, односторонним способом (имена удаляются, значения кредитных карт и т. Д.). Если вы пытаетесь зашифровать содержимое базы данных, то многие механизмы базы данных предоставляют хорошо проверенные механизмы для этого. Например:
Лучшие практики для работы с зашифрованными данными в MSSQL
Всегда лучше использовать механизм шифрования продукта, чем использовать собственный.