Привет, Хабр!
Недавно на работе возникла задача, связанная с асимметричным шифрованием — методом криптографии, где для шифрования и расшифровки используются два разных ключа:
Открытый ключ (public key) — можно свободно передавать, им шифруют данные.
Закрытый ключ (private key) — хранится в тайне, только им можно расшифровать.
И в процессе изучения у меня сложилась путаница в голове.
«Почему расшифровать сообщение можно только закрытым ключом?»
«Как открытый ключ не может расшифровать то, что сам же зашифровал?!»
Я перерыл кучу статей и обучающих видео, но понимания так и не появилось. Пока вдруг — бац — не сложилось. И теперь хочу поделиться этим озарением в максимально простой (и слегка котиковой) форме.
Возможно, кому‑то сэкономит пару часов жизни.
Короткий ответ:
Всё дело в математике. Но если бы меня устраивали такие ответы, я бы не полез в дебри.
Давайте разберём одну из самых первых криптосистем с асимметричным шифрованием — ранцевую схему Меркла‑Хеллмана. Чтобы было понятнее, будем шифровать кличку дефолтного кота — БАРСИК.
Прежде чем мы приступим, важно усвоить два термина:
1. Супервозрастающая последовательность — это такая цепочка чисел, где каждое новое число больше суммы всех предыдущих. Например: [1, 3, 6, 12]. Проверим:
3 > 1,
6 > 1+3,
12 > 1+3+6.
2. Обратное по модулю число — это число, которое при умножении на исходное даёт 1 по модулю N. Например, для числа 3 и модуля 11 обратное — это 4, потому что
Пример 1. Ранцевая система Меркла‑Хеллмана.
Приступим к созданию ключей:
Создание закрытого ключа | Нужно придумать супервозрастающую последовательность | |||||||
[11, 13, 27, 55, 111, 223, 447, 895] | ||||||||
Выбираем простое число больше суммы последовательности | ||||||||
Выбираем 1801 | ||||||||
Выбираем любое число из интервала от 1 до 1801 | ||||||||
Например, 915 | ||||||||
Отлично, мы создали закрытый ключ: | ||||||||
Создание открытого ключа | Умножим каждый элемент нашей супервозрастающей последовательности на 915 и найдем остаток от деления на 1801 | |||||||
11 | 13 | 27 | 55 | 111 | 223 | 447 | 895 | |
11 × 915 mod1801 | 13 × 915 mod1801 | 27 × 915 mod1801 | 55 × 915 mod1801 | 111 × 915 mod1801 | 223 × 915 mod1801 | 447 × 915 mod1801 | 895× 915 mod1801 | |
1060 | 1089 | 1292 | 1698 | 709 | 532 | 178 | 1271 | |
Последовательность [1060, 1089, 1292, 1698, 709, 532, 178, 1271] - это наш открытый ключ |

Берем слово, БАРСИК и переводим каждую букву в 8-битную кодировку | |||||
Б | А | Р | С | И | К |
11000001 | 11000000 | 11010000 | 11010001 | 11001000 | 11001010 |
Умножаем биты на элементы открытого ключа. Если бит = 1 — берём число из ключа. Если бит = 0 — пропускаем. | |||||
1 × 1060 + | 1 × 1060 + | 1 × 1060 + | 1 × 1060 + | 1 × 1060 + | 1 × 1060 + |
Таким образом БАРСИК превратился в [3420, 2149, 3847, 5118, 2858, 3036] |
Мы зашифровали наше сообщение — и знаем последовательность [1060, 1089, 1292, 1698, 709, 532, 178, 1271] и шаги шифрования, но расшифровать наше сообщение не представляется возможным. Зная только открытый ключ, подобрать исходные биты сложно. Попробуйте подобрать для числа 3420 комбинацию, какие биты были единицами, а какие нулями.
Давайте теперь, вернем барсика на место с помощью закрытого ключа.
Напомню, что наш закрытый ключ это [11, 13, 27, 55, 111, 223, 447, 895], 1801, 915.
Находим обратное по модулю число. Нужно решить | |||||
Берем полученный шифротекст [3420, 2149, 3847, 5118, 2858, 3036] | |||||
3420 × 559mod1801 = 919 | 2149 × 559mod1801 = 24 | 3847 × 559mod1801 = 79 | 5118 × 559mod1801 = 974 | 2858 × 559mod1801 = 135 | 3036 × 559mod1801 = 582 |
Используем "жадный алгоритм": | |||||
919-895=24 | 24-13 =11 | 79-55=24 | 974-895=79 | 135-111=24 | 582-447=135 |
Запишем элементы последовательности закрытого ключа [11, 13, 27, 55, 111, 223, 447, 895], которые мы брали для вычитания | |||||
895,13,11 | 13,11 | 55,13,11 | 895,55,13,11 | 111,13,11 | 447,111,13,11 |
Используемые элементы обозначим 1, а остальные 0 | |||||
11000001 | 11000000 | 11010000 | 11010001 | 11001000 | 11001010 |

Надеюсь, мне удалось показать пример того, как математика превращает простые операции в «невозвратимые» шифры.
Пример 2. RSA
Создание открытого ключа | Находим два больших (чтобы было посложнее) простых числа |
Например, 524309 и 912349 | |
Находим их произведение | |
Выбираем любое простое число | |
Пусть будет 32831 | |
Мы создали открытый ключ: | |
Создание закрытого ключа | Вычисляем функцию Эйлера |
Находим обратное по модулю число. Нужно решить | |
Мы создали закрытый ключ: |

Берем слово, БАРСИК и присваиваем каждой букве значение ее порядкового номера в русском алфавите | |||||
Б | А | Р | С | И | К |
2 | 1 | 18 | 19 | 10 | 12 |
Прибавим 13, чтобы все числа были двузначными | |||||
15 | 14 | 31 | 32 | 23 | 15 |
Конкатенируем (склеим) полученные значения | |||||
151431322315 | |||||
Полученное значение возводим в степень 32831. Затем находим остаток от деления результата на 478352791841 | |||||
Мы зашифровали сообщение. Теперь без закрытого ключа расшифровка становится сложной задачей. Для этого потребуется решить уравнение:
Wolfram|Alpha с этим не справился. Хотя для нахождения ключей я использовал числа по 20 бит, в то время как Национальный институт стандартов и технологий говорит о минимальном значении в 1024 бита.
Вернем барсику его привычный вид с помощью закрытого ключа
Берём шифротекст 445187033916. Возводим его в степень 138634618031. Затем находим остаток от деления результата на 478352791841 | |||||
Разбиваем полученное значение 151431322325 на блоки по 2 цифры | |||||
15 | 14 | 31 | 32 | 23 | 25 |
Отнимаем 13 | |||||
2 | 1 | 18 | 19 | 10 | 12 |

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

Криптография — это не магия, а тщательно продуманные математические задачи. И если ваш Барсик должен остаться в тайне, никому не давайте закрытый ключ. Закрытый ключ — как лазерная указка: должна быть только у хозяина.
P.S. Ранцевая криптосистема Меркла-Хеллмана была взломана, а RSA остаётся стойкой.