RSA — Википедия

Иллюстрация работы RSA на примере

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

Я не вдаюсь в теорию (не очень понятно, на какой уровень подготовки читателя следует рассчитывать), но я уверен, что прочитав эту короткую иллюстрацию, любому человеку будет проще разобраться в формулах и строгих доказательствах.

Итак. Допустим, я хочу получить от вас некие данные. Мы с вам не хотим, чтобы эти данные узнал кто-то, кроме нас. И у нас нет никакой уверенности в надёжности канала передачи данных. Приступим.

Шаг первый. Подготовка ключей

Я должен проделать предварительные действия: сгенерировать публичный и приватный ключ.

  • Выбираю два простых числа. Пусть это будет и .
  • Вычисляем модуль — произведение наших и : .
  • Вычисляем функцию Эйлера: .
  • Выбираем число , отвечающее следующим критериям: (i) оно должно быть простое, (ii) оно должно быть меньше — остаются варианты: 3, 5, 7, 11, (iii) оно должно быть взаимно простое с ; остаются варианты 5, 7, 11. Выберем . Это, так называемая, открытая экспонента.

Теперь пара чисел — это мой открытый ключ. Я отправляю его вам, чтобы вы зашифровали своё сообщение. Но для меня это ещё не всё. Я должен получить закрытый ключ.

Мне нужно вычислить число , обратное по модулю . То есть остаток от деления по модулю произведения должен быть равен 1. Запишем это в обозначениях, принятых во многих языках программирования: . Или . может быть равно 5 (), но чтобы оно не путалось с в дальнейшем повествовании, давайте возьмём его равным 17. Можете проверить сами, что действительно равно 1 (). Итак . Пара — это секретный ключ, его я оставляю у себя. Его нельзя сообщать никому. Только обладатель секретного ключа может расшифровать то, что было зашифровано открытым ключом.

Шаг второй. Шифрование

Теперь пришла ваша очередь шифровать ваше сообщение. Допустим, ваше сообщение это число 19. Обозначим его . Кроме него у вас уже есть мой открытый ключ: . Шифрование выполняется по следующему алгоритму:

  • Возводите ваше сообщение в степень по модулю . То есть, вычисляете 19 в степени 5 (2476099) и берёте остаток от деления на 21. Получается 10 — это ваши закодированные данные.

Строго говоря, вам вовсе незачем вычислять огромное число «19 в степени 5».

Antananarivo

При каждом умножении достаточно вычислять не полное произведение, а только остаток от деления на 21. Но это уже детали реализации вычислений, давайте не будем в них углубляться.

Полученные данные , вы отправляете мне.

Здесь надо заметить, что сообщение не должно быть больше . иначе ничего не получится.

Шаг третий. Расшифровка

Я получил ваши данные (), и у меня имеется закрытый ключ .

Обратите внимание на то, что открытый ключ не может расшифровать сообщение. А закрытый ключ я никому не говорил. В этом вся прелесть асимметричного шифрования.

Начинаем раскодировать:

  • Я делаю операцию, очень похожую на вашу, но вместо использую . Возвожу в степень : получаю 10 в степень 17 (позвольте, я не буду писать единичку с семнадцатью нулями). Вычисляю остаток от деления на 21 и получаю 19 — ваше сообщение.

Заметьте, никто, кроме меня (даже вы!) не может расшифровать ваше сообщение (), так как ни у кого нет закрытого ключа.

В чём гарантия надёжности шифрования

Надёжность шифрования обеспечивается тем, что третьему лицу (старающемуся взломать шифр) очень трудно вычислить закрытый ключ по открытому. Оба ключа вычисляются из одной пары простых чисел ( и ). То есть ключи связаны между собой. Но установить эту связь очень сложно. Основной загвоздкой является декомпозиция модуля на простые сомножители и . Если число является произведением двух очень больших простых чисел, то его очень трудно разложить на множители.

Постараюсь это показать на примере. Давайте разложим на множители число 360:

  • сразу ясно. что оно делится на два (получили 2)
  • оставшееся 180 тоже, очевидно чётное (ещё 2)
  • 90 — тоже чётное (ещё двойка)
  • 45 не делится на 2, но следующая же попытка оказывается успешной — оно делится на три (получили 3)
  • 15 тоже делится на 3
  • 5 — простое.

Мы на каждом шагу, практически без перебора, получали всё новые и новые множители, легко получив полное разложение 360=2×2×2×3×3×5

Давайте теперь возьмём число 361. Тут нам придётся помучиться.

  • оно не чётное
  • три — нет, не делится
  • пять (допустим, мы поступаем умно и перебираем только простые числа, хотя, на практике, поиск больших простых чисел, сам по себе, является сложной задачей) — не подходит
  • семь? — нет.
  • и только 19 даст нам ответ: 361=19×19.

При использовании больших чисел, задача становится очень сложной. Это позволяет надеяться, что у взломщика просто не хватит вычислительных ресурсов, чтобы сломать ваши шифр за обозримое время.

А как это всё работает на практике?

Многие читатели спрашивают, как всё это применяется на практике. Давайте рассмотрим чуть более приближенный к жизни пример. Зашифруем и расшифруем слово «КРОТ», предложенное одним из читателей. А заодно, бегло рассмотрим, какие проблемы при этом встречаются и как они решаются.

Сперва сгенерируем ключи с чуть бо́льшими числами. Они не так наглядны, но позволят нам шифровать не только числа от нуля до 20.

Оттолкнёмся от пары простых чисел . Пусть наш открытый ключ будет , а закрытый .

Мы готовы к шифрованию. Переведём наше слово в цифровое представление. Мы можем взять просто номера букв в алфавите. У нас получится последовательность чисел: 11, 17, 15, 19.

Мы можем зашифровать каждое из этих чисел открытым ключом и получить шифровку 197, 272, 2, 304. Эти числа можно передать получателю, обладающему закрытым ключом и он всё расшифрует.

Немного о сложностях

На самом деле, изложенный способ шифрования очень слаб и никогда не используется. Причина проста — шифрование по буквам. Одна и та же буква будет шифроваться одним и тем же числом. Если злоумышленник перехватит достаточно большое сообщение, он сможет догадаться о его содержимом. Сперва он обратит внимание на частые коды пробелов и разделит шифровку на слова. Потом он заметит однобуквенные слова и догадается, как кодируются буквы «a», «и», «o», «в», «к»… Путём недолгого перебора, он вычислит дополнительные буквы по коротким словам, типа «но», «не», «по». И по более длинным словам без труда восстановит все оставшиеся буквы.

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

Чтобы этого не происходило, используются специальные дополнительные алгоритмы, суть которых в том, что каждая предыдущая часть сообщения начинает влиять на следующую.

Упрощённо, это выглядит так. Перед шифрованием, мы применяем к сообщению правило: . Где — предыдущая часть сообщения, а — следующая. То есть наше сообщение (11, 17, 15, 19) изменяется. 11 остаётся без изменений. 17 превращается в . 15 становится . A 19 превращается в 62.

Последовательность (11, 28, 43, 62) получается «запутанной». Все буквы в ней как бы перемешаны, в том смысле, что на каждый код влияет не одна буква, а все предыдущие.

Тот, кто получит ваше сообщение, должен будет проделать обратную операцию, со знаком «минус»: . И только тогда он получит коды букв.

На практике, в исходное сообщение специально добавляются случайные и бессмысленные буквы в начало. Чтобы даже по первому коду было невозможно ничего понять. Получатель просто отбрасывает начало сообщения.

То есть мы можем добавить случайное число в начало и получить (299, 11, 17, 15, 19).

После перемешивания получится: 299, 310, 4, 19, 38. После шифрования уже невозможно будет догадаться где была какая буква.

В реальной жизни всё ещё немного сложнее. Блоки, на которые бьётся сообщение длиннее одной буквы. Поэтому, сперва применяются алгоритмы выравнивания, потом алгоритмы разбиения на блоки с перепутыванием, и только потом применяется само RSA-шифрование.

Получатель делает всё в обратном порядке: расшифровывает, «распутывает» блоки и отбрасывает ненужную информацию, добавленную просто для выравнивания (чтобы сообщение можно было разбить на целое число блоков).

Детали и принципы формирования блоков можно почитать тут. Я же в этой заметке хотел рассказать только про RSA. Надесь, удалось.



Алгоритм шифрования RSA

В зависимости от структуры используемых ключей методы шифрования подразделяются на:

  • симметричное шифрование: посторонним лицам может быть известен алгоритм шифрования, но неизвестна небольшая порция секретной информации — ключа, одинакового для отправителя и получателя сообщения; Примеры: DES, 3DES, AES, Blowfish, Twofish, ГОСТ 28147-89
  • асимметричное шифрование: посторонним лицам может быть известен алгоритм шифрования, и, возможно открытый ключ, но неизвестен закрытый ключ, известный только получателю. Криптографические системы с открытым ключом в настоящее время широко применяются в различных сетевых протоколах, в частности, в протоколах TLS и его предшественнике SSL (лежащих в основе HTTPS), а так же SSH, PGP, S/MIME и т. д. Российский стандарт, использующий асимметричное шифрование — ГОСТ Р 34.10-2001.

На данный момент асимметричное шифрование на основе открытого ключа RSA (расшифровывается, как Rivest, Shamir and Aldeman — создатели алгоритма) использует большинство продуктов на рынке информационной безопасности.

Его криптостойкость основывается на сложности разложения на множители больших чисел, а именно — на исключительной трудности задачи определить секретный ключ на основании открытого, так как для этого потребуется решить задачу о существовании делителей целого числа.

Antananarivo

Наиболее криптостойкие системы используют 1024-битовые и большие числа.

Рассмотрим алгоритм RSA с практической точки зрения.

Для начала необходимо сгенерировать открытый и секретные ключи:

  • Возьмем два больших простых числа p and q.
  • Определим n, как результат умножения p on q (n= p*q).
  • Выберем случайное число, которое назовем d. Это число должно быть взаимно простым (не иметь ни одного общего делителя, кроме 1) с результатом умножения (p-1)*(q-1).
  • Определим такое число е, для которого является истинным следующее соотношение (e*d) mod ((p-1)*(q-1))=1.
  • Hазовем открытым ключем числа e и n, а секретным — d и n.

Для того, чтобы зашифровать данные по открытому ключу {e,n}, необходимо следующее:

  • разбить шифруемый текст на блоки, каждый из которых может быть представлен в виде числа M(i)=0,1,2…, n-1( т.е. только до n-1).
  • зашифровать текст, рассматриваемый как последовательность чисел M(i) по формуле C(i)=(M(I)^e)mod n.

Чтобы расшифровать эти данные, используя секретный ключ {d,n}, необходимо выполнить следующие вычисления: M(i) = (C(i)^d) mod n. В результате будет получено множество чисел M(i), которые представляют собой исходный текст.


Следующий пример наглядно демонстрирует алгоритм шифрования RSA:

Зашифруем и расшифруем сообщение «САВ» по алгоритму RSA. Для простоты возьмем небольшие числа — это сократит наши расчеты.

  • Выберем p=3 and q=11.
  • Определим n= 3*11=33.
  • Hайдем (p-1)*(q-1)=20. Следовательно, d будет равно, например, 3: (d=3).
  • Выберем число е по следующей формуле: (e*3) mod 20=1. Значит е будет равно, например, 7: (e=7).
  • Представим шифруемое сообщение как последовательность чисел в диапозоне от 0 до 32 (незабывайте, что кончается на n-1). Буква А =1, В=2, С=3.

Теперь зашифруем сообщение, используя открытый ключ {7,33}

C1 = (3^7) mod 33 = 2187 mod 33 = 9;
C2 = (1^7) mod 33 = 1 mod 33 = 1;
C3 = (2^7) mod 33 = 128 mod 33 = 29;

Теперь расшифруем данные, используя закрытый ключ {3,33}.

M1=(9^3) mod 33 =729 mod 33 = 3(С);
M2=(1^3) mod 33 =1 mod 33 = 1(А);
M3=(29^3) mod 33 = 24389 mod 33 = 2(В);

Данные расшифрованы!

При публикации статьи установка активной индексируемой гиперссылки на источник — сайт E-NIGMA.RU обязательна!

Значение слова антананариву

 





Обзор RSA SecurID (автоматический перевод)

Двухфакторная аутентификация RSA SecurID основывается на чем-то, что Вы знаете (пароль или PIN) и что-то, что у Вас есть (аутентификатор) обеспечение намного более надежного уровня аутентификации пользователя, чем допускающие повторное использование пароли.
* единственное решение, автоматически изменяющее Ваш пароль каждые 60 секунд
* 20-летняя история выдающейся производительности и инноваций
RSA предлагает предприятиям широкий диапазон опций аутентификации пользователя помочь положительно идентифицировать пользователей, прежде чем они будут взаимодействовать с критически важными для миссии данными и приложениями через:
* VPNs & WLANs
* электронная почта
* Интранет и экстранет
* рабочие столы Microsoft Windows
* веб-серверы
* Другие сетевые ресурсы

ФУНКЦИИ
* Сильная двухфакторная аутентификация к ресурсам защищенной сети
* автоматизация Программного токена для интеграции с продвижением клиентов VPN
* Установка без диалогов и тихое обновление
* опции настройки Со множественным маркерным доступом включая Динамическую Настройку Семени (CT-KIP)
* веб-плагин для быстрого доступа к защищенным веб-сайтам с Microsoft Internet Explorer и Mozilla Firefox
* Функциональная совместимость с программами экранного доступа Windows для слабовидящих пользователей

СИСТЕМНЫЕ ТРЕБОВАНИЯ
Программный токен RSA SecurID 4.1 для Microsoft Windows
Поддерживаемые платформы:
* предприятие Windows 7, 32-разрядное и 64-разрядное
* Windows 7 Professional, 32-разрядный и 64-разрядный
* Windows Vista Business SP1 и SP2, 32-разрядный и 64-разрядный
* Windows Vista Enterprise SP1 и SP2, 32-разрядный и 64-разрядный
* Windows XP Professional SP3
Дисковые требования: 30 МБ
Требуемые компоненты:
* Требует маркерных записей семени RSA SecurID, проданных отдельно
* Версия 4.1 требует 128-разрядный (AES) маркерные записи семени SecurID
* RSAГ‚ В® Authentication Manager (рекомендуемая версия 7.1)

Лучшими Шестью Причинами RSA SecurID является Золотой стандарт в Аутентификации пользователя С двумя факторами. Все это сводится к передовому опыту в каждой из упомянутых ниже категорий: Сила Security, Интеграции, Широкого Приложения в Enterprise, Flexible, Powerful Offerings, Scalability & Quality, Support & Innovation.



Обнови Софт рекомендует использовать программу RSA SecurID в соответствии с правилами интеллектуальной собственности. Обнови Софт не рекомендует использовать кряк, серийник, ключ, keygen, crack, serial для RSA SecurID

Самые популярные программы категории Безопасность / Менеджеры паролей
Другие программы компании RSA Security Inc

© www.obnovisoft.ru | О сайте
Arabic  French  German  Greek  Italian  Japan  Korean  Polish  Spanish 

Решил написать алгоритм шифрование RSA. Данный алгоритм очень популярен и широко используется. В данной статье я не буду говорить о теории, а буду говорить только о проблемах реализации. Итак, первое, что требует на вход RSA это два простых числа. Если вы собираетесь давать пользователям вводить их самим, то вы как минимум должны проверить, что они простые. Данную проверку я буду осуществлять вероятностным алгоритмом Миллера-Раббина, который мы уже обсуждали при написания длинной арифметики. Следующая проблема, которая встает перед вами это генерация открытого и закрытого ключа на основе простых чисел p и q, которые ввел пользователь, либо которые вы смогли сгенерировать сами. Генерацию простых чисел мы тоже обсуждали в цикле длинная арифметика. Для этого необходимо посчитать функцию Эйлера от числа n = p * q. Данная функция очень просто считается, если p и q простые и не совпадают, поэтому, если вы, как и я используете пользовательский ввод, то проверьте и это. После этого вам нужно взять число взаимнопростое с n, которое будет меньше чем значение функции Эйлера(фи).

«Antananarivo» — перевод на русский

Можно брать просто любое простое число меньшее фи, что я и делаю в алгоритме. Конечно, для быстроты работы необходимо использовать не такой способ, а честно брать генерировать число меньшее, чем функция Эйлера и с помощью алгоритма Евклида проверять на взаимную простоту. После того, как вы сгенерировали тем или иным образом публичный ключ, кстати в теории считается, что в него входит n, но чтобы не накручивать, я вынес n в отдельную переменную, так как она используется и в публичном и в закрытом ключе, необходимо сгенерировать приватный. Для этого берется обратное к публичному ключу по модулю n. Все подготовительные действия закончены. Для того, чтобы выполнить шифрование некоторого числа по алгоритму RSA необходимо возвести это число в степень публичного ключа по модулю n. Для дешифрования необходимо криптограмму возвести в степень приватного ключа по модулю n. Алгоритм RSA умеет шифровать только большие числа и криптограмма, полученная после шифрования тоже является большим числом. Но когда, мы хотим что — то зашифровать, то мы обычно под этим понимаем некоторый текст. Поэтому возникает вопрос, а как перевести из большого числа в текст и наоборот. Давайте создадим некоторое однозначное соответствие между цифрами и буквами, а именно пускай а будет 00, б 01 и так далее, тогда я будет 32. Тогда мы будем добавлять в начало числа 1, а затем последовательно заменять буквы на цифры, например фразу: абвг будем записывать как 100010203. Для дешифрации будем откидывать первую единицу, а затем проводить обратную замену. Кроме этого, мы можем шифровать числа, которые меньше, чем получившиеся n. Поэтому необходимо разбивать исходный текст на блоки такой длины, чтобы преобразованное число было меньше n. После того, как я обозначил все проблемы, которые могут возникнуть при написании алгоритма шифрования RSA, давайте начнем писать реализацию.
Реализуем класс RSA, который будет содержать конструктор, который принимает два хороших числа p и q, а также содержит методы для шифрования и дешифрования числа:

Так с самой простой частью RSA справились, как вы могли заметить, я использовал класс BigInteger, который мы написали в курсе Длинная арифметика. Теперь напишем класс Pair, который будет содержать пару символ алфавита и его цифровое представление:

Конечно же мы должны завести массив таких пар, который будет содержать все символы, которые мы собираемся шифровать. Для того, чтобы заполнить этот массив я использую метод GenerateAlhabit:

После этого нам нужны два вспомогательных метода, которые будет переводить длинное число в строку и наоборот:

Осталось написать проверку p и q, а также разбитие на блоки, что я и реализовал в методе main:

}
i = i + len;// переходим к следующей позиции
BigInteger crypt = rsa.Crypt(m);//шифруем
//вот здесь данные можно передавать по сети и прочее
BigInteger decrypt = rsa.Decrypt(crypt);//дешифруем
Console.WriteLine(GetText(decrypt));//выводим результат на экран
}

}

Console.ReadKey();
}

Входные данные

739
823
абвгд

Выходные данные

аб
вг
д
Скачать исходные коды

Содержание

Введение

1. Постановка задачи

2. Математические и алгоритмические основы решения задачи

3. Функциональные модели и блок-схемы решения задачи

4. Программная реализация решения задачи

5. Пример выполнения программы

Заключение

Список использованных источников и литературы

Введение

Испокон веков не было ценности большей, чем информация. ХХ век – век информатики и информатизации. Технология дает возможность передавать и хранить все большие объемы информации. Это благо имеет и оборотную сторону. Информация становится все более уязвимой по разным причинам:

• возрастающие объемы хранимых и передаваемых данных;

• расширение круга пользователей, имеющих доступ к ресурсам ЭВМ, программам и данным;

• усложнение режимов эксплуатации вычислительных систем.

Поэтому все большую важность приобретает проблема защиты информации от несанкционированного доступа (НСД) при передаче и хранении. Сущность этой проблемы – постоянная борьба специалистов по защите информации со своими «оппонентами».

Для того чтобы ваша информация, пройдя шифрование, превратилась в «информационный мусор», бессмысленный набор символов для постороннего, используются специально разработанные методы – алгоритмы шифрования. Такие алгоритмы разрабатываются учеными математиками или целыми коллективами сотрудников компаний или научных центров.

Алгоритмы шифрования делятся на два больших класса: симметричные (AES, ГОСТ, Blowfish, CAST, DES) и асимметричные (RSA, El-Gamal). Симметричные алгоритмы шифрования используют один и тот же ключ для зашифровывания информации и для ее расшифровывания, а асимметричные алгоритмы используют два ключа – один для зашифровывания, другой для расшифровывания.

Если зашифрованную информацию необходимо передавать в другое место, то в этом надо передавать и ключ для расшифрования.

Слабое место здесь – это канал передачи данных – если он не защищенный или его прослушивают, то ключ для расшифрования может попасть к злоумышленику. Системы на ассиметричных алгоритмах лишены этого недостатка. Поскольку каждый участник такой системы обладает парой ключей: Открытым и Секретным Ключом.

Алгоритм RSA стоит у истоков асимметричной криптографии. Он был предложен тремя исследователями – математиками Рональдом Ривестом (R.

Мадагаскар / Антананариву

Rivest), Ади Шамиром (A. Shamir) и Леонардом Адльманом (L. Adleman) в 1977–78 годах.

1. Постановка задачи

Разработать и отладить программу на языке Лисп реализующую криптографический алгоритм кодирования информации с открытым ключом – RSA.

Шифрование:

Входные данные: M – сообщение, состоящее из целых чисел.

Выходные данные: T – Зашифрованное сообщение.

Дешифрование:

Входные данные: T – Результат шифрования.

Выходные данные: M – изначальное сообщение.

Пример 1.

1. Выбираем два простых числа: p = 3557, q = 2579.

2. Вычисляем их произведение: n = p · q = 3557 · 2579 = 9173503.

3. Вычисляем функцию Эйлера: φ(n) = (p-1) (q-1) = 9167368.

4. Выбираем открытый показатель: e = 3.

5. Вычисляем секретный показатель: d = 6111579.

6. Публикуем открытый ключ: (e, n) = (3, 9173503).

7. Сохраняем секретный ключ: (d, n) = (6111579, 9173503).

8. Выбираем открытый текст: M = 127.

9. Вычисляем шифротекст: P(M) = Me modn = 10223 mod 9173503 = 116.

10.Вычислить исходное сообщение: S(C) = Cd modn = 1166111579 mod 9173503 = 1022.

Пример 2.

1. Выбираем два простых числа: p = 79, q = 71.

2. Вычисляем их произведение: n = p · q = 79 · 71 = 5609.

3. Вычисляем функцию Эйлера: φ(n) = (p-1) (q-1) = 5460.

4. Выбираем открытый показатель: e = 5363.

5. Вычисляем секретный показатель: d = 2927.

6. Публикуем открытый ключ: (e, n) = (5363, 5609).

7. Сохраняем секретный ключ: (d, n) = (2927, 5609).

8. Выбираем открытый текст: M = 23.

9. Вычисляем шифротекст: P(M) = Me modn = 235363 mod5609 = 5348.

10.Вычислить исходное сообщение: S(C) = Cd modn = 53482927 mod5609 = 23.

2. Математические и алгоритмические основы решения задачи

Первым этапом любого асимметричного алгоритма является создание пары ключей: открытого и закрытого и распространение открытого ключа «по всему миру».

Для алгоритма RSA этап создания ключей состоит из следующих операций:

1). Выбираются два простых числа p и q

2). Вычисляется их произведение n (=p*q)

3). Выбирается произвольное число e (e<n), такое, что

НОД (e, (p-1) (q-1))=1,

то есть e должно быть взаимно простым с числом (p-1) (q-1).

4). Методом Евклида решается в целых числах уравнение

e*d+(p-1) (q-1)*y=1.

Здесь неизвестными являются переменные d и y – метод Евклида как раз и находит множество пар (d, y), каждая из которых является решением уравнения в целых числах.

5). Два числа (e, n) – публикуются как открытый ключ.

6). Число d хранится в строжайшем секрете – это и есть закрытый ключ, который позволит читать все послания, зашифрованные с помощью пары чисел (e, n).

Как же производится собственно шифрование с помощью этих чисел:

Отправитель разбивает свое сообщение на блоки, равные k=[log2 (n)] бит, где квадратные скобки обозначают взятие целой части от дробного числа.

Подобный блок может быть интерпретирован как число из диапазона (0; 2k -1). Для каждого такого числа (назовем его mi ) вычисляется выражение

ci =((mi )e ) mod n.

Блоки ci и есть зашифрованное сообщение Их можно спокойно передавать по открытому каналу, поскольку операция возведения в степень по модулю простого числа, является необратимой математической задачей. Обратная ей задача носит название «логарифмирование в конечном поле» и является на несколько порядков более сложной задачей. То есть даже если злоумышленник знает числа e и n, то по ci прочесть исходные сообщения mi он не может никак, кроме как полным перебором mi .

А вот на приемной стороне процесс дешифрования все же возможен, и поможет нам в этом хранимое в секрете число d. Достаточно давно была доказана теорема Эйлера, частный случай которой утвержает, что если число n представимо в виде двух простых чисел p и q, то для любого x имеет место равенство

(x(p-1)(q-1) ) mod n = 1.

Для дешифрования RSA-сообщений воспользуемся этой формулой. Возведем обе ее части в степень

(-y): (x(-y)(p-1)(q-1) ) mod n = 1(-y) = 1.

Теперь умножим обе ее части на x:

(x(-y)(p-1)(q-1)+1 ) mod n = 1*x = x.

А теперь вспомним как мы создавали открытый и закрытый ключи. Мы подбирали с помощью алгоритма Евклида d такое, что

e*d+(p-1) (q-1)*y=1,

то есть

e*d=(-y) (p-1) (q-1)+1.

Следовательно, в последнем выражении предыдущего абзаца мы можем заменить показатель степени на число (e*d). Получаем

(xe*d ) mod n = x.

То есть для того чтобы прочесть сообщение ci =((mi )e ) mod n достаточно возвести его в степень d по модулю m:

((ci )d ) mod n = ((mi )e*d ) mod n = mi .

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

Скорость работы алгоритма RSA

Как при шифровании и расшифровке, так и при создании и проверке подписи алгоритм RSA по существу состоит из возведения в степень, которое выполняется как ряд умножений.

В практических приложениях для открытого (public) ключа обычно выбирается относительно небольшой показатель, а зачастую группы пользователей используют один и тот же открытый (public) показатель, но каждый с различным модулем. (Если открытый (public) показатель неизменен, вводятся некоторые ограничения на главные делители (факторы) модуля.) При этом шифрование данных идет быстрее чем расшифровка, а проверка подписи – быстрее чем подписание.

Если k – количество битов в модуле, то в обычно используемых для RSA алгоритмах количество шагов необходимых для выполнения операции с открытым (public) ключом пропорционально второй степени k, количество шагов для операций частного (private) ключа – третьей степени k, количество шагов для операции создания ключей – четвертой степени k.

Методы «быстрого умножения» – например, методы основанные на Быстром Преобразовании Фурье (FFT – Fast Fourier Transform) – выполняются меньшим количеством шагов; тем не менее они не получили широкого распространения из-за сложности программного обеспечения, а также потому, что с типичными размерами ключей они фактически работают медленнее. Однако производительность и эффективность приложений и оборудования реализующих алгоритм RSA быстро увеличиваются.

Алгоритм RSA намного медленнее чем DES и другие алгоритмы блокового шифрования. Программная реализация DES работает быстрее по крайней мере в 100 раз и от 1,000 до 10,000 – в аппаратной реализации (в зависимости от конкретного устройства). Благдаря ведущимся разработкам, работа алгоритма RSA, вероятно, ускорится, но аналогично ускорится и работа алгоритмов блокового шифрования.

3. Функциональные модели и блок-схемы решения задачи

Функциональные модели и блок-схемы решения задачи представлены на рисунках 1 – 6.

Условные обозначения:

· P и Q – случайные простые числа;

· N – произведение простых чисел P и Q;

· PHI – значение функции Эйлера;

· E – взаимно простое число с PHI;

· PRIVATE_KEY – секретный ключ;

· LST – список простых чисел;

· NUM – число для шифрования / дешифрования;

· I, IO, I1, J, JO, R, L – рабочие переменные.

Рисунок 1 – Функциональная модель решения задачи для функции SIMPLE_NUMBER

Рисунок 2 – Функциональная модель решения задачи для функции ENCRYPT

Рисунок 3 – Функциональная модель решения задачи для функции DECODING


Добавить комментарий

Закрыть меню