Простой алгоритм шифрования число-число (или число-шестнадцатеричный), который минимизирует количество символов - PullRequest
0 голосов
/ 24 мая 2010

Мне нужно зашифровать число, и я, и это зашифрованное значение, будет передано клиенту, спросить ключ, поэтому я хочу минимизировать количество цифр и сделать их все для печати.

Так что я бы хотел, чтобы результатом был либо весь номер, либо все шестнадцатеричные символы.

Текущий метод шифрования, который я использую (для не чисел), преобразует символы в шестнадцатеричные (2 шестнадцатеричных цифры каждый). Это удваивает количество символов. Я также рассмотрел просто обработку ввода как шестнадцатеричного (так что каждая пара чисел обрабатывается как шестнадцатеричная пара, но тогда у вас есть неоднозначность между входом 0123 и 123 (при расшифровке, что ведущий '0' теряется.

Есть предложения?

Ответы [ 4 ]

1 голос
/ 24 мая 2010

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

Если вы хотите ограничить его другим набором (например, нижебуквы регистра), используйте соответствующую базу (например, шестнадцатеричный )

0 голосов
/ 25 мая 2010

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

Для кодирования самый простой подход состоит в том, чтобы рассматривать входные данные как большое число (вы), выбирать набор символов и кодировать число как base-N, где N - размер выбранного набора. Поскольку полученный код предназначен для ввода человеком, вам нужно избегать использования нескольких символов с одинаковыми формами (1, l, I / O, O, 0, D / 5, S), выбор зависит от используемого шрифта .

Также очень полезно иметь встроенное обнаружение ошибок. Простой способ создать хорошее обнаружение ошибок - добавить к числу несколько битов хорошей хеш-функции. Например (в псевдокоде):

number_to_encode = input_number << 5 | MD5(input_number) & 0x1F
encoded_string = Base32Encode(number_to_encode)

number_to_decode = Base32Decode(encoded_string)
output_number = number_to_decode >> 5
checksum = number_to_decode & 0x1F
if MD5(output_number) & 0x1F != checksum then
    Error

Вы можете сделать это лучше, если у вас есть модель ошибок, но при условии, что модель случайных ошибок хороша, обнаруживает более 96% всех ошибок, добавляя только один символ base32.

0 голосов
/ 24 мая 2010

Я разобрался с простым кладжем: Если количество цифр нечетное , тогда я добавляю префикс заполнителя Hex (F). Затем, когда я расшифровываю, если я вижу этот заполнитель (F), я знаю, что это был заполнитель (в качестве входных данных этой функции разрешены только цифры b / c)

0 голосов
/ 24 мая 2010

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

Я думаю, что лучшим решением будет использование простого алгоритма хеширования для их имени пользователя / адреса электронной почты, с которым они зарегистрированы, чтобы хэшировать результат до 128-битного значения (16 байт), а затем использовать Base-32 , чтобы преобразовать это в буквы AZ и цифры 2-7 (которые будут иметь размер около 26 символов).

Преимущество Base32 состоит в том, что он не учитывает регистр (как в случае с base 64), и вы не получите путаницы между «i» и «1» (и т. Д.).

...