Привет, Хабр!
Недавно на работе возникла задача, связанная с асимметричным шифрованием — методом криптографии, где для шифрования и расшифровки используются два разных ключа:
Открытый ключ (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 остаётся стойкой.
abutorin
а теперь давайте усложним:
В цифровой подписи, публичный ключ предназначен для шифрования или расшифрования?
suns
Для проверки подписи, не всегда проверка+создание подписей эквивалентно шифрованию+расшифровыванию
Пример - подпись через дерево Меркла, где никакого шифрования не происходит вовсе, а лишь доказывается, что «этот хеш - истина»