Добавил:
abhai2013@gmail.com Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
8
Добавлен:
30.06.2018
Размер:
74.81 Кб
Скачать

Лабораторная работа № 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.

  1. Подготовка ключей

Выбираем два простых числа. 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} — это секретный ключ, его нельзя сообщать никому. Только обладатель секретного ключа может расшифровать то, что было зашифровано открытым ключом.

  1. Шифровка

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

Возводим наше сообщение в степень e по модулю n. То есть, вычисляем 8 в степени 19 и берём остаток от деления на 117. Получается 44 — это наши закодированные данные.

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

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

  1. Расшифровка

Чтобы получатель расшифровал ваше сообщение, он дожжен использовать свой секретный ключ (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();

}

Рузультат:

Вывод: Изучил процедуры, алгоритмы и протоколы, применяемые с использованием асимметричных алгоритмов шифрования.

Соседние файлы в папке Второй триместр