Курсовая работа по «Информатике»

Автор: Пользователь скрыл имя, 30 Марта 2013 в 08:54, курсовая работа

Описание работы

Программно реализовать на языке C++ алгоритм шифрования и дешифрования сообщения c помощью метода в соответствии с вариантом. Номер варианта k определяется по формуле: k=N mod 4, где N=11 – номер студента в журнале. K=5 mod 4=1; K=1
Метод шифрования «Шифр Эль-Гамаля» Программно реализовать на языке C++ алгоритм электронной подписи сообщения и проверки его подлинности c помощью метода в соответствии с вариантом. Номер варианта k определяется по формуле: k=N mod 3, где N – номер студента в журнале. K=5 mod 3=2 K=2 Система Диффи-Хелмана Программно реализовать на языке C++ алгоритм шифрования и дешифрования сообщения c помощью потокового шифра RC4.

Содержание

1.Текст задания, с указанием номера студента в журнале и соответствующих вариантов задания.
2.Краткое описание алгоритма шифра Эль-Гамаля.
3.Реализация шифрования/дешифрования методом Эль-Гамаля.
3.1. Описание основных функций и переменных.
3.2.Результаты выполнения программы.
4. Краткое описание алгоритма электронной подписи Диффи-Хеллмана.
5. Реализация алгоритма подписи сообщения c помощью системы Диффи-Хеллмана.
5.1. Описание основных функций и переменных.
5.2. Результаты выполнения программы.
6. Краткое описание алгоритма RC4.
7. Реализация алгоритма RC4.
7.1. Описание основных функций и переменных.
7.2. Результаты выполнения программы.

Работа содержит 1 файл

Федеральное агентство связи Р1.docx

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

              fprintf(f_temp,"%ld",X);//записываем Х в файл

              fclose(f_temp);

     f_temp=fopen("temp.txt","r");

              fscanf(f_temp,"%s",str);//затем считываем его как строку.

              fclose(f_temp);

}

__int64 powmod(__int64 a, __int64 k, __int64 n)

{//вычисляет a^k mod n

  __int64 b=1;

  while (k) {

    if (k%2==0) {

      k /= 2;

      a = (a*a)%n;

      }

    else {

      k--;

      b = (b*a)%n;

      }

  }

  return b;

int main()

{

    //вычисление секретного ключа

    __int64 P,G,a,b,A,B,K_bob,K_alice;

    P=65537;//public

    G=32768;//public

    a=34523;//знает только Боб

    b=24357;//знает только Алиса

    A=powmod(G,a,P);//значение А вычисляет Боб и передает Алисе

    B=powmod(G,b,P);//значение B вычисляет Алиса и передает Бобу

    K_bob=powmod(B,a,P);//privat

    K_alice=powmod(A,b,P);//privat

   

    int_to_string(K_bob);                           //меняем формат ключей

  char key_bob[256];                                //Боба и Алисы на строковый

  for(int i=0;i<strlen(str);i++)key_bob[i]=str[i];  //тип.

    int_to_string(K_alice);                         //

  char key_alice[256];                              //

  for(int i=0;i<strlen(str);i++)key_alice[i]=str[i];// 

    //создание цифровой подписи

   

    __int64 p_pow=1,p=2,H=0;

              char ch;

     FILE* f_in=fopen("DiffiHelman.txt","r");//открываем для чтения.

     FILE* f_out=fopen("DiffiHelman_.txt","w");//сюда запишем подписанное

    if(f_in != NULL)                          //сообщение.

         {

              while((ch = getc(f_in))!= EOF)//пока не конец файла

              {

                      H+=ch*p_pow;  //вычмсляем ХЭШ сообшения

                      p_pow*=p;     //

                      fprintf(f_out,"%c",ch);//копируем из "DiffiHelman.txt"

              }                             // в "DiffiHelman_.txt"         

              fprintf(f_out,"%d",0);//стравим разделительный символ 0

              int_to_string(H);//меняем формат ХЭШа

              crypt(str,key_bob);//Шифруем ХЭШ секретным ключем Боба

               fprintf(f_out,"\n%s",str); //добавляем его к сообщению.

         }

     else printf("Error: No file(DiffiHelman.txt).\n");

     fclose(f_in);

     fclose(f_out);

//_________________________________

//Проверка подлинности  сообщения и подписи

 

      H=0;p_pow=1;        

     FILE* f = fopen("DiffiHelman_.txt","r");

       if(f != NULL)

         {

              int fl=0,i=0;

              while(((ch = getc(f))!= EOF)&&(fl==0))//считываем посимвольно

              {

                      if(ch=='0'){fl=1;}//пока не достигли подписи

                      if(fl==0)

                      {

                      H+=ch*p_pow;//вычисляем ХЭШ

                      p_pow*=p; 

                      printf("%c",ch);

                      }else//если достигнута подпись, то

                      {

                           fscanf(f,"%s",str);//считываем ее как строку

                           printf("\n\n______________________\ndigital signature=%s",str);

                      }

              }

         }

     else printf("Error: No file(DiffiHelman.txt).\n");

      fclose(f);

 

     char hash[1024];

     char dhash[1024];

 

      crypt(str,key_alice);//дешифруем подпись секретным ключем Алисы

      int fl=0;

     for(int i=0;i<=strlen(str);i++)

     {

             dhash[i]=str[i];//записываем дешифрованный ХЭШ в dhash

     }

     int_to_string(H);//меняем формат вычисленного ХЭШа на строковый

     for(int i=0;i<=strlen(str);i++)

     {

             hash[i]=str[i];

             if(hash[i]!=dhash[i])fl=1;//сравниваем дэшифрованный и вычисленный

     }                                 //ХЭШи            

    

     printf("\ndecriptHASH msg=%s",dhash);

     printf("\nmsgHASH=%s\n",hash);

    

     if(!fl)printf("\nVerification OK!\n");

     else printf("\nVerification failed!\n");

    

         system("PAUSE");

    return 0;

}

 

5.2Результат выполнения программы. 

 

6. Краткое описание  алгоритма RC4.

Ядро алгоритма состоит  из функции генерации ключевого  потока. Эта функция генерирует последовательность битов ( ), которая затем объединяется с открытым текстом ( ) посредством суммирования по модулю два. Так получается шифрограмма ( ):

.

Расшифровка заключается  в регенерации этого ключевого  потока ( ) и сложении его и шифрограммы ( ) по модулю два. В силу свойств суммирования по модулю два на выходе мы получим исходный незашифрованный текст( ):

Другая главная часть  алгоритма — функция инициализации, которая использует ключ переменной длины для создания начального состояния генератора ключевого потока.

RC4 — фактически класс алгоритмов, определяемых размером его блока. Этот параметр n является размером слова для алгоритма. Обычно, n = 8, но в целях анализа можно уменьшить его. Однако для повышения безопасности необходимо увеличить эту величину. Внутреннее состояние RC4 представляется в виде массива слов размером 2и двух счетчиков, каждый размером в одно слово. Массив известен как S-бокс, и далее будет обозначаться как S. Он всегда содержит перестановку 2возможных значений слова. Два счетчика обозначены через i и j.

Алгоритм инициализации RC4 приведен ниже. Этот алгоритм также  называется алгоритмом ключевого расписания (англ. Key-Scheduling Algorithm or KSA). Этот алгоритм использует ключ, сохраненный в Key, и имеющий длину L байт. Инициализация начинается с заполнения массива S, далее этот массив перемешивается путем перестановок, определяемых ключом. Так как только одно действие выполняется над S, то должно выполняться утверждение, что Sвсегда содержит все значения кодового слова.

Генератор ключевого  потока RC4 переставляет значения, хранящиеся в S, и каждый раз выбирает различное значение из S в качестве результата. В одном цикле RC4 определяется одно n-битное слово K из ключевого потока, которое в последующем суммируется с исходным текстом для получения зашифрованного текста. Эта часть алгоритма называется генератором псевдослучайной последовательности (англ. Pseudo-Random Generation Algorithmor PRGA).

Рис 2.1- Генератор ключевого потока RC4

7. Реализация алгоритма RC4.

7.1. Описание основных функций и переменных.

#include<iostream>  

#include<cstring>  

using namespace std;   

  

  

void crypt(char cipher[]);   

 

int main()  

{  

 cout<<"--------RC4---------"<<endl;  

char choose1,choose2;  

do{  

       int s[256],t[256];  

       char k[256];

       char plaintext[1024],ciphertext[1024];  

       cout<<"Enter key:";  

       cin>>k;   //считать ключ

       for(int i=0;i<256;i++)  //инициализация ключевого массива

        {  

            s[i]=i;  

            t[i]=k[i%strlen(k)];   //strlen(k)- длинна строки k

        }  

        int j=0;  

        for(int i=0;i<256;i++)   //создание ключа

        {  

            int temp;  

            j=(j+s[i]+t[i])%256;  

            temp=s[i];  

            s[i]=s[j];  

            s[j]=temp;  

        }  

        cout<<"\nEnter plaintext:"<<endl;  

        cin>>plaintext;   //считать текст, который требуется зашифровать

        int m,n,key[256],q;  

        m=n=0;  

        int i;  

        cout<<"\nciphertext:"<<endl;  

        for(i=0;i<strlen(plaintext);i++)//шифруем

        {  

             int temp;  

             m=(m+1)% 256;  

             n=(n+s[n])% 256;  

             temp=s[m];  

             s[m]=s[n];  

             s[n]=temp;  

             q=(s[m]+s[n])%256;  

             key[i]=s[q];  

             ciphertext[i]=plaintext[i]^key[i];  

             cout<<ciphertext[i];   

  

        }  

        ciphertext[i]='\0';  

        cout<<endl;  

        cout<<"\ndecrypt (y/n)";  

        cin>>choose2;  

        while(choose2=='y'||choose2=='Y')  

        {  

            crypt(ciphertext);//вызываем функцию, для дешифрования

            choose2='n';  

        }  

        cout<<endl;  

        cout<<"\nrepeat encryption?(y/n)";  

        cin>>choose1;  

}while(choose1=='y'||choose1=='Y');   

  

cout<<"\n______________________EXID_________________________"<<endl<<endl;  

system("pause");  

}   

  

 

 

   void crypt(char cipher[])  

{  

    int s[256],t[256];  

    char k[256];

    char plaintext[1024];  

    cout<<"\nEnter key:";  

    cin>>k;  

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

    {  

         s[i]=i;  

         t[i]=k[i%strlen(k)];  

    }  

    int j=0;  

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

    {  

        int temp;  

        j=(j+s[i]+t[i])%256;  

        temp=s[i];  

        s[i]=s[j];  

        s[j]=temp;  

    }   

  

   int m,n,key[256],q;  

   m=n=0;  

   int i;  

   cout<<"\ndecriptet text"<<endl;  

   for(i=0;i<strlen(cipher);i++) 

   {  

       int temp;  

       m=(m+1)% 256;  

       n=(n+s[n])% 256;  

       temp=s[m];  

       s[m]=s[n];  

       s[n]=temp;  

       q=(s[m]+s[n])%256;  

       key[i]=s[q];  

       plaintext[i]=cipher[i]^key[i];  

       cout<<plaintext[i];   

   }   

  

cout<<endl;  

7.2. Результаты  выполнения программы.

 

 


Информация о работе Курсовая работа по «Информатике»