ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 07.06.2019
Просмотров: 140
Скачиваний: 1
Лабораторная работа № 3
(№ 9 по списку и инд.вариант t = 9)
Студента ИТ-14-1 Красовского Абхая
Тема: Асимметричные криптоалгоритмы
Цель: Изучить процедуры, алгоритмы и протоколы, применяемые с использованием асимметричных алгоритмов шифрования.
Задание
1. Изучить процедуру возведения целого числа в целую степень по модулю и создание на ее основе односторонних функций с секретом (при желании выполнить программную реализацию процедуры). Выполнить два примера по индивидуальному заданию.
2. Изучить протокол обмена ключами Диффи–Хеллмана (подготовка исходных данных, последовательность действий абонентов при получении общего ключа и выполняемые ими процедуры); открытая и секретная информация. Выполнить индивидуальное задание в соответствии со своим вариантом вручную.(первообразный корень выбрать минимально возможным ).
3. Изучить систему шифрования RSA (подготовка исходных данных, последовательность действий абонентов при организации процедуры обмена шифротекстами; открытая и секретная информация). Выполнить индивидуальное задание в соответствии со своим вариантом вручную.(создать открытый и закрытый ключи; зашифровать и расшифровать сообщение m).
По желанию дополнительно п. 5 (+2 балла)
4. Программно реализовать и продемонстрировать процедуры шифрования – дешифрования RSA.
№ вар. |
Задание к п. 1 |
Задание к п. 2 |
Задание к п. 3 |
|||||||||
x |
y |
mod n |
p |
a |
b |
p |
q |
e |
m |
|||
9 |
17 |
13,6 |
19 |
71 |
13 |
4 |
9 |
13 |
19 |
8 |
№1.Возведение в степень: х = 17, y = 13,6, n = 19.
// (/ - целочисленное деление)
E(x;y;n)
1. If (y == 0) return 1;
2. If (y mod 2 == 0) return (E(x*x mod n; y / 2; n));
3. Else return (x*E((x*x mod n); y / 2; n) mod n)
mod 19 = E(17;13,6;19) ->(3)-> 17 * E(17*17 mod 19; 6(13.6 / 2) ;19) mod 19 ->(2) -> 17 * E(4;3;19) ->(3) -> 4 * E(4; 1;19) -> 11 * E(4; 0; 19) = 11
Ответ: 11
№2. Протокол обмена ключами Диффи-Хеллмана.
P = 71, a = 13, b = 3;
Разложим число p на простые множители:
p = 71, (p – 1) = 70 = 2 * 5 * 7 = * *
= = 8,36
r ℮ [2;p-1) – 2..69
r = 3.
() mod p-1, p = 71, = 2, 5, 7
C = mod 71
X – положительное целое число [1,p)
C = mod 71 = 1
C = mod 71 = 12( ≠ 1 )
C = mod 71 = 48 ( ≠ 1 )
А: и B: люди, передаваемые друг другу ключ.
A: генерирует a, в нашем случае a = 13, считаем и передаем = mod p B: , = 18
B: генерирует b, в нашем случае b = 4, считаем и передаем = mod p A: , = 10
A: имеет (p;r),a, , => k = mod p = mod p, k = 38
B: имеет (p;r), a, , => k = mod p = mod p, k = 38
k – ключ.
№3.
-
Подготовка ключей
Выбираем два простых числа. P = 9 и q = 13
Вычисляем модуль — произведение наших p и q: n = p × q = 9 × 13 = 117.
Вычисляем функцию Эйлера: φ=(p-1)×(q-1) = 8 × 12 = 96.
e = 19, (e,n) – это пара чисел и есть нашим открытым ключом.
Вычислим d,(d×е) mod φ =1. Или (d×19) mod 96=1. d = 91. Пара {d, n} — это секретный ключ, его нельзя сообщать никому. Только обладатель секретного ключа может расшифровать то, что было зашифровано открытым ключом.
-
Шифровка
Допустим, мое сообщение это число 8. Обозначим его m = 8. Кроме него у нас уже есть открытый ключ: {e, n} = {8, 117}. Шифрование выполняется по следующему алгоритму:
Возводим наше сообщение в степень e по модулю n. То есть, вычисляем 8 в степени 19 и берём остаток от деления на 117. Получается 44 — это наши закодированные данные.
Полученные данные E = 44, мы отправляем получателю.
Здесь надо заметить, что сообщение P=19 не должно быть больше n = 117. иначе ничего не получится.
-
Расшифровка
Чтобы получатель расшифровал ваше сообщение, он дожжен использовать свой секретный ключ (d,n).
m (исходное сообщение) = mod n = mod 117 = 8.
Заметьте, никто, кроме меня (даже вы!) не может расшифровать ваше сообщение (m =8), так как ни у кого нет секретного ключа.
Программа:
Код:
#include <iostream>
#include <conio.h>
using namespace std;
void main()
{
setlocale(LC_ALL, "Russian");
int p, q, N, a, ei, e, m, d;
long long int c = 1;
cout << "Введите 0 для шифрования текста или 1 для расшифровки" << endl;
cin >> a;
if (a == 0)
{
cout << "Введите p и q" << endl;
cin >> p;
cin >> q;
N = p * q;
ei = (p-1) * (q-1);
cout << "Введите e < ei(n) " << endl;
cin >> e;
cout << "(" << e << "," << N << ")" << " - открытый ключ" << endl;
cout << "Находим и вычисляем d, (d*e) mod ei(n) = 1 " << endl;
for (int i = 0; i < 100; i++)
if ((i * e) % ei == 1)
{
d = i;
break;
}
cout << "..." << endl;
cout << "d = " << d << endl;
cout << "(" << d << "," << N << ")" << " - секретный ключ" << endl;
cout << "Введите сообщения для шифрования" << endl;
cin >> m;
for (int i = 0; i < e; i++) c *= m;
c %= N;
cout << "Ваше зашифрованное сообщение" << endl << c << endl;
}
if (a == 1)
{
cout << "Введите секретный ключ(пару чисел (d,n)" << endl;
cin >> d >> N;
cout << "Введите полученное шифрованное сообщение" << endl;
cin >> e;
cout << "Ваше расшифрованное сообщение" << endl;
for (int i = 0; i < d; i++)
{
c *= e;
c %= N;
}
cout << c << endl;
}
_getch();
}
Рузультат:
Вывод: Изучил процедуры, алгоритмы и протоколы, применяемые с использованием асимметричных алгоритмов шифрования.