Цель работы.
Реализовать программное средство, осуществляющее шифрование и дешифрование текстового файла по алгоритму Вижинера. Реализовать программное средство, осуществляющее криптоанализ зашифрованного по методу Виженера текста. Провести аналитическую работу.
Постановка задачи.
- Запрограммировать шифратор и дешифратор по Виженеру.
- Реализовать алгоритм криптоанализа по методу Касиски
- Провести анализ зависимости успешного взлома от длины текста
- Провести анализ зависимости успешного взлома от длины ключа
Ход работы.
- Программа - шифратор, реализованная по алгоритму Виженера. Шифруемое сообщение и ключ содержат заглавные буквы русского алфавита.
- Программа - дешифратор, реализованная по алгоритму Виженера.
Зашифрованное сообщение и ключ содержат заглавные буквы русского алфавита.
- Программа, реализованная по алгоритму Касиски:
на вход подаётся файл с зашифрованным сообщением, далее в цикле оно обрабатывается и ищется вхождение в данном сообщении определённых 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;
}
|