8-900-374-94-44
[email protected]
Slide Image
Меню

Код rsa – Алгоритм RSA

RSA-шифрование на пальцах

RSA-шифрование на пальцах

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

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

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

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

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

  • Выбираю два простых числа. Пусть это будет p=3 и q=7.
  • Вычисляем модуль — произведение наших p и q:
    n=p×q=3×7=21
    .
  • Вычисляем функцию Эйлера: φ=(p-1)×(q-1)=2×6=12.
  • Выбираем число e, отвечающее следующим критериям: (i) оно должно быть простое, (ii) оно должно быть меньше φ — остаются варианты: 3, 5, 7, 11, (iii) оно должно быть взаимно простое с φ; остаются варианты 5, 7, 11. Выберем e=5. Это, так называемая, открытая экспонента.

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

Мне нужно вычислить число d, обратное е по модулю φ. То есть остаток от деления по модулю φ произведения d×e должен быть равен 1. Запишем это в обозначениях, принятых во многих языках программирования: (d×е)%φ=1. Или (d×5)%12=1. d может быть равно 5 (

(5×5)%12=25%12=1), но чтобы оно не путалось с e в дальнейшем повествовании, давайте возьмём его равным 17. Можете проверить сами, что (17×5)%12 действительно равно 1 (17×5-12×7=1). Итак d=17. Пара {d, n} — это секретный ключ, его я оставляю у себя. Его нельзя сообщать никому. Только обладатель секретного ключа может расшифровать то, что было зашифровано открытым ключом.

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

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

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

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

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

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

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

Я получил ваши данные (E=10), и у меня имеется закрытый ключ {d, n} = {17, 21}.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Оттолкнёмся от пары простых чисел {p, q} = {17, 19}. Пусть наш открытый ключ будет {e, n} = {5, 323}, а закрытый {d, n} = {173, 323}.

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

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

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

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

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

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

Упрощённо, это выглядит так. Перед шифрованием, мы применяем к сообщению правило: b := (b + a) % n. Где a — предыдущая часть сообщения, а

b — следующая. То есть наше сообщение (11, 17, 15, 19) изменяется. 11 остаётся без изменений. 17 превращается в (11 + 17) % 323 = 28. 15 становится (15 + 28) % 323 = 43. A 19 превращается в 62.

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

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

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

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

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

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

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




Отправить

www.michurin.net

RSA — шифрование online


Комментарий:
Описание: RSA (Rivest-Shamir-Adleman) является одной из первых криптосистем с открытым ключом и широко используется для безопасной передачи данных. В такой криптосистеме ключ шифрования является открытым и отличается от ключа расшифровки, который хранится в секрете (private). В RSA эта асимметрия основана на практической сложности факторизации произведения двух больших простых чисел, «проблема факторинга». Аббревиатура RSA состоит из начальных букв фамилий Рона Ривеста, Ади Шамира и Леонарда Адлемана, которые впервые публично описали алгоритм в 1978 году. Клиффорд Кокс, английский математик, работающий в Британском разведывательном управлении правительственной связи (GCHQ), разработал эквивалентную систему в 1973 году, но это не было рассекречено до 1997 года.

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

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


Ресурсы:

crypt-online.ru

Схема шифрования RSA и её программная реализация

Короткова Дарья Алексеевна,
студентка Ульяновский государственный университет
E-mail: [email protected]

Аннотация

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

Чтобы обеспечить безопасность личных данных при передаче, необходимо зашифровывать информацию.

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

В данной статье я рассмотрю метод шифрования RSA и метод дополнительного шифрования OAEP, напишу его программную реализацию и сымитирую атаки на RSA.

Ключевые слова: шифр, C++, безопасность, RSA, OAEP.

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

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

Криптографические системы с открытым ключом используют односторонние функции, обладающие свойствами:

· Если известно x, то вычислить f(x) просто.

· Если известно y=f(x), то для вычисления x нет простого пути.

Алгоритм RSA:

1. Создание открытого и закрытого ключа.

1. Выбирается два простых числа u и v.

2. Вычисляется произведение p=u*v.

3. Вычисляется функция Эйлера φ(p)=(u-1)(v-1)

4. Выбираем открытую экспоненту e (1<e< φ(p))

5. Вычисляем закрытую экспоненту d, где (d*e) mod φ(p) =1

6. Получаем открытый ключ (e, p) и закрытый ключ (d, p).

2. Шифрование и дешифрование.

Посмотрим модель шифрования и дешифрования сообщения на конкретном примере. Пусть Алиса хочет послать Бобу сообщение h.


У Алисы есть открытый ключ Боба. А Боб владеет своим закрытым ключом.

w=G(h)= he mod p h=Q(w)=wd mod p

Безопасность схемы шифрования RSA:

Я написала программу на языке высокого уровня С++, где каждый символ кодируется на основании таблицы ASCII, и затем осуществляется алгоритм RSA.


Например, берем символ I, по таблице ASCII его код равен 73. Генерация ключей такая же, как и в примере написанной программы.

w=G(h)= he mod p = 732075 mod 21823=8774; (посчитано на инженерном стандартном калькуляторе в операционной системе Windows)

h=Q(w)=wd mod p = 877483 mod 21823 = 73 = I

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

Некоторые атаки на RSA.

1. Разложение на множители.

Реализуется на подборе простых чисел u, v, для надёжности числа должны быть большими.

2. Выборка шифрованного текста.

Пусть Ева перехватывает сообщение w от Алисы к Бобу w=ze (mod n), где z- открытый текст, е — открытый ключ; Ева выбирает число r, r<n и вычисляет с помощью открытого ключа x=re (mod n) ,y= x*c (mod n)

Ева передает Y бобу для дешифрования и получает g = yd mod n. Ева может легко найти z

g= yd mod n=(w*xe)d mod n = (wd*xed)mod n = (wd*x) mod n =(z*x)mod n
z= (z*x) mod n -> z=w*x-1 mod n
3. Исходный текст.

Криптосистема RSA обладает низкой криптостойкостью при малой экспоненте на коротком сообщении. Действительно, при c = me < n открытый текст m может быть восстановлен по шифротексту © при помощи процедуры извлечения корня. Однако меры противодействия также очевидны, — либо открытый ключ e должен быть достаточно большим, либо открытый текст не должен быть коротким. Выбор малого e обусловлен соображениями вычислительной эффективности шифрования и проверки подписи.

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

Оптимальное асимметричное дополнение шифрования (OAEP — Optimal Assimetric Encryption Padding) — схема дополнения, обычно используемая совместно с какой-либо односторонней функцией с потайным входом (например RSA или функции Рабина) для повышения криптостойкости последней.

Шифрование. Ниже показаны шаги процесса шифрования.

  1. Дополняем сообщение, чтобы сделать его w -битовым. Обозначим его W.
  2. Выбираем случайное число s (одноразовое число) из k бит.
  3. Используем общедоступную одностороннюю функцию G, которая принимает целое s -битовое число, и создает w -разрядное целое число (w — размера W, и s <w ).
  4. Применяет маску, G (s), чтобы создать первую часть исходного текста P1=W+G(s) является замаскированным сообщением.
  5. Создаём вторую часть исходного текста P2 = H(P1) + s. Функция H — другая общедоступная функция, которая принимает w -битовые входные сообщения и создает k -битовые выходные сообщения.
  6. Cоздаём C = Pe = (P1 || P2) e и передаём C.

Дешифрование. Следующие шаги показывают процесс дешифрования:

  1. Создаём P = Cd = (P1 || P2).
  2. Обновляем значение s, используя H(P1) + P2= H(P1) + H(P2) + s =s.
  3. Применяет G(s) + P = G(s) + G(s) + W=W , чтобы обновить значение дополненного сообщения.
  4. После удаления дополнения W, находим первоначальное сообщение.

Алгоритм OAEP применяется для предварительной обработки сообщения перед использованием RSA. Сначала сообщение дополняется до фиксированной длины с помощью OAEP, затем шифруется с помощью RSA.

Литература:

  1. Венбо Мао. Современная криптография. Теория и практика = Modern Cryptography: Theory and Practice. — М.: Вильямс, 2005.
  2. Нильс Фергюсон, Брюс Шнайер. Практическая криптография = Practical Cryptography: Designing and Implementing Secure Cryptographic Systems. — М.: Диалектика, 2004.
  3. Шнайер Б. Прикладная криптография. Протоколы, алгоритмы, исходные тексты на языке Си = Applied Cryptography. Protocols, Algorithms and Source Code in C. — М.: Триумф, 2002.

journalpro.ru

Пример алгоритма шифрования rsa | Защита информации

Содержание:

Алгоритм RSA

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

Шаги:

  • объект В придумывает два любых больших простых числа Р и Q;
  • объект В решает значение модуля N = P × Q;
  • объект В решает функцию Эйлера:φ(N) = (P-1) × (Q-1);
    и выбирает любым образом значение открытого ключа Kв с учетом условия:1 < Kв ≤ φ(N), НОД (Kв, φ(N)) = 1
  • объект В решает значение секретного ключа κв решая алгоритм Евклида когда достигается условие: κв ≡ Kв-1 (mod φ(N)).
  • объект В передает объекту А пару числе (N, Kв) по незащищенному пути.
  • Если объект А хочет передать объекту В сообщение М, он должен разбить исходный открытый текст M на блоки, каждый из которых может быть показан в виде: Mi = 0, 1, 2, …, N — 1.
  • Объект А шифрует данные, показаны в виде последовательности чисел Mi по формуле: Ci = MiKв (mod N), и отправляет криптограмму C1, C2, …, Ci … объекту В.
  • Пользователь В расшифровывает криптограмму C1, C2, …, Ci … используя секретный ключ κв по формуле: Mi = CiKв (mod N)

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

Пример: шифрование сообщения

Для наглядности вычисления, будем использовать небольшие числа. Но на практике используют очень большие числа ( длиной 200-300 десятичных разрядов).

Действия объекта В:

  • Берет Р = 3, Q = 11.
  • Берет модуль N = P × Q = 3 × 11 = 33.
  • Берет значение функции Эйлера для N = 33: φ(N) = (P-1) × (Q-1) = 2 × 10 = 20.
  • Берет в качестве открытого ключа Kв произвольное число с учетом условия: 1 < Kв ≤ φ(N), НОД (Kв, φ(N)) = 1, допустим Kв = 7.
  • Решаем значение секретного ключа κв используя алгоритм Евклида: κв ≡ = 3.
  • объект В передает объекту А пару чисел (N = 33, Kв = 7).

Действия объекта A:

  • Показывает шифруемое сообщение как последовательность целых чисел в диапазоне 0…32. Допустим буква А представляется как число 1, буква В это 2 и С = 3. Припустим что сообщение С А В можно показать как последовательность числе 321, то есть M1 = 3, M2 = 1, M3 = 2.
  • Шифрует сообщение, М используя ключ Kв = 7 и N = 33 по формуле: Ci = MiKв (mod N) = Mi7(mod 3).
  • Получаем:
    • Ci = 37(mod 33) = 2187 (mod 33) = 9
    • Ci = 17(mod 33) = 1 (mod 33) = 1
    • Ci = 27(mod 33) = 128 (mod 33) = 29
  • Передает объекту В криптограмму: C1, C2, C3 = 9, 1, 29.

Действия объекта B:

  • Расшифровывает принятую криптограмму C1, C2, C3 используя секретный ключ ≡ = 3 по формуле:Mi = CiKв (mod N) = Ci3 (mod 3)
    • M1= 93 (mod 33) = 729 (mod 33) =3.
    • M2 = 13 (mod 33) = 1 (mod 33) =1.
    • M2 = 293 (mod 33) = 24389 (mod 33) =2.

Объект получил исходное сообщение, которое послал объект A.

Шифрование с помощью RSA есть одним из методов защиты информации при передачи данных через сеть Интернет. Схема Рабина очень похожа на схему RSA. Криптоалгоритм RSA признан стойким при дине ключа больше 1024 бит. Нужно отметить что алгоритм применяют как для шифрования так и для электронно-цифровой подписи. Нетрудно заметить что в асимметричной криптосистеме RSA количество ключей связано с количеством пользователей линейной зависимостью (N пользователей используют 2 × N ключей), а не квадратичной как это используется в симметричных системах.

Применение алгоритма может решить некоторые угрозы информационной безопасности в сети.

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

Оценка статьи:

Загрузка…

Поделиться с друзьями:

infoprotect.net

Шифрование RSA для первокурсников / Habr

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

В этой статье я решаю на языке MIT Scheme задачу шифрования и дешифрования методом RSA [1]. По ряду причин, которые рассматриваются в статье, реализация не может использоваться для криптографической защиты информации.


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

Первый этап генерации ключей — случайный выбор двух достаточно больших простых чисел p и q. Натуральное число x называется простым, если у него есть ровно два различных делителя: 1 и x. Все другие делители числа располагаются на отрезке от 2 до квадратного корня из x, однако достаточно проверять на кратность только простые делители, принадлежащие этому отрезку.

(define (Primes n)
  (define (prime? n primes)
    (define (iter divisors)
      (or (null? divisors)
          (let ([divisor (car divisors)])
               (or (> (* divisor divisor) n)
                   (and (< 0 (remainder n (car divisors))) (iter (cdr divisors))))))
      )
    (iter primes)
    )
  (define (iter primes i candidate)
    (cond 
      ((= i n) primes)
      ((prime? candidate (reverse primes)) (iter (cons candidate primes) (+ i 1) (+ candidate 1)))
      (else (iter primes i (+ candidate 1)))
      )
    )
  (iter '() 0 2)
  )
(define primes (Primes 100))
(define p (car primes))
(define q (car (drop 10 primes)))

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

(define n (* p q))

Для вычисления вторых элементов открытого и закрытого ключей используется величина fi, равная функции Эйлера [3], вычисленной на n. Функция Эйлера от x равна количеству натуральных чисел, не больших x и взаимно простых с ним. Для n это количество будет равно произведению p-1 и q-1.

(define fi (* (- p 1) (- q 1)))

Вторым элементом открытого ключа выбирается случайное число e в диапазоне от 1 до fi, являющееся взаимно простым с fi. то есть таким, что наибольшим общим делителем чисел является 1.

(define (CoprimesLess n)
  (define (iter accumulator candidate)
    (cond
      ((= 1 candidate) accumulator)
      ((= 1 (gcd n candidate)) (iter (cons candidate accumulator) (- candidate 1)))
      (else (iter accumulator (- candidate 1)))
      )
    )
  (iter '() (- n 1))
  )
(define e (car (drop 5 (CoprimesLess fi))))

Для поиска наибольшего общего делителя можно использовать алгоритм Евклида [4].


Одним из объектов, изучаемых теорией чисел, является кольцо вычетов [5]. Кольцо вычетов по модулю k — это целые числа от 0 до k-1 и операции сложения и умножения на нём. Сложение в кольце вычетов (a + b mod k) отличается от сложения в группе целых чисел тем, что если результат сложения становится больше k, из него вычитается k, в результате чего этот результат снова оказывается в кольце. Интуитивно, кольцо получается из отрезка соединением его концов.

Как и в группе целых чисел, умножение в кольце вычетов можно задать при помощи сложения, а возведение в степень — при помощи умножения. Как и в группе целых чисел, получившиеся операции сложения и умножения будут обладать ассоциативностью, то есть:
a + (b + c mod k) mod k = (a + b mod k) + c mod k
a * (b * c mod k) mod k = (a * b mod k) * c mod k

Вторым элементом открытого ключа должно быть число d такое, что его произведение с e в кольце вычетов по модулю n является 1, то есть мультипликативно обратный элемент. Привожу алгоритм поиска такого элемента при помощи расширенного алгоритма Евклида [6].

(define (MultInverseModN a n)
  (define (iter a-prev a r-prev r)
    (if (>= 1 r) a (let* ([r-next (remainder r-prev r)]
                          [q (quotient r-prev r)]
                          [a-next (- a-prev (* q a))])
                         (iter a a-next r r-next)))
    )
  (let ([result (iter 0 1 n a)]) (if (< 0 result) result (+ n result)))
)
(define d (MultInverseModN e fi))

При помощи алгоритма RSA можно шифровать сообщения, представленные серией чисел M в диапазоне от 0 до n-1. Шифрование состоит в возведении M в степень e в кольце вычетов по модулю n, дешифрование — в степень d. Благодаря тому, что умножение является ассоциативным, мы можем возводить в степень x за log(x) операций [7].
(define (PowerModN a b n)
  (define (iter accumulator multiplicator power)
    (if
      (= power 0)
      accumulator
      (let
          ((new_accumulator (if (even? power) accumulator (remainder (* accumulator multiplicator) n))))
          (iter new_accumulator (* multiplicator multiplicator) (quotient power 2))
        )
      )
    )
  (iter 1 a b)
  )

В моём примере открытый ключ представляет собой пару (250483 31), закрытый — пару (250483 32191). Зашифрованное сообщение 123456 равно 133240.
  1. en.wikipedia.org/wiki/RSA
  2. en.wikipedia.org/wiki/Integer_factorization
  3. en.wikipedia.org/wiki/Euler%27s_totient_function
  4. en.wikipedia.org/wiki/Euclidean_algorithm
  5. en.wikipedia.org/wiki/Modular_arithmetic
  6. en.wikipedia.org/wiki/Extended_Euclidean_algorithm
  7. en.wikipedia.org/wiki/Exponentiation_by_squaring

habr.com

Выбор параметров шифра RSA и возможные последствия / Habr

Под катом описаны примеры выбора «плохих» параметров шифра RSA.

Процитируем авторов учебного пособия «Основы криптографии» А.П. Алферов, А.Ю. Зубов, А.С. Кузьмин, А.В. Черемушкин, Москва. «Гелиос АРВ», 2001г., на странице 316:

«Следует подчеркнуть необходимость соблюдения осторожности в выборе модуля RSA (числа n) для каждого из корреспондентов сети. В связи с этим можно сказать следующее. Читатель может самостоятельно убедиться в том, что зная одну из трех величин p, q или φ(n), можно легко найти секретный ключ RSA…».

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

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

Вначале приведем сам пример со стр. 313-315 из названного пособия.

Пример


Шифрование короткого исходного текстового сообщения: RSA.
Получатель устанавливает шифр с характеристиками n=pq=527, где р=17, q=31 и φ(n)=(р –1)(q – 1)=480. В качестве открытого ключа е выбрано число, взаимно простое с φ(n), е=7. Для этого числа с помощью расширенного алгоритма Евклида найдены целые числа u и v, удовлетворяющие соотношению е∙u+φ(n)∙v=1:

480=7∙68+4,
7=4∙1+3,
4=3∙1+1,
1=4–3∙1=4–(7–4∙1)∙1=4∙2–7∙1=(480–7∙68)∙2–7∙1=480∙2–7∙137,
v=2, u=–137
.

Поскольку –137≡343(mod480), то d=343.

Проверка: 7∙343=2401≡1(mod480).

Текстовое сообщение представляется в виде последовательности чисел, содержащихся в интервале [0, 526]. Для этого буквы R, S и A кодируются пятиразрядными двоичными числами. Используются порядковые номера этих букв в английском алфавите при их двоичном представлении:

R=1810=(10010)2, S=1910=(10011)2,
A=110=(00001)2.

Тогда RSA=(100101001100001)2. Разбиение текста на блоки ограниченной длины дает представление из двух блоков: RSA=(100101001), (100001)=(М1=297, М2=33).

Последовательно шифруются блоки исходного текста М1=297, М2=33:
y1k1)=М1e≡2977(mod527)=474.

Здесь воспользовались тем, что:

2977=((2972)3)297≡(mod527)=(2003(mod527)297)(mod527)=474,
y2k2)=M2e≡337(mod527)=407.

Шифрованный текст, как и исходный, получаем в виде двух блоков: у1=474; у2=407.

Расшифрование представляется последовательностью действий Dk(yi )=(yi )d=(yi )343(mod 527), i=1,2.

Вычисления возведения в степень d более удобно проводить, предварительно представляя показатель степени суммой степеней числа 2, а именно: 343=256+64+16+4+2+1.

Используя это представление показателя степени d=343, получаем:

4742≡174(mod527),
4744≡237(mod527),
4748≡307(mod527),
47416≡443(mod527),
47432≡205(mod527),
47464≡392(mod527),
474128≡307(mod527),
474256≡443(mod527),

и окончательно 474343(mod527)=(443∙392∙443∙237∙174∙474) (mod527)=297.

Аналогично вычисляется значение 407343(mod527)=33.

Переход к буквенному представлению расшифрованного сообщения дает: RSA.

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

Атака на шифр RSA


Рассмотрим пример атаки на шифр RSA. Воспользуемся данными примера, приведенного на странице 313-315 в учебном пособии «Основы криптографии» А.П. Алферов, А.Ю. Зубов, А.С. Кузьмин, А.В. Черемушкин, Москва. «Гелиос АРВ», 2001.

Неудачность (недопустимость) выбранных параметров системы в этом примере легко показывается вычислениями, реализующими атаку бесключевого чтения исходного текста. Сущность такой атаки состоит в следующем. Заданы открытый ключ шифра RSA (е=7, n=527) и шифрованный текст. В примере шифрованный текст представлен двумя блоками
у=(у1=474, у2=407).

Каждый шифрованный блок атакуется индивидуально, вначале атакуем у1=474, после его дешифрования, атакуем другой блок у2=407.

Далее формируется путем многократного зашифрования с сохранением результатов двух последовательных шагов алгоритма атаки и с использованием открытого ключа последовательность числовых значений уi, у1 имеющийся шифрованный текст.

В алгоритме атаки на шифрованный текст определяется такой номер шага j, для которого yiej(mod n)=(yiej–1(mod n))e(mod n)=yi, i>1. Из последнего соотношения видим, что при возведении в степень е значения (yiej–1(mod n)) получается начальный шифoртекст yi = у1.

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

Атака на первый блок у1=474 шифртекста.
Шаг 1: &nbsp 4747(mod527)=382;
Шаг 2: &nbsp 3827(mod527)=423;
Шаг 3: &nbsp 4237(mod527)=297;
Шаг 4: &nbsp на этом шаге шифруется уже найденный исходный текст, но его необходимо выполнить, так как атакующий исходного текста не знает. Признаком завершения атаки является совпадение начального значения шифртекста (474) и результата 4-го шага зашифрования. Именно такое совпадение и имеет место.

2977(mod527)=474 получили начальный (первый) блок шифртекста. Атака на первый блок завершена успешно у1=474. Предшествующий результат шага 3 равен открытому тексту М1=297.

По существу в кольце вычетов по модулю n=527 реализовался короткий цикл обработки вычета r=297 по модулю n=527. Это записывается так yi1=297. Формируем степенные вычеты
(((2977(mod527))7(mod527))7(mod527))7=297.

Атака на второй блок у2=407 шифртекста.
Шаг 1: &nbsp 4077(mod527)=16;
Шаг 2: &nbsp 167(mod527)=101;
Шаг 3: &nbsp 1017(mod527)=33;
Шаг 4: &nbsp 337(mod527)=407.

Вновь на третьем шаге получен блок исходного текста (М2=33), но атакующему это неизвестно, и он выполняет следующий (четвертый шаг), результат которого (407) совпадает с начальным шифртекстом у2=407.

По существу в кольце вычетов по модулю n=527 реализовался короткий цикл обработки вычета r=33 по модулю n=527. Это записывается так yi2=33.
Формируем степенные вычеты ((337(mod527))7(mod527))7(mod527)=33.

Результат атаки (исходный текст М1=297, М2=33) получен трехкратным шифрованием заданного шифртекста. Больший успех для атакующего шифртекст трудно представить.

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

Ни на одном из заданных е не удается зашифровать исходные тексты, представляемые числами
187, 341, 154 и 373.

Пример (невозможность шифрования значений некоторых исходных текстов)


Пусть исходные тексты представлены четырьмя блоками y=(y1=154, y2=187, y3=341, y4=373). Экспонента е открытого ключа шифра может быть любым взаимно простым числом с функцией Эйлера φ(n)=φ(527)=480. Впрочем, для рассматриваемого случая открытый ключ е может быть задан произвольно. Действительно, пусть е=2, 4, 7, 9, 17, 111 тогда:

1542(mod527)=1;
1544(mod527)=1;
1547(mod527)=154;
1549(mod527)=154;
15417(mod527)=154;
154111(mod527)=154;
1872(mod527)=187;
1874(mod527)=187;
1877(mod527)=187;
1879(mod527)=187;
18717(mod527)=187;
187111(mod527)=187;
3412(mod527)=341;
3414(mod527)=1;
3417(mod527)=341;
3419(mod527)=341;
34117(mod527)=341;
341111(mod527)=341;
3732(mod527)=1;
3734(mod527)=373;
3737(mod527)=373;
3739(mod527)=373;
37317(mod527)=373;
373111(mod527)=373.

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

habr.com

Задача №3. Алгоритм шифрования rsa.

Сгенерируйте открытый и закрытый ключи в алгоритме шифрования RSA, выбрав простые числа p и q из первой сотни. Зашифруйте сообщение, состоящее из ваших инициалов: ФИО.

Решение

I.Генерация ключей.

Выберем два простых числа р = 17 и q = 23

Тогда модуль

n = p*q=17*23 = 391

и функция Эйлера

(n) = (p-1)*(q-1) = (17-1)*(23-1)=16*22=352.

Закрытый ключ d выбираем из условий d < (n) и d взаимно просто с (n), т.е. d и (n) не имеют общих делителей.

Пусть d = 41.

Открытый ключ e выбираем из условий e<(n) и de=1(mod (n)): e<352,

41e=1(mod 352).

Последнее условие означает, что число 41e-1 должно делиться на 352 без остатка.

Таким образом, для определения e нужно подобрать такое число k, что

41e-1 = 352 k.

При k=29 получаем 41e=10208+1 или

e=249.

Получаем

(249, 391) – открытый ключ (KU),

( 41, 391) – секретный ключ (KR).

II. Шифрование.

Представим шифруемое сообщение «ГИН» как последовательность целых чисел. Пусть буква «Г» соответствует числу 22, буква «И» — числу 4 и буква «Н» — числу 9.

Зашифруем сообщение, используя открытый ключ (249, 391):

С1 = (22249) mod 391= 114

С2 = (4249) mod 391=123

С3 = (9249) mod 391= 349

Таким образом, исходному сообщению (22, 4, 9) соответствует криптограмма (114, 123, 349).

III. Расшифрование

Расшифруем сообщение (114, 123, 349), пользуясь секретным ключом (41, 391):

М1 = ( 11441) mod 391=22

М2 = (12341) mod 391= 4

МЗ = ( 34941) mod 391=9

В результате расшифрования было получено исходное сообщение (22, 4, 9), то есть «ГИН».

Задача №4. Функция хеширования.

Найти хеш–образ своей Фамилии, используя хеш–функцию , гдеn = pq, p, q взять из Задачи №2.

Решение

Хешируемое сообщение «ГАЗИЗОВ». Возьмем два простых числа p=17, q=23. Определим n=p*q=17*23=391. Вектор инициализации выберем равным 9 (выбираем случайным образом). Слово«ГАЗИЗОВ» можно представить последовательностью чисел 4, 1, 11, 9, 21, 13, 13) по номерам букв в алфавите. Таким образом,

n=391, H0=9, M1=22, M2=1, M3=11, M4=9, M5=21, M6=13.

Используя формулу

,

получим хеш-образ сообщения «ГАЗИЗОВ»:

H1 = (H0+M1)2 mod n = (9 + 22)2 mod 391 = 961 mod 391=179

H2 = (H1+M2)2 mod n = (179 + 1)2 mod 391 = 32400 mod 391= 338

H3 = (H2+M3)2 mod n = (338 + 11)2 mod 391 = 121801 mod 391= 200

H4 = (H3+M4)2 mod n = (200 + 9)2 mod 391 = 43681 mod 391= 280

H5 = (H4+M5)2 mod n = (280 + 21)2 mod 391 = 90601 mod 391= 280

H6 = (H5+M6)2 mod n = (280 + 13)2 mod 391 = 85849 mod 391= 220

H7 = (H6+M7)2 mod n = (220 + 13)2 mod 391 = 54289 mod 391= 331

В итоге получаем хеш-образ сообщения «ГАЗИЗОВ», равный 361.

Задача №5. Электронная цифровая подпись.

Используя хеш-образ своей Фамилии, вычислите электронную цифровую подпись по схеме RSA.

Решение

Хеш-образ Фамилии равен 361, а закрытый ключ алгоритма RSA равен (41, 391). Тогда электронная цифровая подпись сообщения, состоящего из Фамилии, вычисляется по правилу

s = 361 41 mod 391 = 242.

Для проверки ЭЦП, используя открытый ключ (249, 391), найдем

H = 242 249 mod 391 = 361.

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

studfiles.net

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *