Статистика
Главная » Статьи » Лабораторные работы » C/C++

Реализовать программное средство, осуществляющее шифрование и дешифрование текстового файла по алгоритму Вижинера.

Цель работы.

Реализовать  программное  средство,  осуществляющее  шифрование  и  дешифрование текстового файла по алгоритму Вижинера. Реализовать  программное  средство,  осуществляющее  криптоанализ  зашифрованного по методу Виженера текста. Провести аналитическую работу.        

Постановка задачи.

  1. Запрограммировать шифратор и дешифратор по Виженеру.
  2. Реализовать алгоритм криптоанализа по методу Касиски
  3. Провести анализ зависимости успешного взлома от длины текста
  4. Провести анализ зависимости успешного взлома от длины ключа                  

Ход работы.

 

  1. Программа - шифратор, реализованная по алгоритму Виженера. Шифруемое сообщение и ключ содержат заглавные буквы русского алфавита.
  2. Программа - дешифратор, реализованная по алгоритму Виженера.

Зашифрованное сообщение и ключ содержат заглавные буквы русского алфавита.

  1. Программа, реализованная по алгоритму Касиски:

на вход подаётся файл с зашифрованным сообщением, далее в цикле оно обрабатывается и ищется вхождение в данном сообщении определённых l-грамм (в нашем случае состоящих из трёх букв). Дистанцию между одинаковыми l-граммами записываем в массив. Далее в цикле обрабатываем этот массив: находим НОД среди каждой пары дистанций и используем их в качестве индексов для массива, элементы которого будут являться счётчиками, которые в последующем мы будем анализировать для нахождения наиболее вероятной длины ключа.

 

Листинг программы 1а.

 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

int main(int argc, char *argv[])

{

  FILE *f1=fopen("in.txt", "r");

  FILE *f2=fopen("out.txt", "w");

 

  char symbol,code;

  char key[]="";

  int i=0;

 

  printf("Key : ");

  gets(key);

 

  while(!feof(f1))

  {

              symbol=fgetc(f1);

             

              if (symbol!='я')

                          if (symbol=='\n')

                          {

                                      if(i>=strlen(key)-1){i=0;}else{i++;}

                                      fputc(symbol, f2);

                          } else

                          if (symbol!=' ')

                          {

                                      code=(symbol+key[i]-2*65)%26+65;

                                      fputc(code, f2);

                                      if(i>=strlen(key)-1)

                                      {i=0;}else{i++;}

                          }

                          else{if(i>=strlen(key)-1){i=0;}else{i++;}

                                      fputc(symbol, f2);}

  }

  fclose(f1);

  fclose(f2);

return 0;

}

 

Листинг программы 1b.

 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

int main(int argc, char *argv[])

{

            FILE *f1=fopen("in.txt", "r");

            FILE *f2=fopen("out.txt", "w");

 

            char symbol,code;

            char key[]="";

            int i=0;

 

            printf("Key : ");

            gets(key);

 

            while(!feof(f1))

            {

                        symbol=fgetc(f1);

                       

                        if (symbol!='я')

                                   if (symbol=='\n')

                                               {

                                                           if(i>=strlen(key)-1){i=0;}else{i++;}

                                                           fputc(symbol, f2);

                                               } else

                                   if (symbol!=' ')

                                   {

                                               code=(symbol-key[i]+26)%26+65;

                                               fputc(code, f2);

                                               if(i>=strlen(key)-1){i=0;}else{i++;}

                                    }

                                   else

                                   {

                                               if(i>=strlen(key)-1){i=0;}else{i++;}

                                               fputc(symbol, f2);

                                   }

            }

            fclose(f1);

            fclose(f2);

return 0;

}

 

Листинг программы 2.

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

int distance[200];

int nod[1000];

int del(int x,int y)

{

int i;

for (i=x;i>1;--i)

if ((x%i==0)&&(y%i==0)) return i;

 

return 0;

}

int main()

            char text[10000], l1[4], l2[4];

            int i, j, m, key=0, k=0;

            FILE *f;

            f=fopen("in.txt","r");

            fgets(text,10000,f);

            for (i=0;i<strlen(text)-2;++i)

            {

                        l1[0]=text[i];

                        l1[1]=text[i+1];

                        l1[2]=text[i+2];

                        l1[3]='\0';

                        for (j=i+1;j<strlen(text)-2;++j)

                        {

                                   l2[0]=text[j];

                                   l2[1]=text[j+1];

                                   l2[2]=text[j+2];

                                   l2[3]='\0';

                                   if (!strcmp(l1,l2)){     

                                   distance[k]=j-i; k++;

                                   printf("%s ", l1); }

                        }

                       

            }

            for (i=0;i<k;++i)

                        for (j=i+1;j<k;++j)

                        {

                        m = del(distance[i], distance[j]);

                                   nod[m]++;

                        }

           

            for (i=2;i<500;++i)

                        if (nod[key]<nod[i]) key=i;

                       

            printf("Key length = %d\n",key);

            return 0;

}

Категория: C/C++ | Добавил: admin (27.01.2015)
Просмотров: 2649 | Рейтинг: 0.0/0
Всего комментариев: 0
Вход на сайт