Алгоритмические языки и программирование

Автор работы: Пользователь скрыл имя, 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

Файлы: 1 файл

пояснительная записка.doc

— 267.50 Кб (Скачать файл)

 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\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 означает успешное завершение программы

}//конец программы

 

 

 

 

 

 

 


Информация о работе Алгоритмические языки и программирование