Простой алгоритм шифрования числа в число (или числа в шестнадцатеричный), который минимизирует количество символов.

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

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

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

Какие-либо предложения?


person Clay Nichols    schedule 23.05.2010    source источник


Ответы (4)



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

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

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

person Dean Harding    schedule 24.05.2010
comment
Мне удалось просто ввести лицензионный ключ, так что это всего от 5 до 10 цифр (все шестнадцатеричные символы). - person Clay Nichols; 24.05.2010

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

person Clay Nichols    schedule 24.05.2010

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

Для кодирования самый простой подход — рассматривать ввод как большое число (вы), выбрать набор символов и закодировать число как основание-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.

person Ants Aasma    schedule 25.05.2010