Ответ Джека довольно прост и хорошо соответствует вашему Цезарскому шифру, но это не очень безопасно. Это всего лишь шифр замещения с гораздо большим «алфавитом». Как и ваш Цезарский шифр, это означает, что его можно сломать с помощью частотного анализа. Слова THE и AND довольно распространены на английском языке. ÉL и LA чрезвычайно распространены на испанском языке. Поэтому я ищу «слова», которые часто появляются в шифрованном тексте и предполагают, что они сопоставляются с общепринятыми словами на моем целевом языке. Я продолжаю делать догадки, основанные на частоте и контексте, пока не выработаю части сообщения (или даже целое сообщение). Если я знаю, что это, вероятно, о пуделях, и я вижу, что в сообщении часто появляется сообщение SUNRISE, возможно, я полагаю, что SUNRISE - пудель, и я работаю оттуда.
Мне нравится быть простым, но мне это не нравится, если я хочу безопасности.
Мы можем разработать схему шифрования, сохраняющую формат, что вы здесь хотите, но я не знаком с тем, который предназначен для работы на таком большом домене (это область, которую вы могли бы исследовать, хотя, или спросите у http://crypto.stackexchange.com, что было бы лучше для этого вопроса). Преимущество шифрования, сохраняющего формат, заключается в том, что результирующее сообщение должно быть того же размера, что и исходное сообщение.
Но вот еще одно решение, которое мы могли бы использовать, что является своего рода кодировкой base-N, где N - размер нашего словаря.
Начните с упорядоченного словаря и вашего открытого текста. Посмотрите каждое слово в словаре и обратите внимание на индекс. Используйте эти индексы для создания нового сообщения, в котором размер слова основан на количестве элементов в словаре. Для простоты вы можете объединить это число до 64 бит за семестр, но вы также можете сделать каждый термин произвольным количеством бит, если вы хотите сделать больше бит математики и позволить данным разливать границы байтов. Шифруйте это сообщение, как вам нравится (т. Е. AES).
Теперь нам нужно закодировать это на словах. Для значений, меньших, чем N-1, мы просто выбираем это слово из словаря. Для чисел, равных N-1 или более, вы можете использовать последнее слово в словаре как маркер, а затем добавить к нему следующее слово. Поэтому скажем, что у нас был словарь с 1000 словами (0..999) от А до ЗЫРЯНА. Мы могли кодировать 999 как ZYRIAN A и 1000 как ZYRIAN AARDVARK. Если нам нужно кодировать большие числа, мы можем цеплять. Например, ZYRIAN ZYRIAN A - 1998. Разумеется, вы получите лучшие размеры вывода, если вы снова разделите данные на границы байтов, значение не будет больше 2 * N.
Ключом здесь является то, что мы нарушили проблему на две проблемы: транскодер, который позволяет нам конвертировать между произвольными словами и числами и шифрование, которые мы можем использовать с использованием любой стандартной схемы шифрования.