Я хочу зашифровать эту строку с помощью открытого ключа, где результирующее сообщение <64 символа.
На самом деле, похоже, вы можете, если немного уменьшите безопасность.
Одним из подходов было бы использование ECIES с, скажем, Р-192. (EC-Elgamal также будет работать - я думаю, что это лучший подход)
В этой схеме закрытый ключ представляет собой случайное значение $г$, а открытый ключ — это значение $P = rG$, куда $G$ является точкой генератора. Для шифрования мы выбираем случайное значение $s$, и вычислить оба $sG$ и $sP$; мы отправляем точку $sP$ (или, в вашем случае, только координату x) с помощью функции создания ключа, которая генерирует ключ, который мы используем для шифрования фактического сообщения. Шифрованный текст состоит из значения $sG$ (в вашем случае только координата x) и симметричное шифрование.
Теперь, если мы используем кривую P-192, координата x точки $sG$ может быть выражен в 192 битах; используя предоставленный нам алфавит (в котором 81 символ), это займет 31 символ (например, путем преобразования значения от 0 до примерно $2^{192}$ в базе 81).
Что касается симметричного шифрования сообщения, мы можем использовать метод шифрования с сохранением формата [1]; это может преобразовать сообщение, состоящее из алфавита из 81 символа, в зашифрованный текст того же алфавита и длины.
Таким образом, шифрование из 31 символа (наибольшего, что, как вы сказали, вас интересует) будет зашифровано как сообщение из 31 + 31 = 62 символа - в соответствии с вашими требованиями.
Стоимость охраны:
P-192 имеет «96-битную безопасность»; это немного меньше, чем мы обычно используем, но все равно довольно хорошо.
Мы пропускаем длину сообщения (поскольку метод Format Preserving Encryption сохраняет длину); если это дополнительное требование, вы всегда можете дополнить сообщение до 32 байтов (последний символ указывает фактическую длину сообщения) — при этом мы по-прежнему соблюдаем требования к длине
[1]: Обычно в ECIES мы используем явное преобразование целостности в симметричном шифровании. Я бы сказал, что в данном случае в этом нет необходимости — любая модификация FPE будет расшифровывать как что-то случайное, и противник всегда может заменить зашифрованный текст чем-то, что расшифровывает что-то случайное (простым способом выбора случайного открытого текста и его шифрования). с открытым ключом).