То, что написано в гугл и википедии - смысла повторять нет.
Напишу как бы я сделал:
Чтобы усложнить дешифрацию, нужно избавиться от подбора ключа по известной сигнатуре/типу данных. Непосредственно перед шифрованием нужно сделать "мутацию" данных: текст, изображение, звук, видео или что-то ещё - должно быть абсолютно непонятно "что это?" по сигнатуре после корректной дешифрации.
Порядок действий:
1. Получаем с сервера публичный ключ и формулу (на JS) для мутации исходных данных одним из N-способов (это могут видеть все).
2. Выбираем случайным образом N из предложенного сервером диапазона и мутируем данные по формуле.
3. Шифруем мутированные данные публичным ключом.
Теперь, чтобы расшифровать, нужно знать точный "приватный ключ" и корректно подобрать N, используя алгоритм обратного преобразования.
Если не знать, что зашифрованные данные были подвержены мутации, то подбор ключа - будет бесполезен, т.к. неизвестно как должны выглядеть данные с корректным ключом.
А если - знать, то на каждый приватный ключ придётся перебирать все возможные N-мутации.
Пример: если ключей всего 1000 [1..1000], а N всего 5 [1..5], то это 1000*5=5000 комбинаций к проверке.
При том, что сервер, используя свой приватный ключ, подбирает лишь только N, за время, меньше секунды.