Криптоалгоритмы, формирование открытых ключей

Автор: Пользователь скрыл имя, 13 Июня 2013 в 11:42, курсовая работа

Краткое описание

Криптография – область науки, техники и практической деятельности, связанная с разработкой, применением и анализом криптографических систем защиты информации. Основными функциями криптографических систем являются обеспечение конфиденциальности, целостности, доступности и аутентификации различных аспектов информационного взаимодействия. Источником угроз при решении криптографических задач считаются преднамеренные действия противника или недобросовестного участника информационного взаимодействия, а не случайные искажения информации вследствие помех, отказов и т. п.
Конфиденциальность – защищенность информации от ознакомления с ее содержанием со стороны лиц, не имеющих права доступа к ней.

Оглавление

ВВЕДЕНИЕ
ИСПОЛЬЗУЕМЫЕ МЕТОДЫ И АЛГОРИТМЫ
Требования к свойствам криптопараметров
Бинарный алгоритм возведения в степень по модулю
Формирование рабочих ключей
Алгоритм формирования ЭЦП
Алгоритм проверки ЭЦП
Постановка задачи реализации
ОПИСАНИЕ ПРОГРАММЫ
2.1 Общие сведения
2.2 Функциональное назначение
2.3 Описание логической структуры
2.4 Используемые технические средства
2.5 Вызов и загрузка программы
Входные и выходные данные
ВЫВОДЫ
ПЕРЕЧЕНЬ ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
ПРИЛОЖЕНИЕ А

Файлы: 1 файл

Kursovaya_rabota (1).docx

— 153.70 Кб (Скачать)

  Xpower(g, X, P, Y);

return;

}

 

void Sign_ElGamal(unsigned int P, unsigned int g, unsigned int X, unsigned int H, unsigned int &R, unsigned int &S) // Формирование ЭЦП (R, S)

unsigned int K=0, y=0;

do

{  

do

{  

  K = ((( (rand()<<16) | (rand()) )%(P-2)) +2)|1; 

      Xpower(g, K, P, R); 

}

while (GetD((P-1), K, y)); // Делать пока (K,P-1) != 1

__int64 XR = X;

XR*=R; XR%=(P-1);

XR = H - XR;

if(XR < 0)

  do

  {

  XR+= (P-1);

  }

  while (XR < 0);

S = (y*(XR % (P - 1)))%(P-1);

}

while (S == 0);

return;

}

 

int Verify_ElGamal(unsigned int P, unsigned int g, unsigned int Y, unsigned int H, unsigned int R, unsigned int S) // Проверка подлинности ЭЦП

{

unsigned int GH, YR, RS;

Xpower (g, H, P, GH);

Xpower (Y, R, P, YR);

Xpower (R, S, P, RS);

unsigned __int64 YRS;

YRS = (YR*RS) % P;

if (GH != YRS)

return 1; // Не прошло проверку подлинности

else return 0;

}

 

int main()

{

setlocale (LC_ALL, "rus");

srand(time(NULL));

FILE *KeyFile, *KeyFile2, *MFile, *CFile;

int LenK;

int Program, LenM = 0, LenInf;

char temp[256];  

//_______________________________________

//определение выполняемой  программы

do

{

system("cls");

cout<<"Введите:\n1 — для генерации ключей;\n2 — для формирования ЭЦП;\n3 — для проверки ЭЦП;\n0 — для выхода\t";

do

{

cin.getline(temp, 256);

for (temp; !isdigit((int)temp[0]) ; )//если первый элемент строки — НЕ цифра

{

cout<<"\nВведите численное значение\n";

cin.getline(temp,256);

}

Program = atoi(temp);

if (Program != 1 && Program != 2 && Program != 3 && Program != 0)

{

cout<<"\nНеверное значение, повторите попытку\n";

}

} while (Program != 1 && Program != 2 && Program != 3 && Program != 0);

system("cls");

//______________________

//Выполнение программы  генерации ключа

if (Program == 1)

{   

// генерация ключа

unsigned int P=0, g=0, X, Y, R, S;

MakePg (P, g);

cout<<" P = "<<P<<"       g = "<<g<<endl;

FormXY (P, g, X, Y);

cout<<"X = "<<X<<" Y = "<<Y<<endl;

int coun = 0, klen = 0;

do

{

printf("%s", "Введите название файла, в который записывать открытые ключи P, g:\n");

cin.getline (temp, 256);

if (!strcmp(temp,EXIT))

      return 0;

if ((KeyFile=fopen(temp, "wb"))==0)  //fopen() возвращает 0 при ошибке

{

do

{

cout<<"\nНеверное название файла, повторите попытку\n";

cin.getline (temp, 256);

       if (!strcmp(temp,EXIT))

return 0;

} while ((KeyFile=fopen(temp, "wb"))==0);

}   

klen = 0;

         klen+= fwrite(&P, sizeof(unsigned int), 1, KeyFile);//записываем P

         klen+= fwrite(&g, sizeof(unsigned int), 1, KeyFile);  // записываем g

     coun++;

fclose (KeyFile);

}

while ((klen != 2) && (coun < 2));

if (klen != 2)

     cout<<"\tКлюч записан неправильно.\n";

// ----- //

do

{

printf("%s", "Введите название файла, в который записывать ключ Y:\n");

cin.getline (temp, 256);

if (!strcmp(temp,EXIT))

      return 0;

if ((KeyFile=fopen(temp, "wb"))==0)  //fopen() возвращает 0 при ошибке

{

do

{

cout<<"\nНеверное название файла, повторите попытку\n";

cin.getline (temp, 256);

       if (!strcmp(temp,EXIT))

return 0;

} while ((KeyFile=fopen(temp, "wb"))==0);

}   

klen = 0;

         klen+= fwrite(&Y, sizeof(unsigned int), 1, KeyFile);//записываем Y          

     coun++;

fclose (KeyFile);

}

while ((klen != 1) && (coun < 2));

if (klen != 1)

     cout<<"\tКлюч записан неправильно.\n";  

// ------ //

do

{

printf("%s", "Введите название файла, в который записывать ключ X:\n");

cin.getline (temp, 256);

if (!strcmp(temp,EXIT))

      return 0;

if ((KeyFile=fopen(temp, "wb"))==0)  //fopen() возвращает 0 при ошибке

{

do

{

cout<<"\nНеверное название файла, повторите попытку\n";

cin.getline (temp, 256);

       if (!strcmp(temp,EXIT))

return 0;

} while ((KeyFile=fopen(temp, "wb"))==0);

}   

klen = 0;

         klen+= fwrite(&X, sizeof(unsigned int), 1, KeyFile);//записываем X        

fclose (KeyFile);

}

while ((klen != 1) && (coun < 2));

if (klen != 1)

     cout<<"\tКлюч записан неправильно.\n";  

cin.clear();

system("pause");

}

//________________________

//Выполнение программы  формирования подписи 

   if (Program == 2)

{

//_______________________________________

//получение текста для  шифровки

cout<<"Введите название файла данных:\n";

cin.getline(temp, 256);

if (!strcmp(temp,EXIT))

return 0;

if ((MFile=fopen(temp, "rb"))==0)  //fopen() возвращает 0 при ошибке

{

do

{

cout<<"\nНеверное название файла, повторите попытку\n";

cin.getline (temp, 256);

if (!strcmp(temp,EXIT))

return 0;

} while ((MFile=fopen(temp, "rb"))==0);

}

fseek (MFile, 0, SEEK_END);

LenM = (int)ftell(MFile);

fseek (MFile, 0, SEEK_SET);

unsigned char *M = new unsigned char[LenM+1];  

 

//__________________________

//получение ключа из  файла

bool tfile = true;

unsigned int P, g, X;

cout<<"\nВведите название файла, куда записали открытые ключи P, g\n";

cin.getline (temp, 256);

if (!strcmp(temp,EXIT))

return 0;

if ((KeyFile=fopen(temp, "rb"))==0) 

{

do

{

cout<<"\nНеверное название файла, повторите попытку\n";

cin.getline (temp, 256);

if (!strcmp(temp,EXIT))

return 0;

} while ((KeyFile=fopen(temp, "rb"))==0);

}

         LenInf = 0;

LenInf+= fread (&P, sizeof(unsigned int), 1, KeyFile);

LenInf+= fread (&g, sizeof(unsigned int), 1, KeyFile);      

    if (LenInf!= 2) // Проверка правильно ли считаны ключи

{

tfile = false;

cout<<"\tКлючи считаны неправильно.\n";

}   

fclose (KeyFile);

    if (tfile)

{    

cout<<"\nВведите название файла, куда записали ключ X: \n";

cin.getline (temp, 256);

if (!strcmp(temp,EXIT))

return 0;

if ((KeyFile2=fopen(temp, "rb"))==0) 

{

do

{

cout<<"\nНеверное название файла, повторите попытку\n";

cin.getline (temp, 256);

if (!strcmp(temp,EXIT))

return 0;

} while ((KeyFile2=fopen(temp, "rb"))==0);

}

          LenInf = fread (&X, sizeof(unsigned int), 1, KeyFile2);    

     if (LenInf != 1)

{

tfile = false;

cout<<"\tКлюч считан неправильно.\n";

}      

fclose (KeyFile2);

}

if (tfile)

{

//________________________________

// получение параметров  подписи

     unsigned int R, S;

fread (M, sizeof(unsigned char), LenM, MFile); 

int H;

H  = CRC32Count(M, LenM);

if (H < 0)

H*= -1;

cout<<"Хэш-функция = "<<H<<endl;

Sign_ElGamal(P, g, X, H, R, S);

cout<<" Получены параметры подписи: R = "<<R<<" S = "<<S<<endl;

cout<<"\n\nP= "<<P<<"\tg= "<<g<<"\tX= "<<X<<"\tH= "<<H<<endl;

fclose (MFile);

      //_______________________________

//записывание параметров  подписи в файл

       int coun = 0, klen;

do

{

printf("%s","\n\nВведите название файла для записи параметров подписи:\n");

       cin.getline (temp, 256);

           if (!strcmp(temp,EXIT))

            return 0;

           if ((CFile=fopen(temp, "wb"))==0)  //fopen() возвращает 0 при ошибке

           {

           do

            {

             cout<<"\nНеверное название файла, повторите попытку\n";

           cin.getline (temp, 256);

             if (!strcmp(temp,EXIT))

         return 0;

            } while ((CFile=fopen(temp, "wb"))==0);

          }

       klen = 0;

      klen+= fwrite(&R, sizeof(unsigned int), 1, CFile);

klen+= fwrite(&S, sizeof(unsigned int), 1, CFile);

coun++; 

fclose (CFile);     

}

while ((klen != 2) && (coun < 2));

if (klen != 2)

cout<<"\nДанные не записались\n";        

}

     system("pause");

fcloseall();

}  

//___________________________________

//Выполнение программы  проверки подписи

 

if (Program == 3)

{

cout<<"Введите название файла данных: \n";

cin.getline(temp, 256);

if (!strcmp(temp,EXIT))

return 0;

if ((CFile=fopen(temp, "rb"))==0)  //fopen() возвращает 0 при ошибке

{

do

{

cout<<"\nНеверное название файла, повторите попытку\n";

cin.getline (temp, 256);

if (!strcmp(temp,EXIT))

return 0;

} while ((CFile=fopen(temp, "rb"))==0);

}

fseek (CFile, 0, SEEK_END);

LenM = (int)ftell(CFile);

fseek (CFile, 0, SEEK_SET);

unsigned char* M = new unsigned char[LenM+1];

unsigned char* M1 = new unsigned char[LenM+1];   

bool tfile = true;

unsigned int P, g, Y, R, S;

cout<<"\nВведите название файла, куда записали открытые ключи P, g\n";

cin.getline (temp, 256);

if (!strcmp(temp,EXIT))

return 0;

if ((KeyFile=fopen(temp, "rb"))==0) 

{

do

{

cout<<"\nНеверное название файла, повторите попытку\n";

cin.getline (temp, 256);

if (!strcmp(temp,EXIT))

return 0;

} while ((KeyFile=fopen(temp, "rb"))==0);

}

         LenInf = 0;

LenInf+= fread (&P, sizeof(unsigned int), 1, KeyFile);

LenInf+= fread (&g, sizeof(unsigned int), 1, KeyFile);      

    if (LenInf!= 2)

{

tfile = false;

cout<<"\tКлючи считаны неправильно.\n";

}   

fclose (KeyFile);

    if (tfile)

{    

cout<<"\nВведите название файла, куда записали ключ Y: \n";

cin.getline (temp, 256);

if (!strcmp(temp,EXIT))

return 0;

if ((KeyFile2=fopen(temp, "rb"))==0) 

{

do

{

cout<<"\nНеверное название файла, повторите попытку\n";

cin.getline (temp, 256);

if (!strcmp(temp,EXIT))

return 0;

} while ((KeyFile2=fopen(temp, "rb"))==0);

}

          LenInf = fread (&Y, sizeof(unsigned int), 1, KeyFile2);    

     if (LenInf != 1)

{

tfile = false;

cout<<"\tКлюч считан неправильно.\n";

}      

fclose (KeyFile2);

}

if (tfile)

{

cout<<"\nВведите название файла, куда записали параметры подписи R, S: \n";

cin.getline (temp, 256);

if (!strcmp(temp,EXIT))

return 0;

if ((KeyFile2=fopen(temp, "rb"))==0) 

{

do

{

cout<<"\nНеверное название файла, повторите попытку\n";

cin.getline (temp, 256);

if (!strcmp(temp,EXIT))

return 0;

} while ((KeyFile2=fopen(temp, "rb"))==0);

}

          LenInf = 0;

LenInf+= fread (&R, sizeof(unsigned int), 1, KeyFile2);

LenInf+= fread (&S, sizeof(unsigned int), 1, KeyFile2);

     if (LenInf != 2)

{

tfile = false;

cout<<"\tПодпись считана неправильно.\n";

}      

fclose (KeyFile2);

}

if (tfile)

{

       fread(M, sizeof(unsigned char), LenM, CFile);

     fclose(CFile);

int H = CRC32Count(M, LenM);

if (H < 0)

H*= (-1);

cout<<"Хэш-функция = "<<H<<endl;

bool ElGamal = Verify_ElGamal(P, g, Y, H, R, S);

cout<<"\n\nP= "<<P<<"\tg= "<<g<<"\tY= "<<Y<<"\tH= "<<H<<"\tR= "<<R<<"\tS= "<<S<<endl;

cout<<"Параметры и ключи: P = "<<P<<" g = "<<g<<" Y = "<<Y<<" R = "<<R<<" S = "<<S<<endl; // !!!!!

if (ElGamal == 0)

cout<<"Цифровая подпись верна\n\n";

else cout<<"Нарушение целостности и/или подлинности подписи. Подпись не верна\n\n";

cout<<"Изменим исходную информацию и проверим ЭЦП для нее:\n";

for (int i = 0; i < LenM; ++i)

M1[i] = M[i];

if ((M1[LenM-1]&1) == 0)

{

M1[LenM-1] = M1[LenM-1]>>1;

M1[LenM-1]|= 1;    

}

else M1[LenM-1]&= 0;

int H1  = CRC32Count(M1, LenM);

if (H1 < 0)

H1*= -1;

cout<<"Новая хэш-функция = "<<H1<<endl;

 

cout<<"Параметры и ключи: P = "<<P<<" g = "<<g<<" Y = "<<Y<<" R = "<<R<<" S = "<<S<<endl;

ElGamal = Verify_ElGamal(P, g, Y, H1, R, S);

if (ElGamal == 0)

cout<<"Цифровая подпись верна\n\n";

else cout<<"Нарушение целостности и/или подлинности подписи. Подпись не верна\n\n";

cout<<"Изменим параметр ЭЦП S и проверим ЭЦП для исходной информации:\n";

cout<<"Хэш-функция = "<<H<<endl;

unsigned int S1 = S - 1;

cout<<"Параметры и ключи: P = "<<P<<" g = "<<g<<" Y = "<<Y<<" R = "<<R<<" S = "<<S1<<endl;

ElGamal = Verify_ElGamal(P, g, Y, H, R, S1);

if (ElGamal == 0)

cout<<"Цифровая подпись верна\n\n";

else cout<<"Нарушение целостности и/или подлинности подписи. Подпись не верна\n\n";

fcloseall();

}

        system ("pause");

}  

cout<<"\n\n";

} while (Program != 0);

return 0;

}

 

 


Информация о работе Криптоалгоритмы, формирование открытых ключей