Вокруг алгоритмов шифрования с отрытым и закрытым ключом существует множество недопониманий и мистификаций. Здесь я хотел бы предельно коротко и наглядно, с конкретными числами и минимумом формул, показать, как это работает.
Я не вдаюсь в теорию (не очень понятно, на какой уровень подготовки читателя следует рассчитывать), но я уверен, что прочитав эту короткую иллюстрацию, любому человеку будет проще разобраться в формулах и строгих доказательствах.
Итак. Допустим, я хочу получить от вас некие данные. Мы с вам не хотим, чтобы эти данные узнал кто-то, кроме нас. И у нас нет никакой уверенности в надёжности канала передачи данных. Приступим.
Я должен проделать предварительные действия: сгенерировать публичный и приватный ключ.
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:
Мы на каждом шагу, практически без перебора, получали всё новые и новые множители, легко получив полное разложение 360=2×2×2×3×3×5
Давайте теперь возьмём число 361. Тут нам придётся помучиться.
При использовании больших чисел, задача становится очень сложной. Это позволяет надеяться, что у взломщика просто не хватит вычислительных ресурсов, чтобы сломать ваши шифр за обозримое время.
Многие читатели спрашивают, как всё это применяется на практике. Давайте рассмотрим чуть более приближенный к жизни пример. Зашифруем и расшифруем слово «КРОТ», предложенное одним из читателей. А заодно, бегло рассмотрим, какие проблемы при этом встречаются и как они решаются.
Сперва сгенерируем ключи с чуть бо́льшими числами. Они не так наглядны, но позволят нам шифровать не только числа от нуля до 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 является относительно медленным алгоритмом, и из-за этого он реже используется для прямого шифрования пользовательских данных. Чаще всего RSA передает зашифрованные общие ключи для шифрования с симметричным ключом, который, в свою очередь, может выполнять массовые операции шифрования-дешифрования на гораздо более высокой скорости.
crypt-online.ru
Короткова Дарья Алексеевна,
студентка Ульяновский государственный университет
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 или функции Рабина) для повышения криптостойкости последней.
Шифрование. Ниже показаны шаги процесса шифрования.
Дешифрование. Следующие шаги показывают процесс дешифрования:
Алгоритм OAEP применяется для предварительной обработки сообщения перед использованием RSA. Сначала сообщение дополняется до фиксированной длины с помощью OAEP, затем шифруется с помощью RSA.
Литература:
journalpro.ru
Содержание:
Допустим, что объект А хочет передать сообщение объекту В в зашифрованном виде. Для этого используем алгоритм RSA. При передаче могут возникнут проблемы из-за характеристики проводных линий связи или плохую полосу пропускания и пропускную способность. Для этого нужно использовать методы обнаружения ошибок. Но для разных сетей разные методы.
Шаги:
При реализации алгоритма на практике, нужно иметь возможность без сильных затрат генерировать большие простые числа, к тому же быстро решать значение ключей.
Для наглядности вычисления, будем использовать небольшие числа. Но на практике используют очень большие числа ( длиной 200-300 десятичных разрядов).
Действия объекта В:
Действия объекта A:
Действия объекта B:
Объект получил исходное сообщение, которое послал объект A.
Шифрование с помощью RSA есть одним из методов защиты информации при передачи данных через сеть Интернет. Схема Рабина очень похожа на схему RSA. Криптоалгоритм RSA признан стойким при дине ключа больше 1024 бит. Нужно отметить что алгоритм применяют как для шифрования так и для электронно-цифровой подписи. Нетрудно заметить что в асимметричной криптосистеме RSA количество ключей связано с количеством пользователей линейной зависимостью (N пользователей используют 2 × N ключей), а не квадратичной как это используется в симметричных системах.
Применение алгоритма может решить некоторые угрозы информационной безопасности в сети.
Если сравнивать самые популярных представителей асимметричного и симметричного шифрования, нужно отметить, что по скорости RSA уступает DES, да и реализация криптоалгоритма RSA сложнее. Поэтому RSA обычно используется для передачи небольших сообщений. Шифрование как таковое, частично решает проблемы защиты информации в сетях.
Оценка статьи:
Загрузка…Поделиться с друзьями:
infoprotect.net
В этой статье я решаю на языке MIT Scheme задачу шифрования и дешифрования методом RSA [1]. По ряду причин, которые рассматриваются в статье, реализация не может использоваться для криптографической защиты информации.
Первый этап генерации ключей — случайный выбор двух достаточно больших простых чисел 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].
Как и в группе целых чисел, умножение в кольце вычетов можно задать при помощи сложения, а возведение в степень — при помощи умножения. Как и в группе целых чисел, получившиеся операции сложения и умножения будут обладать ассоциативностью, то есть:
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))
(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) )
habr.com
Процитируем авторов учебного пособия «Основы криптографии» А.П. Алферов, А.Ю. Зубов, А.С. Кузьмин, А.В. Черемушкин, Москва. «Гелиос АРВ», 2001г., на странице 316:
«Следует подчеркнуть необходимость соблюдения осторожности в выборе модуля RSA (числа n) для каждого из корреспондентов сети. В связи с этим можно сказать следующее. Читатель может самостоятельно убедиться в том, что зная одну из трех величин p, q или φ(n), можно легко найти секретный ключ RSA…».
Дополним этот текст. При неудачном выборе модуля шифра RSA, как это сделано в примере пособия, приводимом ниже, можно дешифровать текст и без наличия секретного ключа, т.е. не зная ни одной из трех названных величин.
Для этого достаточно располагать зашифрованным текстом, заданным модулем шифра n, открытым ключом е шифра и выполнить всего три шага атаки «бесключевого чтения». После четвертого атакующего шага устанавливается, что на предыдущем шаге был получен исходный текст, он может быть прочитан. Покажем, насколько просто это делается.
Вначале приведем сам пример со стр. 313-315 из названного пособия.
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:
y1=Еk(М1)=М1e≡2977(mod527)=474.
Здесь воспользовались тем, что:
2977=((2972)3)297≡(mod527)=(2003(mod527)297)(mod527)=474,
y2=Еk(М2)=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 (е=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:   4747(mod527)=382;
Шаг 2:   3827(mod527)=423;
Шаг 3:   4237(mod527)=297;
Шаг 4:   на этом шаге шифруется уже найденный исходный текст, но его необходимо выполнить, так как атакующий исходного текста не знает. Признаком завершения атаки является совпадение начального значения шифртекста (474) и результата 4-го шага зашифрования. Именно такое совпадение и имеет место.
2977(mod527)=474 получили начальный (первый) блок шифртекста. Атака на первый блок завершена успешно у1=474. Предшествующий результат шага 3 равен открытому тексту М1=297.
По существу в кольце вычетов по модулю n=527 реализовался короткий цикл обработки вычета r=297 по модулю n=527. Это записывается так yi=у1=297. Формируем степенные вычеты
(((2977(mod527))7(mod527))7(mod527))7=297.
Атака на второй блок у2=407 шифртекста.
Шаг 1:   4077(mod527)=16;
Шаг 2:   167(mod527)=101;
Шаг 3:   1017(mod527)=33;
Шаг 4:   337(mod527)=407.
Вновь на третьем шаге получен блок исходного текста (М2=33), но атакующему это неизвестно, и он выполняет следующий (четвертый шаг), результат которого (407) совпадает с начальным шифртекстом у2=407.
По существу в кольце вычетов по модулю n=527 реализовался короткий цикл обработки вычета r=33 по модулю n=527. Это записывается так yi=у2=33.
Формируем степенные вычеты ((337(mod527))7(mod527))7(mod527)=33.
Результат атаки (исходный текст М1=297, М2=33) получен трехкратным шифрованием заданного шифртекста. Больший успех для атакующего шифртекст трудно представить.
Продолжая обсуждение вопроса о выборе модуля и других параметров шифра, можно добавить, что модуль шифра (n=527) некоторые исходные тексты вообще не позволяет шифровать. При этом выбор значения открытого ключа е большой роли не играет. Существуют значения исходных текстов, которые вообще невозможно зашифровать выбранным шифром с модулем n=527.
Ни на одном из заданных е не удается зашифровать исходные тексты, представляемые числами
187, 341, 154 и 373.
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
Сгенерируйте открытый и закрытый ключи в алгоритме шифрования 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), то есть «ГИН».
Найти хеш–образ своей Фамилии, используя хеш–функцию , где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.
Используя хеш-образ своей Фамилии, вычислите электронную цифровую подпись по схеме RSA.
Решение
Хеш-образ Фамилии равен 361, а закрытый ключ алгоритма RSA равен (41, 391). Тогда электронная цифровая подпись сообщения, состоящего из Фамилии, вычисляется по правилу
s = 361 41 mod 391 = 242.
Для проверки ЭЦП, используя открытый ключ (249, 391), найдем
H = 242 249 mod 391 = 361.
Поскольку хеш-образ сообщения совпадает с найденным значением H, то подпись признается подлинной.
studfiles.net