Федеральное агентство по образованию
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО
ОБРАЗОВАНИЯ
“МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ПРИБОРОСТРОЕНИЯ И
ИНФОРМАТИКИ”
Факультет (филиал)___ВФ__________специальность (направление)___2201________
Кафедра ___ИС______________________________________________________________
Дисциплина___Основы защиты информации______________________________________
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовому проекту (работе) на тему:
______________________________________________________
Программная реализация шифра RSA
______________________________________________________
Генерация ключей RSA
______________________________________________________
Студент______________________________11.01.07______________А.М.Циликин___
Группа___ИС-1________________ шифр______02222____________________________
Обозначение курсового проекта (работы)___________________________________
Проект (работа) защищен(а) на оценку_____________________________________
Руководитель проекта (работы)____________________________Е.В.Письменная__
Члены комиссии___________________________________________________________
_________________________________________________________________________
_________________________________________________________________________
МОСКВА 2007 г.
Разбирался с реализацией RSA из библиотеки avr-crypto-lib. Стало интересно, что такое dP, dQ, qInv. Могу ли я их вычислить, чтобы их значения совпали с примером из библиотеки. Получилось! Проект можно использовать для создания ключей RSA различной длины, ключи вырабатываются на JavaScript и не передаются на сервер. Более того, эту страницу можно сохранить на диск и скрипт может работать локально, без связи с Интернет. Использовать ключи, полученные в этом проекте с помощью генератора псевдослучайных чисел, не рекомендую. Весьма вероятно, что зная значение первого разряда полученного числа, можно найти остальные. Дать какие-либо рекомендации по использованию ключей, полученных в этом проекте с помощью криптографически стойкого генератора случайных чисел сложно. С одной стороны функция window.crypto.getRandomValues заявлена как надежная, с другой стороны полученные ключи могут остаться в памяти браузера и утечь каким-либо образом.
Для получения возможности вычисления вышеуказанных чисел и сравнения их с примером, в проекте сделаны следующие дополнения:
Введите большие числа:
число a =
число b =
число c =
Базовые операции с большими числами (приемлемая скорость при размере чисел до 10100000):
Дополнительные операции с большими числами (приемлемая скорость при размере чисел до 10500):
Генерация случайных больших чисел (приемлемая скорость при размере чисел до 101000000):
Размер числа в битах
Базовые операции с простыми числами (приемлемая скорость при размере чисел до 10200):
Результат:
Укажите начальные значения для p, q и необязательно e. Это можно сделать несколькими способами:
ближайшее снизу к p =
ближайшее снизу к q =
ближайшее снизу к e =
Результаты:
В данной реализации шифра используется чистый RSA без перемежения. Более того, символы входят в блок целиком, т.е.
часть символа не переходит в соседний блок. Это означает, несмотря на использование больших чисел, непригодность
данной реализации для практических целей."Враг", может быть и не сможет прочесть зашифрованное послание, но может
его исказить, переставив местами блоки, исключив некоторые из них, или вставив ранее перехваченные. Далее, используется очень не экономный алфавит, поэтому размер шифротекста возрастает аж в минимум 3 раза! Тем не менее, эта курсовая работа мне уже ужасно надоела и перемежение (а также контрольные суммы) здесь реализовываться не будет. УРА!!! Работа закончена!!!
Введите числа N и E:
N =
E =
Введите открытый текст:
Введите числа n и e:
N =
D =
Введите шифротекст:
Основной способ работы с числом большой разрядности это представление такого числа в виде массива коэффициентов:
A = an·BASEn + an-1·BASEn-1 + ... + a0·BASE0.
После написания основных функций работы с большими числами, можно выполнить проверку большого числа на простоту. Существует два метода проверки числа на простоту. Один - пробное деление с порядком роста sqrt(n), другой - вероятностный, с порядком роста log (n). При использовании первого метода испытываемое число n пробуют делить на все числа a, которые могут являться его делителем 1<a<sqrt(n). Использовать для проверки больших чисел этот метод затруднительно, ввиду очень значительных затрат времени. Второй метод использует подходы с более высокой вероятностью того, что число, прошедшее тест является простым. Проведя тест многократнo, можно повысить вероятность до приемлемого уровня. Все тесты основаны на свойстве простых чисел, носящем название "Малая теорема Ферма":
Для любого простого числа n и натурального числа a, такого, что gcd(a,n)=1, выполняется равенство:
an-1 mod n = 1.
Шифр RSA основан на функции Эйлера. Эйлер расширил малую теорему Ферма для любого натурального n:
Для любого натурального числа n и натурального числа a, такого, что gcd(a,n)=1, выполняется равенство:
aφ(n) mod n = 1, где φ(n) - функция Эйлера.
Если разложить n на простые множители n = p1d1·p2d2 … pidi, то
φ(n) = n·(1-1/p1)·(1-1/p2) … (1-1/pi)
Шифр RSA очень красив и состоит из следующих шагов:
Математический смысл производимых действий:
Вычислить φ(n) = (p-1)·(q-1) = n-p-q+1.
Вычислить D = E-1 mod φ(n), т.е. D·E = 1 mod φ(n) = 1 + k ·φ(n)
Число D получатель держит в секрете (закрытый ключ).
Шифрует Сj = MjE mod n, отправляет в линию связи.
Расшифровывает Mj = CjD mod n, собирает из блоков, представляет в виде сообщения.
С = ME mod n
M = CD mod n = (ME)D mod n =
ME · D mod n = M1 + k · φ(n) mod n =
M · Mk · φ(n) mod n =
M · (Mφ(n))k mod n = M · 1k = M
Числа p и q нигде в алгоритме не используются, они нужны для того, чтобы зная n, нельзя было вычислить φ(n) и получить D.