Автор работы: Пользователь скрыл имя, 20 Января 2013 в 18:23, курсовая работа
Программа написана в среде Borland C++ 3.11.
Реализовано использование графического меню.
Данная программа реализует шифрование и дешифрование информации по алгоритму RSA.
1. Задание . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2. Аннотация. . . . . . . . . . . .. . . . . . . . . . . . . . . 4
3. Основные понятия. . . . . . . . . . . . . . . . . . . . . . . 5
4. Математические основы. . . . . . . . . . . . . . . . . . . . .8
5. Алгоритм RSA . . . . . . . . . . . . . . . . . . . . . . . .10
6. Словесная схема алгоритма . . . . . . . . . . . . . . . . . .12
7. Список используемых идентификаторов. . . . . . . . . . . . .13
8. Инструкция к программе . . . . . . . . . . . . . . . . . . . 15
9. Заключение . . . . . . . . . . . . . . . . . . . . . . .. . . 16
10. Список используемой литературы. . . . . . . . . . . . . . . 17
11.Приложение . . . . . . . . . . . . . . . . . . . . . . . .. . 18
а) Текст программы . . . . . . . . . . . . . . . . . . . . . 18
outtextxy(80,80,"ABOUT");
setcolor(4);
settextstyle(10,0,10);
outtextxy(100,160,"Type: The course project");
outtextxy(100,180,"Theme: Realization of algorithm RSA");
outtextxy(100,200,"Version: v0.0.3");
outtextxy(100,220,"Author: The student of group VT24-7 Tomchenko A.");
outtextxy(100,240,"Teacher: Shitov U.A.");
printf
("\n\n\n\n\n\n\n\n\n\n\n\n\n\
printf("\tPress any key to continue...");
getch();
}
int main() //Функция основная
{
int ch=0; //переменная для значения пункта меню основного
ingr(); //вызов Функции инициализации графики
do { //начало цикла на повтор меню
ch=main_menu();
switch (ch) {
case 1://создание открытого и закрытого ключей
{
long p,q,n,d,phi,e;//P, Q - случайная пара простых чисел. n,e- //ключ открытый. n,d - закрытый. phi для расчета d
long* pointer = new long; //рабочий указатель и память под него
FILE* pf;
int mas[]={ //массив простых чисел
157,149,19,193,163,31,179,
41,43,47,53,59,61,67,
71,73,79,83,89,97,
101,113,107,109,103,
127,131,137,17,151,
13,29,167,173,37,
181,191,23,197,199
};
int i=0; //переменная для выбора индекса в массиве
//случайный выбор индексов, присвоение элементов под этими индексами
randomize();
i=rand()%40;
p=mas[i];
i=rand()%40;
q=mas[i];
//расчет параметров
n = p*q;
p--;q--;
phi = p*q;
e = 65537;
//запись открытого ключа
pf = fopen("open_key.rsa", "wt");
*pointer = n;
fwrite(pointer,4,1,pf);
*pointer = e;
fwrite(pointer,4,1,pf);
fclose(pf);
//запись закрытого ключа
pf = fopen("pr_key.rsa", "wt");
d = eae(phi,e);//вычисление d по алгоритму Евклида (функция eae)
if(d < 0)
{
d = phi - abs(d);
}
*pointer = n;
fwrite(pointer,4,1,pf);
*pointer = d;
fwrite(pointer,4,1,pf);
fclose(pf);
//Вывод информации о создании
settextstyle(0,0,8);
outtextxy(80,80,"Keys:");
setcolor(4);
settextstyle(10,0,10);
outtextxy(100,160,"Open key (open_key.rsa) is created!");
outtextxy(100,180,"Private key (pr_key.rsa) is created!");
outtextxy(100,200,"Press any key to continue...");
delete pointer; //освобождение памяти
getch();
break;
}
case 2: // шифрование текста
{
int ch2; //переменная для значения пункта меню дополнительного
ch2=read_menu();
long n, phi, e;
FILE *pf;
long* pointer;
FILE *bf;
pointer = new long;
char *strin1,*strin2;
strin1=new char [2048]; // рабочая строка, выделение памяти
strin2=new char [2048]; // временная строка, выделение памяти
// проверка наличия ключа
pf=fopen("open_key.rsa","r");
if(pf == NULL)//esli nel'za to
{
outtextxy(100,160,"Error open's file! or OPEN key not found");
outtextxy(100,180,"Put the Open Key and Try again...");
getch();
break;
}
fclose(pf);
switch (ch2) //выбор пункта дополнительного меню
{
case 1: //чтение из файла
{
bf=fopen("bf.txt","r");
if(bf == NULL)//esli nel'za to
{
outtextxy(100,160,"Error open's file! or file not found");
outtextxy(100,180,"Press any key to exit Main menu...");
getch();
}
while (!feof(bf)) //пока не конец файла
{
fgets(strin2,2048,bf); //чтение во временную строку
cout << strin2; //вывод на экран
strcat(strin1,strin2); //значение временной + в рабочую
}
cout << endl;
fclose(bf);
break;
}
case 2: //чтение с клавиатуры
{
printf("Please, enter the plain text:\n");
cin.getline (strin1, 128); //максимум чтение 128 символов, т.к. //ограничение в среде разработки на ввод символов(max 127).
cout <<endl;
break;
}
}
//открытие файла с ключем и чтение его значений
pf = fopen("open_key.rsa", "rb");
fread(pointer,4,1,pf);
n = *pointer;
fread(pointer,4,1,pf);
e = *pointer;
fclose(pf);
//шифрование и запись в файл
pf = fopen("encode.rsa", "wb");
fseek(pf,SEEK_SET,0); //писать с начала файла
long blockse[1000];//блок с зашифрованным кодом одного символа
long blocksd1[1000];//блок для стандартного кода символа по ascii
long blocksd2[1000];//буферный блок для дешифровки
//вывод на экран открытого ключа
cout << "OPEN KEY:" <<endl;
cout << "n = " << n << endl;
cout << "e = " << e << endl;
cout <<"\n";
for(long j=0; j<strlen(strin1); j++)
{
blocksd1[j] = strin1[j];//разбор строки посимвольно
cout << "blocksd1[" << j << "] = " << blocksd1[j] << endl;
}
cout << endl;
for(long k=0; k<j; k++)
{
blockse[k] = RsaEncode(blocksd1[k], n, e);//шифрование блока
cout << "blockse[" << k << "] = " << blockse[k] << endl;
*pointer = blockse[k];
fwrite(pointer,4,1,pf);
}
*pointer = 1;
fwrite(pointer,4,1,pf);
delete pointer; //освобождение выделенной памяти
delete strin1;
delete strin2;
fclose(pf);
printf("\n\tPress any key to continue...");
getch();
break;
}
case 3://дешифрование текста
{
long n, phi, e, d; //n=p*q,phi=(n-1)(q-1),e произвольно взаимно простое с phi, d - обратный к e по модулю phi
FILE *pf;
long* pointer = new long;
//открытие ключа дешифрования
pf = fopen("pr_key.rsa", "rb");
if(pf == NULL) //выбор если нельзя открыть
{
outtextxy(100,160,"Error open's file! or Private key not found");
outtextxy(100,180,"Put the Privat key and Try again...");
getch();
break;
}
//чтение параметров ключа в программу
fread(pointer,4,1,pf);
n = *pointer;
fread(pointer,4,1,pf);
d = *pointer;
fclose(pf);
long blockse[1000]; //блок с зашифрованным кодом одного символа
long blocksd1[1000];//блок для стандартного кода символа по ascii
long blocksd2[1000]; //буферный блок для дешифровки
//вывод на экран секретного ключа
cout << "PRIVATE KEY" << endl;
cout << "n = " << n << endl;
cout << "d = " << d << endl <<endl;
cout <<"\n";
//открытие файла с зашифрованным текстом
pf = fopen("encode.rsa", "rb");
if(pf == NULL) //если нельзя открыть
{
outtextxy(100,160,"Error open's file! or file with Cipher text not found");
outtextxy(100,180,"Put the Encodes.rsa and Try again");
getch();
break;
}
//вывод блоков с зашифрованным кодом на экран
for(long k=0; 1; k++)
{
fread(pointer,4,1,pf);
if(*pointer == 1)
break;
blockse[k] = *pointer;
cout << "blockse[" << k << "] = " << blockse[k] << endl;
}
cout << endl;//"/n"
//дешифрование
for(long h = 0; h<k; h++)
{
blocksd2[h] = RsaDecode(blockse[h], n, d);
cout << char(blocksd2[h]);
}
cout << endl;
delete pointer; //освобождение памяти
fclose(pf);
printf("\n\tPress any key to continue...");
getch();
break;
}
case 4: //выбор пункта О программе
{
about();
break;
}
}
}
while (ch!=5);//повторение пока не выбран Выход из программы
getch();
return(0); //возврат 0 означает успешное завершение программы
}//конец программы
Информация о работе Алгоритмические языки и программирование