Зашифровать целое число как читабельную строку <= десять символов - PullRequest
0 голосов
/ 09 августа 2011

Мне нужно найти способ (предпочтительно асимметрично) [1] шифровать / дешифровать один Int32, в результате чего зашифрованное значение, содержащее только допустимые символы [2], имеет длину не более одиннадцати символов.

Как бы я поступил так?

[1] Учитывая ответы, симметричное шифрование в порядке

[2] буквенно-цифровые символы [0-9a-zA-Z], специальные символы "$-_.+!*'()

Ответы [ 5 ]

2 голосов
/ 09 августа 2011

Вы не можете использовать асимметричное шифрование, например RSA, и получить что-то маленькое.Зашифрованное значение будет размером (в байтах) модуля, например 128 байтов для 1024 бит.IIRC .NET не позволит вам использовать ключ размером менее 384 бит (48 байт), который все еще слишком велик и не очень безопасен [1].

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

[1] В любом случае помните, что угадывание целого числа - это, как максимум, проблема 2 ^ 32; -)

1 голос
/ 09 августа 2011

Используя base64, вы получите около 66 бит с 11 символами.Если вы увеличите свой набор символов, вы получите больше.(Если вы считаете китайские символы «удобочитаемыми», вы получите гораздо больше)

Я не думаю, что безопасное асимметричное шифрование с такими параметрами возможно.RSA нужно несколько сотен и более> 1000-битных ключей и блоков.Даже криптографическая кривая с эллиптическими кривыми использует блоки намного большего размера, чем ~ 66 бит.

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

Поэтому я бы искал приличный 64-битный блочный шифрс большим (128 бит +) ключом.Я думаю, что некоторые из них существуют, но обычно не используются.

И не забудьте добавить произвольное заполнение к 64 битам.Наличие только 2 ^ 32 различных открытых текстов может быть опасным.

1 голос
/ 09 августа 2011

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

если вы используете 64-битный размер блока, вам придется исправить IV. другими словами, если вы отправляете один и тот же номер дважды, он будет кодироваться одинаково оба раза [неправда! - См аккуратную идею в комментариях ниже. но с 32-битным блочным шифром вы можете использовать случайный IV (заполнение, чтобы скрыть повторяющиеся значения). похоже, что skip32 был бы хорошим выбором - см. Какой «хороший» алгоритм блочного шифрования имеет самый короткий вывод?

Другая, специальная идея, что я только что вытащил свою задницу и что поэтому может быть небезопасным, - это разделить ваше сообщение на две части: 32 бита и остальные. заполните остальное случайным значением, которое вы используете в качестве (заполненного нулями, если необходимо) начального числа для любого потокового шифра (http://en.wikipedia.org/wiki/Stream_cipher)), затем xor значение, которое вы хотите зашифровать, с первыми 32 битами этого (так Ваше последнее сообщение - результат 32 бит xor плюс случайное начальное число).

наконец, я понятия не имею, почему все убеждены, что эти сообщения будут / должны / должны быть небезопасными. безопасность не зависит от размера сообщения (важен размер ключа). насколько я знаю, маленькие блоки слабы против длинных сообщений. здесь у вас нет длинного сообщения (есть важное различие между возможностью угадать одно сообщение за 2 ^ 32 и знанием всех сообщений после аналогичного "небольшого" количества догадок).

0 голосов
/ 09 августа 2011

Не существует каких-либо обычных асимметричных алгоритмов с результатом, который уместился бы в 11 символов или меньше.

Для действительно безопасного решения вам понадобится уникальный порядковый номер или идентификатор для каждого сообщения; это может быть то, что вы можете использовать для инициализации режима шифрования, например, IV для CBC или счетчик для режима CTR. Однако важно, чтобы это начальное число не было предсказуемым для данного простого текста.

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

0 голосов
/ 09 августа 2011

XOR значение с заданным ключом, а затем отображение результата в виде шестнадцатеричной строки

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