Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Московский государственный институт электроники и математики
(технический университет)
Кафедра ИКТ
Отчет по лабораторной работе
по дисциплине
“Зашита Информации”
на тему
“Алгоритм шифрования RSA”
Выполнил:
Студент группы с-85
Проверил:
Преподаватель
Москва 2008
Содержание
Техническое задание. 3
Формальное описание шифра. 3
Реализация программы на языке C++. 4
Пример выполнения. 6
Техническое задание
Формально описать и реализовать на языке программирования C++ алгоритм шифрования RSA.
Формальное описание шифра
Безопасность алгоритма RSA основана на трудности задачи разложения на множители. Алгоритм использует два ключа — открытый и секретный, вместе открытый и соответствующий ему секретный ключи образуют пару ключей. Открытый ключ не требуется сохранять в тайне, он используется для шифрования данных. Если сообщение было зашифровано открытым ключом, то расшифровать его можно только соответствующим секретным ключом.
Генерация ключей
Для того, чтобы сгенерировать пару ключей выполняются следующие действия:
Выбираются два больших случайных простых числаЧисло
называется модулем, а числа
и
— открытой и секретной экспонентами, соответственно. Пара чисел
является открытой частью ключа, а
— секретной. Числа
и
после генерации пары ключей могут быть уничтожены, но ни в коем случае не должны быть раскрыты.
Шифрование и расшифровывание
Для того, чтобы зашифровать сообщение
вычисляется
.
Число
и используется в качестве шифртекста. Для расшифровывания нужно вычислить
.
Нетрудно убедиться, что при расшифровывании мы восстановим исходное сообщение:

Из условия

следует, что
для некоторого целого
, следовательно

Согласно теореме Эйлера:
,
поэтому


Реализация программы на языке C++
#include "stdafx. h"
#include <stdio. h>
#include <stdlib. h>
#include <time. h>
#include <conio. h>
#include <iostream>
using namespace std;
struct rsa_public_key {
int e, m;
};
struct rsa_private_key {
int d, m;
};
// Нахождение общего делителя
int gcd(int a, int b)
{
if (b == 0)
return a;
else
return gcd(b, a % b);
}
// Решение Диофантова уравнения a*x + b*y = 1
void SolveDiophant(int a, int b, int &x, int &y)
{
int a11=1, a12=0, a21=0, a22=1;
while (1) {
int r = a % b;
if (r == 0) {
x = a12;
y = a22;
return;
}
else {
int q = a/b;
int save12 = a12;
int save22 = a22;
a12 = a11-save12*q;
a22 = a21-save22*q;
a11 = save12;
a21 = save22;
a = b;
b = r;
}
}
}
// Поиск числа y, такого что (x*y)%m == 1
int FindInvert(int x, int m)
{
int y, sux;
SolveDiophant(x, m, y, sux);
while (y < 0)
y += m;
return y;
}
// вычисление (a в степени b)%m
int Power(int a, int b, int m)
{
a %= m;
int res = a;
for (int i = 1; i < b; i++)
res = (res * a) % m;
return res;
}
// Генерируем пару ключей.
// GCD(e, p-1) = GCD(e, q-1) = 1
void GenKeyPair(int p, int q, int e, rsa_public_key &pub,
rsa_private_key &pri)
{
if ((gcd(e, p-1) != 1) || (gcd(e, q-1) != 1)) {
printf("GenerateKeyPair: Invalid parameters\n");
exit(1);
}
pub. m = p*q;
pub. e = e;
pri. m = p*q;
// Функция Эйлера phi(m)
int phi_m = (p-1)*(q-1);
pri. d = FindInvert(e, phi_m);
}
// Сообщение должно быть < key. m
int Encode(int source, rsa_public_key &key)
{
return Power(source, key. e, key. m);
}
int Decode(int source, rsa_private_key &key)
{
return Power(source, key. d, key. m);
}
int main ()
{
setlocale (LC_CTYPE, "Russian_Russia.1251");
int p;
int q;
int e=59;
int vvod;
cout<<"Введите чило P:"<<endl;
cin>>p;
cout<<"Введите чило Q, близкое к P:"<<endl;
cin>>q;
cout<<"Введите сообщение, которое будет закодировано:"<<endl;
cin>>vvod;
rsa_public_key pub_key;
rsa_private_key pri_key;
GenKeyPair(p, q, e, pub_key, pri_key);
srand(time(NULL));
int source = vvod % pub_key. m;
int enc = Encode(source, pub_key);
int dec = Decode(enc, pri_key);
if (dec!= source)
printf("Ошибка! Недостаточно памяти для сообщения\n");
else
printf("Исходное сообщение: %d, Закодированное: %d, Декодированное: %d\n",
source, enc, dec);
printf("Публичный ключ: %d, Секретный ключ: %d",
pub_key. m, pri_key);
getch();
}
Пример выполнения
1. Запуск

2. Ввод начальных данных

3.Ввод сообщения

4.Вывод результатов шифрования.



