Информационная безопасность

индекс
289,97

RSA и простые числа

Однажды мой друг-гуманитарий спросил меня, зачем нужны простые числа, кроме забавы. Первое, что мне пришло в голову из практического применения, оказалось RSA.

Что такое RSA?



RSA — это аббревиатура, которая расшифровывается как Rivest, Shamir, Adleman. Эти люди создали криптографический алгоритм, который и получил это название. Несмотря на то, что алгоритм был создан в 1976 году, он до сих пор остаётся популярным.

Как работает RSA



RSA работает следующим образом. Создаются два ключа — открытый и закрытый. Закрытый ключ владелец должен держать у себя и хранить в тайне, открытый же может распространять всем желающим. Допустим, 2 человека хотят вести тайную переписку. Пускай одного из них зовут Владимир Владимирович, а другого Дмитрий Анатольевич. При этом есть третий участник процесса — Борис Абрамович, которому очень интересно прочитать их переписку. Тогда ВВ и ДА создают каждый по паре ключей, обмениваются по электронной почте открытыми ключами. БА, при этом перехватывает открытый ключ каждого, но это ему, как мы увидим дальше, не сильно поможет. Далее, ВВ шифрует своё послание открытым ключом ДА и посылает второму зашифрованное сообщение. БА опять-таки его перехватывает, но ничего поделать не может, т.к. для прочтения ключа ему нужен закрытый ключ ДА, а ДА в свою очередь расшифровывает полученное сообщение, используя свой закрытый ключ, и только он и ВВ знают, что именно написано в этом сообщении.

Математическая сторона вопроса




Для более пытливых читателей, рассмотрим сам алгоритм шифрования и дешифрования. Пусть у нас есть пара ключей <P, S> ( Public — открытый; Secret — закрытый). Покажем как они формируются.

Выберем два простых числа p и q.

N=p*q

T = (p-1)(q-1)

Теперь выберем за E число, не имеющее общих простых делителей с T; выберем такое D что D*E = 1, по модулю T. То есть

D*E = 1 mod T. mod — означает взятие остатка от деления по модулю T, то есть 5 mod 3 = 3*1 + 2 mod 3 = 2. Для удобства, я буду писать mod не в каждой выкладке, а только в тех, где mod будет использоваться для осуществления перехода или же в конце формулы, чтобы подчеркнуть, что мы работали в mod N или mod T.

Шифрование происходит следующим образом: сообщение M шифруется открытым ключом P( M ) = ME mod N = C ( Ciphertext — зашифрованное сообщение ), а дешифруется закрытым ключом

S( C ) = CD = (ME)D = ME*D mod N = M1 = M.

Теперь следует пояснить математический смысл этих шаманских действий.

Первый логичный вопрос — зачем было выбирать именно два простых числа, когда сделать вычисление по mod можно сделать и без этого. Суть в том, что за T на самом деле стоит ф( N ) — функция Эйлера, и благодаря её свойствам этот алгоритм оказался таким хорошим.

ф( n ) ставит натуральному числу n в соответствие количество чисел, взаимно простых с ним, и не превышающих n.

Введём ещё одно понятие — ZL. Это группа целых чисел, в которых математические операции выполняются по mod L.

Почему мы выбираем E взаимно простым с T? Мы делаем это для того, чтобы уравнение E*D = 1 mod T имело решение. Более того, оно будет единственным.

Пускай, E не взаимно просто с T и имеет с T общий делитель Q. Тогда

E*X = 1 mod T <=> E*X = A*T + 1 = Q*B, где B — целое число. Но т.к. T делится на Q, то и 1 делится на Q, что невозможно, т.к. в ZT 1*B = 0 <=> B делится на T.

По теореме Эйлера

aф( N ) = 1

для всех a из ZN.

Применим эту теорему для нашего случая

E*D = 1 mod T <=> E*D = 1 + k(p-1)(q-1), где k — некоторое целое число.
ME*D=M1 + k(p-1)(q-1)=M*Mk(p-1)(q-1)
Покажем, что ME*D = M mod p

M*Mk(p-1)(q-1) = M*(M(p-1))k(q-1) mod p = M*(1)k(q-1) = M

Здесь теорема Эйлера скрывается в переходе M(p-1) = 1 mod p. Внимательный читатель мог легко заметить, что ф(p) = p-1 для простого числа p. Действительно, все числа до p, за исключением 1 взаимно просты с ним.

Аналогично ME*D = M mod q. Таким образом, ME*D = M mod pq

Итак, мы показали, что алгоритм RSA корректен. Но очевидно же, что p, q, D можно подобрать брутфорсным методом! Фактически, в открытом ключе уже лежит пара E, N. Но тут опять в игру вступает математика — если p и q достаточно большие числа, то с разложением E на множители суперкомпьютер будет справляться очень долго. В разных статьях и книжках можно найти цифры от 100 лет, до возраста вселенной. Эти цифры зависят от величины p и q.

Цифровые подписи



Опять вернёмся к практической стороне вопроса. В нашем примере, Борис Абрамович перехватил открытые ключи и может посылать Владимиру Владимировичу и Дмитрию Анатольевичу всякие непотребные письма от чужого имени, например содержащие вирусы. Из предыдущего раздела ясно, что если открытый и закрытый ключ поменять местами, то работа алгоритма по сути не изменится. То есть

P( S( M ) ) = S( P( M ) ) = M.

На этой идее и основывается цифровая подпись с использованием RSA. Текст M' Шифруется закрытым ключом и ВВ посылает ДА пару ( M', S( M' ) ) — ДА может проверить эту пару на соответствие, а БА не может подсунуть ДА такую пару, т.к. у него нет закрытого ключа ВВ.

В следующих постах я планирую рассказать о применении RSA в почтовых клиентах Thunderbird и The Bat, а также подробнее написать про цифровую подпись.
+27
23 февраля 2010, 23:57
41

комментарии (46)

+16
Darmstadtium #
имхо, лучше бы оставили алису, боба и еву…
+1
LanG #
я писал почти то же самое habrahabr.ru/blogs/infosecurity/49634/
НЛО прилетело и опубликовало эту надпись здесь
+2
rubtsov #
Вы правы — основной упор поста сделан на математику. Я собрал нужные вещи из Кормена и почти везде написал собственные доказательства.
+1
Blackover #
Спасибо ОГРОМНОЕ!
Напишите про квантовый компьютер и алгоритм Шора?
+2
rubtsov #
Хорошо, напишу. Тем более, что готовил Квантовый Компьютер как вопрос по выбору к ГОСу. Но только после серии про RSA — мне её нужно сделать как можно быстрее.
+46
TonyClifton #
Владимир Владимирович и Дмитрий Анатольевич должны использовать алгоритм ГОСТ 28147-89.
+1
ni4 #
Это симметричный ГОСТ, для подписи — 34.10-94, 34.10-2001.
–1
lunatik42 #
Если интересно — могу написать про реализацию AES при помощи встроенных классов в .net
+2
Mordred #
Расскажите, про метод эллиптических кривых. Его, как я знаю, используют в Украине по стандарту в банковской системе. Сравнения методов, плюсы/минусы.
0
rubtsov #
К сожалению, я с этим не сталкивался. Я больше работаю с дискретной математикой, чем с криптографией — с RSA я знаком из первой.
0
valeron #
Откуда такие сведения?
Наши банки, и, особенно, их IT отделы, не настолько продвинуты. И стандартом это не является.

А плюсы есть.Меньшая длина ключа.
0
ni4 #
В НБУ уже перешли на эллиптические кривые, по идее на ДСТУ 4145-2002.
–2
superhabra #
D*E = 1 mod T

Вероятно имелось ввиду D*E mod T = 1.
0
rubtsov #
Нет. В моей статье под mod T понимается не операция mod в Pascal, а работа с математическими операциями в ZT. На мой взгляд, я это ясно пояснил как раз в той строчке, на которую Вы указываете.
+5
Kotter #
Вероятно имелось ввиду D*E = 1 (mod T).
–1
rubtsov #
Да. В литературе можно встретить и такое обозначение.
+4
Neit #
Я считаю, что не самая понятная статья по RSA, написанная для людей, которые с этим не сталкивались. Я то конечно все поняла, но это исключительно благодаря тому, что сдавала экзамен, где RSA и ее особенности были экзаменационными вопросами. А вообще это прикольная штука) Но пока я сама не попробовала проделать все эти действия и решить все сравнения, на каком-нибудь игрушечном примере ничего не понятно было! А по этой теме может быть интересен протокол Диффи — Хеллмана, он проще даже.
0
rubtsov #
Можете пояснить, что именно Вам кажется в статье не очень понятным? Да, Вы правы — статья действительно написана для людей, которые этим не занимались, разве что математическая сторона вопроса может быть интересна тем, кто работав с RSA, в математику не углублялся.
+3
Neit #
Я взяла перечитала, впринципе вспомнив тему, да, она освежила математические выкладки ( для красоты я бы конечно сравнения написала вместо равенства и P( M ) = M^E = C считается по модулю N, так же как и С^D )
Можно пояснить, что М это целое число от 0 до N ( если длиннее то разбивают ) Так же в начале Вы говорите, что каждый создает по паре ключей, разве это надо, если у нас сторона А передает сообщение стороне В, нужна 1 пара.
* я бы убрала все эти длинные имена и их странные инициалы, сбиваети путаешь
0
AAbrosov #
две пары ключей надо, чтобы каждый адресат был уверен что он получил письмо от того, кого надо, а не от злоумышленника.
0
avalter #
Вы абсолютно правы. Для шифрования сообщений нужна только одна пара ключей. Вторая пара нужна только для цифровой подписи.
+1
ni4 #
Тут, как и в остальных книгах, пишется о создании двух ключей, открытого и закрытого, но забывают дописать что это же не разные ключи, а просто две связанные части по сути одного ключа :)
Я когда-то писал статью-введение в криптографию, если интересно — почитайте.
+2
Mofas #
Зачастую цифровую подпись для почты делается на основе хэша письма.
0
ni4 #
Всегда, а не зачастую, и не только для писем :)
0
valeron #
Асинхронно закриптовать все письмо, да и любой набор данный, довольно накладное занятие. Медленный алгоритм.
Поэтому подписывают хэш.
–4
AAbrosov #
Если злоумышленник не просто перехватит ключи, а сможет включиться между адресатами, то их никакое шифрование не спасет.
AB C?
ACB
(К.О.)
+1
avalter #
Знание публичных ключей почти никакой пользы не даст. Знание секретных — даст, но на то они и секретные.
Ну, будет злоeмышленник портить данные — мы чексуммы добавим, что-б это отловить.
А прочесть он ничего не сможет.
(Или я не верно понял Вашу идею?)
0
AAbrosov #
идея в том что злоумышленник перехватывает сообщения и не дает исходным сообщениям дойти до адресата. вклинивается между адресатами. для первого притворяется вторым а для второго первым. а открытые ключи тоже подменяет на свои. и при получении сообщения расшифровывает его правильным ключом и шифрует своим закрытым ключом.
0
avalter #
А откуда злоумышленник возьмёт правильный ключ? (Я что-то запутался)
Давайте попорядку, есть Алиса с ключами (Ap, Aq), Есть Боб с ключами (Bp,Bq), ключи p — публичные
Алиса шлёт Бобу сообщение M, шифруя его публичным ключом Bp — (M)_Bp
Злоумышленник перехватывает его. Что он должен сделать такое что-б прочесть M? Поясните пожалуйста.
0
avalter #
А! всё, понял, что Вы хотели сказать.
Вы имеете ввиду, что был скомпроментирован канал связи используемы для первоночальной инициализации системы.
Дело в том, что Вы написали «Если злоумышленник не просто перехватит ключи, а сможет включиться между адресатами», из этого я сделал вывод что система уже работает, раз есть адресаты и уже есть ключи.
Но это для любой системы справедливо, не корректно заданая система будет работать не корректно.
+2
sleepwalker #
Придумайте быстрый способ раскладывать числа на множители и проведите старость на своем острове в тихом океане.
–2
sonca #
Спасибо за статью.
Но очевидно же, что p, q, D можно подобрать брутфорсным методом! Фактически, в открытом ключе уже лежит пара E, N. Но тут опять в игру вступает математика — если p и q достаточно большие числа, то с разложением E на множители суперкомпьютер будет справляться очень долго. В разных статьях и книжках можно найти цифры от 100 лет, до возраста вселенной. Эти цифры зависят от величины p и q.

Тут наверное также следует упомянуть, что и генерация довольно больших p и q задача довольно не тривиальная. Т.к. наборизвестных простых чисел хоть и велик, но все же ограничен. Сейчас, если не ошибаюсь, каждому нашедшему новое простое число более 100 000 000 полагается премия в размере 150 000 $ :)

Вообще тема простых чисел, наверное, сама по себе заслуживает не одной статьи.
+3
avalter #
10888869450418352160768000001 — куда обратиться за призом? =)
А если серьёзно — то:
«Сейчас, если не ошибаюсь, каждому нашедшему новое простое число _сотоящее более чем из_ 100 000 000 _десятичных цифр_ полагается премия в размере 150 000 $»
+1
sonca #
Да, спасибо за поправку. Все верно, речь конечно же шла о количестве цифр, а не о размере самого числа.
+2
ivlad #
У вас про электронную подпись ерунда написана.

В электронной подписи никто не шифрует тело сообщения приватным ключем. Сначала сообщение хешируется, а шифруется уже хеш.

Вот так:

1. отправитель хеширует сообщение: H(M);
2. отправитель шифрует хеш на своем приватном ключе Sig=Epriv(H(M));
3. отправитель посылает сообщение и этот шифр получателю: (M, Sig);
4. получатель расшифровывает шифр Dpub(Sig) и получает оригинальный H(M);
5. получатель хеширует полученное сообщение M': H(M');
6. получатель сравнивает расшифрованное H(M) и вычисленное H(M'), если они совпадают, значит M=M' и сообщение не было изменено при передаче.

А шифровать все сообщение слишком накладно. Почему это так, остается пытливому читателю в качестве упражнения. :)
0
rubtsov #
Да нет, не ерунда — если Вы внимательно посмотрите, то там шифруется не M, а M' — другое сообщение. Я не хотел писать подробнее и упоминать хэши — вот у Вас уже 6 пунктов, а если расписывать подробнее и упоминать всякие DSA, то пара абзацев уж точно получится. А если писать про подпись ключей — то и целая статья.

Поэтому, я хочу этому поводу отдельный пост посвятить. Здесь ЭЦП упоминается, чтобы читатель понимал, что перехват открытых ключей ничего ровным счётом не даёт.
–4
tree #
Наконец то я понял как работают закрытый/открытый ключи. До этого я не мог въехать каким образом можно безопасно обмениваться ключами. Читал несколько статей (в том числе и на хабре) но въехал именно сейчас.
+1
anatolie #
полезное (как я думаю) дополнение

алгоритм используют также для электронной подписи
тогда шифруют не открытым ключом собеседника а своим закрытым ключом
таким образом message могут прочитать все (так как им известен ваш публичный ключ),
но они могут быть уверенны что именно вы это написали (так как только вы имеете свой приватный ключ)

здесь возникает проблема безопасно довести через ненадёжную среду свой публичный ключ,
иначе может быть проезведена атака «человек посередине» (man in midle)
это решается при помощи так называемой инфраструктурой открытых ключей
когда сушествует институт гарантирущий и подтверждающий оригинальность вашего публичного ключа
0
manni2 #
Как будто посмотрел один из эпизодов Numb3rs.
0
stas_agarkov #
и зачем это?
таких туториалов полно в инете
0
rubtsov #
Мне это нужно в личных целях. Да и части отписавшимся выше пригодилось. Если Вы пришлёте ссылку на статью, в которой не менее подробно освещается математическая сторона вопроса, буду очень признателен.
0
EiZeRR #
en.wikipedia.org/wiki/Rsa

зачем вообще подробно раскрывать такую элементарщину? Тут формул меньше чем на однгу страниц конспекта. Вот было бы другое дело, если бы вы еще описали тут различные методы криптоанализа RSA, основанные на свойствах чисел.
0
rubtsov #
Увы, данная ссылка моим нуждам не удовлетворяет.
Затем, что эту статью я буду показывать людям, которые в RSA ничего не понимают.
Да формул немного, и что в этом плохого?
Спасибо, над последним предложением я подумаю.
0
EiZeRR #
да ладно, в вики все разжевано до предельной понятности
0
rubtsov #
А я обратного не утверждал.

Мне надо описать RSA в терминах модульной арифметики. Разжевать Кормена и совместить с практической частью — это для первой группы читателей, которой я дам ссылку на эту статью. Для второй — мне нужно просто объяснить базисные принципы работы RSA, цифровых подписей и т.п.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.