Способ шифрования одного int - PullRequest
9 голосов
/ 06 июня 2009

Как вы можете недорого использовать двустороннее шифрование 32-битного целого числа, чтобы каждое число отображалось на какое-то другое целое в этом пространстве и обратно, что трудно предсказать?

И, конечно же, не требует предварительного хранения 4,29 млрд. В таблице сопоставления.

Ответы [ 10 ]

19 голосов
/ 06 июня 2009

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

Если вам действительно нужны 32 бита, и вы не возражаете против снижения безопасности, тогда достаточно просто обрезать сетевой шифр Feistel, такой как Blowfish, до любой длины блока, кратной 2 и меньше, чем начальный шифр. Для Blowfish , просто разделите ваш входной номер равномерно между двумя половинными блоками и обрежьте выходные данные функции F и P-значения до 1/2 вашего целевого размера блока. Все это можно сделать после ввода алгоритма, как обычно.

7 голосов
/ 06 июня 2009

Очевидно, вам нужен какой-то случайный ключ для его защиты. В этом случае:

int original = 42;
int key = give_me_a_random_int();

int encrypted = original ^ key;
int unencrypted = encrypted ^ key;

// now, unencrypted == original == 42

Это просто XOR. XORing снова перевернет этот процесс.

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

5 голосов
/ 01 июля 2010

Используйте 32-битный блочный шифр, я нашел только skip32: http://www.qualcomm.com.au/PublicationsDocs/skip32.c

1 голос
/ 06 июня 2009

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

Итак, в основном, используйте стандартный алгоритм, который использует цепочку, и вставьте перед ним четыре случайных 32-разрядных числа. Это должно помочь скрыть любые закономерности / избыточность в вашем 32-битном сообщении. Черт, колодка в конце тоже, если вам угодно.

По сути, чем меньше пишешь, тем лучше. Все облажались.

1 голос
/ 06 июня 2009

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

0 голосов
/ 20 мая 2015

Взгляните на: github.com/msotoodeh/integer-encoder project. Он поддерживает 32- и 64-разрядные целые числа.

0 голосов
/ 07 июня 2009

Возьмите 32-битный вход, разделите его на две 16-битные половины L и R, затем повторите следующие шаги: вычисление псевдослучайной функции R, xor результат этой псевдослучайной функции к L и замена L и R. Это конструкция Luby-Rackoff . Псевдослучайная функция не должна быть обратимой. Так, например, вы можете взять блочный шифр, зашифровать 16-битный код и сократить результат до 16-битного. Убедитесь, что не во всех раундах используется одна и та же псевдослучайная функция (в rsp. Используются разные ключи раундов).

0 голосов
/ 06 июня 2009

Если все, что вам нужно, это что-то действительно простое, что обычный пользователь не заметит, тогда используйте ряд операторов XOR и shift.

Проблема неиспользования массива для хранения примерно 4 миллиардов INT состоит в том, что вам нужна функция, которая выполняет случайную однозначную карту в домене с 4 миллиардами INT. Вы можете смешать несколько операторов XOR и shift для создания своих собственных, но это не составит труда взломать. Даже если бы была хорошо известная карта «один на один», она также потерпела бы неудачу. Без соли кто-то может просто сгенерировать простой радужный стол, чтобы сломать его.

Проблема с солью в двухсторонней связи заключается в том, что вы должны защищать ее. Соли должны быть секретными, и как только вы узнаете, что это такое, они становятся бессмысленными.

Если вы хотите настроить безопасный канал связи, взгляните на Протокол обмена сообщениями вне протокола версии 2 . Это даст вам пример того, насколько сложным может стать шифрование связи. Я бы посоветовал вам найти что-то хорошо известное, что кто-то другой уже создал и протестировал. Даже если вы используете что-то, что создал кто-то другой, если вы используете это неправильно, это не удастся.

0 голосов
/ 06 июня 2009

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

Если вы используете оба, то выяснить используемый метод будет не так уж и просто. Они будут в некоторой степени защищать друг друга.

0 голосов
/ 06 июня 2009

Я использовал XOR + ADD с 64-битным секретным ключом. Я также использовал для смены ключа каждые пару минут и пытался расшифровать с помощью текущего или предыдущего ключа. (В моем домене целое число не должно быть защищено более четырех минут.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...