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