Вы находитесь на странице: 1из 11

Лабораторна робота №1

Традиційні шифри з симетричним ключем

Матричний шифр перестановки

Исходный текст и зашифрованный текст — матрица , представляющая числовые


значения символов; ключи — квадратные матрицы размера . В матрице
перестановки каждая строка и каждый столбец имеют строго одну единицу (1), и
остальная часть значений — нули (0). Шифрование выполняется умножением матрицы
исходного текста на ключевую матрицу, чтобы получить матрицу зашифрованного текста;
дешифрование выполняется умножением зашифрованного текста на инверсию ключевой
матрицы, после чего получаем исходный текст.

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

Умножение матрицы исходного текста на ключевую матрицу шифрования дает


матрицу зашифрованного текста . Матричная манипуляция требует изменения
символов в примере 4.27 к их числовым значениям (от 00 до 25). Обратите внимание, что
матричное умножение обеспечивает только перестановку столбцов; чтение и запись в
матрицу должны быть обеспечены остальной частью алгоритма.

Статистическая атака

Шифр перестановки не изменяет частоту букв в зашифрованном тексте; он только


переставляет буквы. Так что первая атака, которая может быть применена, - анализ
частоты отдельной буквы. Этот метод может быть полезен, если длина зашифрованного
текста достаточно большая. Мы такую атаку рассматривали раньше. Однако шифры
перестановки не сохраняют частоту пар и триграмм. Это означает, что Ева не может
использовать такие инструментальные средства. Фактически, если шифр не сохраняет
частоту пар и триграмм, но сохраняет частоту отдельных букв, то вероятнее всего, что это
шифр перестановки.

Атака грубой силы

Чтобы расшифровать сообщение, может попробовать все возможные ключи. Однако число
ключей может быть огромно 1! + 2! + 3! + … + L!, где L — длина зашифрованного
текста. Лучший подход состоит в том, чтобы попробовать отгадать число столбцов. Ева
знает, что L делится на число столбцов. Например, если длина шифра — 20 символов, то
. Это означает, что числом столбцов может быть один из
коэффициентов (1, 2, 4, 5, 10, 20). Однако только один столбец и только одна строка
— маловероятные варианты.
Атака по образцу

Другая атака шифра перестановки может быть названа атакой по образцу.


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

1 -й символ в зашифрованном тексте получается из 3 -го символа исходного текста. 2-й


символ в зашифрованном тексте получается из 8-го символа исходного текста. 20-й
символ в зашифрованном тексте получается из 17-го символа исходного текста, и так
далее. У нас имеются образцы в вышеупомянутом списке. Мы имеем пять групп: (3, 8,
13, 18), (1, 6, 11, 16), (4, 9, 14, 19), (5, 10, 15, 20) и (2, 7, 12, 17). Во всех
группах разность между двумя смежными номерами — 5. Эта регулярность может
использоваться криптоаналитиком, чтобы взломать шифр. Если Ева знает или может
предположить число столбцов (в этом случае оно равняется 5), она может преобразовать
зашифрованный текст в группы по четыре символа. Перестановка групп может обеспечить
ключ к нахождению исходного текста.

Лістинг програми

#include<iostream>

#include<cstdio>

#include<conio.h>

#include<math.h>

#include<string.h>

using namespace std;

int main()

int z,fl=1;

while(fl)

printf("\n1-Shyfrovka \n2-Rozshyfrovka \n3-Exit


\n\nVveditRezhym:");

scanf("%d",&z);

switch(z)

case 1:

int i=0,j=0,count=0,c;
char l,sim[100];

FILE *f1, *f2, *f3;

if
((f1=fopen("E:\\Study\\Krypto\\Message.txt","r"))==NULL)

printf("Error! Cannot open file");

system("pause");

return 0;

while(i < sizeof( sim ) && fscanf(f1,"%c",&l) == 1 )

sim[i]=l;

//printf("%c", sim[i]);

i++;

count++;

c=count;

printf("\n Text dla shufruvana:\n\n");

for(count=0;count<c;count++)

printf("%c",sim[count]);

printf("\n");

fclose(f1);

//printf("\n Text y vugljadi chisel \n");

for(count=0;count<c;count++)

if(sim[count]=='a'){sim[count]=1;}

if(sim[count]=='b'){sim[count]=2;}
if(sim[count]=='c'){sim[count]=3;}

if(sim[count]=='d'){sim[count]=4;}

if(sim[count]=='e'){sim[count]=5;}

if(sim[count]=='f'){sim[count]=6;}

if(sim[count]=='g'){sim[count]=7;}

if(sim[count]=='h'){sim[count]=8;}

if(sim[count]=='i'){sim[count]=9;}

if(sim[count]=='j'){sim[count]=10;}

if(sim[count]=='k'){sim[count]=11;}

if(sim[count]=='l'){sim[count]=12;}

if(sim[count]=='m'){sim[count]=13;}

if(sim[count]=='n'){sim[count]=14;}

if(sim[count]=='o'){sim[count]=15;}

if(sim[count]=='p'){sim[count]=16;}

if(sim[count]=='q'){sim[count]=17;}

if(sim[count]=='r'){sim[count]=18;}

if(sim[count]=='s'){sim[count]=19;}

if(sim[count]=='t'){sim[count]=20;}

if(sim[count]=='u'){sim[count]=21;}

if(sim[count]=='v'){sim[count]=22;}

if(sim[count]=='w'){sim[count]=23;}

if(sim[count]=='x'){sim[count]=24;}

if(sim[count]=='y'){sim[count]=25;}

if(sim[count]=='z'){sim[count]=26;}

if(sim[count]==' '){sim[count]=27;}

//printf("%3d",sim[count]);

printf("\n Kilkst sumvoliv : %d\n",count);

int n,a[50][50],shifr[50][50],key[50][50];

float m,e;

printf(" Vedit vvedit kilkist stovpciv n=");


scanf("%d",&n);

e = (float)count/ (float)n;

m = ceil(e);

printf("\n");

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

printf("\n");

for(j=0;j<n;j++)

count=n*i+j;

if(count < c) a[i][j]=sim[count];

else a[i][j] = 27;

printf (" %d",a[i][j],",");

char ch;

printf("\n Vykorystaty isnuuchyi klych?(y/n)");

cin >> ch;

if(ch == 'y' || ch =='Y')

f3=fopen("E:\\Study\\Krypto\\Key.txt","r");

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

for(j = 0; j < n; j++)

fscanf(f3,"%d",&key[i][j]);

fclose(f3);

}
else

printf("\n\n\n Vvedit matricu kluchiv %d na %d",n,n);

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

printf("\n");

for(j=0;j<n;j++)

printf(" key[%d][%d]=",i,j);

scanf("%d",&key[i][j]);

f3 = fopen("E:\\Study\\Krypto\\Key.txt", "w");

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

for(j = 0; j < n; j++)

fprintf(f3,"%d ", key[i][j]);

fclose(f3);

int p=0;

printf("\n");

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

for(j=0;j<n;j++)

shifr[i][j]=0;

for(p=0;p<n;p++)
{

shifr[i][j]+=a[i][p]*key[p][j];

printf("\n\n Shifr:\n");

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

printf("\n");

for(j=0;j<n;j++)

printf("%12d",shifr[i][j]);

f2=fopen("E:\\Study\\Krypto\\SHIFR.txt","w");

fprintf(f2,"%d ",(int)m);

fprintf(f2,"%d ",n);

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

for(j=0;j<n;j++)

fprintf(f2,"%d ",shifr[i][j]);

fclose(f2);

printf("\n");

system("pause");

break;

//-------------------------------------
Deshifrowka--------------------------------------------------------

case 2:
{

FILE *f1, *f2;

int p,i,j,count=0,c=0,l,n,m,ms[50][50],dshifr[50][50],
sim[50], key[50][50];

printf("\nRezhym deshifrovky. Schytka zashyfrovanogo povidomlennya:\n");

f1=fopen("E:\\Study\\Krypto\\SHIFR.txt","r");

while(c < sizeof( sim ) && fscanf(f1,"%d",&m) != EOF )

sim[c]=m;

printf("%d ", sim[c]);

c++;

count++;

fclose(f1);

m = sim[0];

n = sim[1];

f2=fopen("E:\\Study\\Krypto\\Key.txt","r");

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

for(j = 0; j < n; j++)

fscanf(f2,"%d",&key[j][i]);

fclose(f2);

p = 1;

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

for(j = 0; j < n; j++)


{

ms[i][j] = sim[p+1];

p++;

p=0;

printf("\n");

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

for(j=0;j<n;j++)

dshifr[i][j]=0;

for(p=0;p<n;p++)

dshifr[i][j]+=ms[i][p]*key[p][j];

printf("\nDeshifrovka zavershena \nMessage:\n");

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

for(j = 0; j < n; j++)

if(dshifr[i][j] == 1){printf("a");}

if(dshifr[i][j] == 2){printf("b");}

if(dshifr[i][j] == 3){printf("c");}

if(dshifr[i][j] == 4){printf("d");}

if(dshifr[i][j] == 5){printf("e");}

if(dshifr[i][j] == 6){printf("f");}

if(dshifr[i][j] == 7){printf("g");}

if(dshifr[i][j] == 8){printf("h");}

if(dshifr[i][j] == 9){printf("i");}
if(dshifr[i][j] == 10){printf("j");}

if(dshifr[i][j] ==11){printf("k");}

if(dshifr[i][j] == 12){printf("l");}

if(dshifr[i][j]==13){printf("m");}

if(dshifr[i][j]== 14){printf("n");}

if(dshifr[i][j]== 15){printf("o");}

if(dshifr[i][j] == 16){printf("p");}

if(dshifr[i][j] == 17){printf("q");}

if(dshifr[i][j] == 18){printf("r");}

if(dshifr[i][j] == 19){printf("s");}

if(dshifr[i][j] == 20){printf("t");}

if(dshifr[i][j] == 21){printf("u");}

if(dshifr[i][j] == 22){printf("v");}

if(dshifr[i][j] == 23){printf("w");}

if(dshifr[i][j] == 24){printf("x");}

if(dshifr[i][j] == 25){printf("y");}

if(dshifr[i][j] == 26){printf("z");}

if(dshifr[i][j] == 27){printf(" ");}

printf("\n");

system("pause");

break;

case 3:

fl = 0;

break;

default:

fl = 0;
break;

return 0;

Вам также может понравиться