# теория · шаг 2 из 7
RSA: замок, который может закрыть каждый
Коротко
RSA - шифр с двумя ключами: открытым шифруют, секретным расшифровывают. Ключ строится из двух больших
простых p и q: модуль n = p · q, открытый показатель e, секретный d - обратный к e по модулю
φ(n) = (p − 1)(q − 1). Шифрование - mᵉ mod n, расшифровка - cᵈ mod n; вторая степень отменяет
первую по теореме Эйлера. Всё нужное для построения ключа уже разобрано в разделе: найти простые,
перемножить, найти обратный, возвести в степень. На тренажёре ключ из 53 бит собирается за 1674 шага,
шифрование стоит 19 шагов, расшифровка 52. Чтобы найти d по открытому ключу, нужно φ(n), а для него -
множители n.
Если ты построишь ключ RSA из двух простых, зашифруешь и расшифруешь число и объяснишь, почему расшифровка возвращает исходное сообщение и что мешает вычислить d по открытому ключу, - листай до «Теперь сам».
Как думаешь, можно ли шифровать без общего секрета
Обмен ключами из прошлого урока требует, чтобы обе стороны были на связи одновременно. А если нужно написать человеку, которого сейчас нет в сети, - отправить письмо, оставить файл?
Прежде чем читать дальше, ответь себе: может ли существовать шифр, в котором ключ для шифрования опубликован на всеобщее обозрение, а расшифровать сообщение способен только один человек? И если тот, кто шифрует, знает ключ шифрования, почему он не может им же и расшифровать?
На что это похоже
Представь навесной замок, который защёлкивается без ключа. Хозяин раздаёт открытые замки всем желающим, а ключ оставляет себе. Любой может положить письмо в ящик и защёлкнуть замок - и после этого сам не откроет то, что закрыл. Открыть может только хозяин.
Закрыть и открыть - разные действия, и умение делать первое не даёт умения делать второе. В RSA «защёлкнуть» - возвести в открытую степень, «открыть» - возвести в секретную.
Механизм: две степени, которые отменяют друг друга
Ключ строится в пять шагов. Справа - маленький пример, который можно проверить руками.
1. Выбрать два простых p = 11, q = 17
2. Перемножить: модуль n = 187
3. Длина круга степеней φ(n) = (p − 1)(q − 1) = 10 · 16 = 160
4. Открытый показатель, e = 7 НОД(7, 160) = 1
взаимно простой с φ(n)
5. Секретный показатель: d = 23 7 · 23 = 161 = 160 + 1
обратный к e по модулю φ(n)
открытый ключ: (n, e) = (187, 7) секретный ключ: d = 23
Сообщение - число m от 0 до n − 1: байты текста читаются как одно число по основанию 256. Шифрование: c = mᵉ mod n. Расшифровка: cᵈ mod n.
m = 42: c = 42⁷ mod 187 = 15 15²³ mod 187 = 42
Почему вернулось 42. Расшифровка вычисляет (mᵉ)ᵈ = m^(e · d). По построению e · d = 1 + k · φ(n) -
здесь 161 = 1 + 1 · 160. По теореме Эйлера m^φ(n) ≡ 1 (mod n), значит
m^(e·d) = m^(1 + k·φ(n)) = m · (m^φ(n))ᵏ ≡ m · 1ᵏ = m (mod n)
Показатели живут по модулю φ(n) - это следствие теоремы Эйлера из прошлой главы, - и d выбран так,
чтобы произведение показателей по этому модулю было единицей. Возвести в степень e, а потом в d -
всё равно что возвести в первую.
Теорема Эйлера требует, чтобы m было взаимно просто с n. Для RSA равенство верно и без этого
условия: по китайской теореме его достаточно проверить отдельно по модулю p и по модулю q, а там
случай m, кратного модулю, даёт ноль с обеих сторон, а для остальных m работает теорема Ферма:
φ(n) делится на p − 1.
Теперь что знает посторонний: n и e. Ему нужно d, обратное к e по модулю φ(n). Алгоритм
Евклида нашёл бы его мгновенно - если бы был известен модуль φ(n) = (p − 1)(q − 1). А чтобы узнать его,
нужны p и q. Хозяин ключа знает множители, потому что сам их выбрал. Остальным пришлось бы
раскладывать n.
Правило
Ключ RSA: простые p и q, модуль n = p · q, открытый показатель e, взаимно простой с
φ(n) = (p − 1)(q − 1), секретный показатель d = e⁻¹ mod φ(n). Открытый ключ - пара (n, e),
секретный - d (вместе с p и q). Шифрование числа m < n: c = mᵉ mod n. Расшифровка:
m = cᵈ mod n. Корректность следует из теоремы Эйлера: m^(e·d) ≡ m (mod n). Стойкость опирается на
то, что φ(n) нельзя вычислить, не зная множителей n.
Разбор: ключ побольше и цена каждого шага
p = 60000011
q = 130000001
n = p * q
phi = (p - 1) * (q - 1)
e = 65537
d = pow(e, -1, phi)
m = 20261004
c = pow(m, e, n)
print(c, pow(c, d, n))
n = 7 800 001 490 000 011 открыт
e = 65 537 открыт
d = 726 597 310 473 473 секрет
c = 1 903 173 972 263 712 шифртекст числа 20 261 004
Вторая степень возвращает 20 261 004. Цена на тренажёре:
действие шагов
поиск p и q вверх от 60 и 130 миллионов и расчёт d 1 674
шифрование: степень e = 65 537, 17 бит 19
расшифровка: степень d, 50 бит 52
вычисление d при известных p и q 14
Первая строка - отдельная программа: от каждого из двух стартовых чисел она идёт по нечётным вверх до первого простого, проверяя кандидатов тестом Миллера-Рабина с двенадцатью основаниями.
Шифрование дешевле расшифровки, и это устроено намеренно. Число 65 537 = 2¹⁶ + 1 в двоичной записи -
две единицы и пятнадцать нулей между ними: из семнадцати кругов степени домножение есть только в двух. Его
берут почти всегда. Секретный показатель получается длиной с модуль, и короче его делать нельзя.
Ответы на вопросы из начала. Такой шифр существует. А отправитель не может расшифровать собственное
письмо, потому что знает только e: обратное действие требует d, а d - это знание множителей n.
Разбор: что на самом деле трудно
Ключ в примере - шестнадцать цифр, и ро-метод из прошлой главы разложит такое n за секунду. Настоящий
модуль - 2048 бит, 617 цифр, и вопрос в том, как растёт работа каждой стороны.
действие кто делает цена в числе битов b модуля
найти простое из b/2 бит хозяин ключа около b/6 кандидатов
(простое - одно из ln N чисел)
вычислить d хозяин ключа один расширенный Евклид
зашифровать кто угодно 17 умножений по модулю
расшифровать хозяин ключа около b умножений по модулю
разложить n взломщик растёт быстрее любого
многочлена от b
Каждое умножение по модулю - b² действий над битами столбиком. Удвоение длины ключа делает
расшифровку дороже в восемь раз, а разложение - по оценке цены решета числового поля для перехода от
2048 к 4096 битам - в сотни миллионов раз. Законный пользователь и взломщик
находятся по разные стороны границы между многочленом и экспонентой, и длиной ключа эту границу можно
отодвигать сколько угодно.
При этом никто не доказал, что разложение трудно. Нет даже доказательства, что взлом RSA требует разложения, - известно только, что разложение даёт взлом. RSA держится на том, что почти за пятьдесят лет быстрого способа не нашли.
Что ломается без этого
Первое: e, не взаимно простое с φ(n). Обратного не существует, ключ не строится. Обычно
проверяют наоборот: берут e = 65 537 и отбрасывают простые p, у которых p − 1 делится на него.
Второе: сообщение не меньше модуля. Шифруется m mod n, и расшифровка вернёт остаток, а не
сообщение. Длинные данные RSA не шифрует вовсе - об этом следующий урок.
Третье: φ(n) или простые в открытом виде. Любое из чисел p, q, φ(n), d раскрывает ключ
целиком. Отладочная печать «для проверки» - самый частый путь утечки.
Четвёртое: шифрование числа как есть. Формула mᵉ mod n для одного и того же сообщения всегда
даёт один и тот же шифртекст. Поэтому библиотеки перед шифрованием дополняют сообщение случайными
данными по стандартной схеме - OAEP, - и пользоваться надо ими, а не формулой. Как именно читают
сообщение без дополнения - в уроке об ошибках примененияРазбирается в разделе 18, глава «RSA и обмен ключами»: Где RSA ломают на самом деле: четыре ошибки применения.
Зачем это в работе
Сертификаты сайтов. Когда браузер проверяет, что сервер - тот, за кого себя выдаёт, он проверяет
подпись, и очень часто это подпись RSA. Ключи SSH вида ssh-rsa, подписи пакетов в дистрибутивах,
подписи писем - то же самое.
Расшифровка в библиотеках идёт через китайскую теорему: две степени по модулям p и q вместо одной
по n, вчетверо быстрее: числа и показатели вдвое короче, каждая степень в восемь раз дешевле. Поэтому секретный ключ в файле - не одно число d, а набор из p, q и
заранее посчитанных остатков.
Генерация ключа командой openssl genrsa 2048 - это ровно пять шагов из механизма. Долгая часть -
поиск простых: случайные кандидаты и тест Миллера-Рабина.
Срок жизни схемы известен. Алгоритм Шора на квантовом компьютере раскладывает числа за полиномиальное время, и стандарты США предписывают отказаться от RSA к 2035 году. До тех пор это самая распространённая подпись в мире.
Теперь сам
p = 5,q = 11,e = 3. Найдиn,φ(n)иd.- Этим ключом зашифруй
m = 9. Расшифруй результат и проверь. - Почему для этого ключа нельзя взять
e = 5? - Модуль удлинили с 2048 до 4096 бит. Во сколько раз подорожала расшифровка, если умножение - столбиком?
Ответ. 1. n = 55, φ(n) = 4 · 10 = 40. Нужен d с 3 · d ≡ 1 (mod 40): d = 27, потому что
3 · 27 = 81 = 2 · 40 + 1.
-
c = 9³ mod 55 = 729 mod 55 = 14. Расшифровка:14²⁷ mod 55. По частям:14² = 196 ≡ 31,14⁴ ≡ 31² = 961 ≡ 26,14⁸ ≡ 26² = 676 ≡ 16,14¹⁶ ≡ 16² = 256 ≡ 36.27 = 16 + 8 + 2 + 1:36 · 16 = 576 ≡ 26,26 · 31 = 806 ≡ 36,36 · 14 = 504 ≡ 9. Вернулось 9. -
НОД(5, 40) = 5: у пятёрки нет обратного по модулю 40, секретный показатель не существует. -
В восемь раз: умножений вдвое больше (показатель вдвое длиннее), и каждое вчетверо дороже.
Главное
RSA собран из деталей этого раздела без остатка: простые находит тест Миллера-Рабина, секретный показатель - расширенный алгоритм Евклида, шифрует и расшифровывает быстрая степень по модулю, а корректность даёт теорема Эйлера. Секрет в нём - не алгоритм и не показатель сам по себе, а разложение модуля: кто знает множители, тот знает длину круга степеней и умеет обращать возведение в степень. Остальным остаётся задача, для которой быстрого решения не найдено.
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий