МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Кафедра ЗІ
Лабороторна робота №2
з курсу «Методи і засоби криптологічних перетворень»
на тему: «Афінні шифри. Лінійний шифр 2-го порядку»
Мета роботи: ознайомитися з афінними шифрами (шифр зсуву, лінійний шифр, афінний шифр 1-го і вищих порядків).
Завдання:
Написати програму шифрування та розшифрування на мові програмування С/С++ для реалізації лінійного шифру 2-го порядку.
Короткі теоретичні відомості
Позначимо через Mk(Zn) множину матриць розміру k×k з коефіцієнтом з кільця Zn. Через Gl(Zn) позначимо підмножину оборотніх матриць.
Для деякої матриці А Gl(Zn) обернену до неї матрицю позначимо .
Добутком А*Х матриці А={}, А Mk(Zn), на вектор-стовпчик Х є вектор-стовпчик * =
Ключ: А Glk(Zn), НСД (w, n)=1, де w – визначник матриці.
Зашифрування: відкритий текст розбивається на k-грами, кожна k-грама Х зашифровується k-грамою У, при чому У=(А*Х)mod n.
Розшифрування: У→Х, Х=А’*У, А’= - ключ розшифрування.
Розглянемо це детальніше на прикладі:
k=2, тобто біграмний лінійний шифр. Нехай необхідно зашифрувати біг раму кл з ключем А=. Біграмі кл в українській мові відповідають числа 14 15. Отже за шифрування здійснюється так: * = = . В результаті за шифрування ми отримали біг раму іг. Матриця А – оборотна, тому що
НСД (w, n)=(31,33)=1. Процес розшифрування здійснюється наступним чином. Потрібно знайти ключ дешифрування =,
де – обернений елемент, який знайдемо за алгоритмом Евкліда:
33=1*31+2
31=15*2+1
2=2*1+0
1=1*31+(-15)*2=1*31+(-15)*(33-1*31)=-15*33++16*31
16*31≡1(mod 33)
=16 – обернений елемент
Отже, = =
*= =
В результаті розшифрування біграми іг ми отримали початкову біграму кл.
Текст програми шифрування
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
void main()
{ clrscr();
char alfavit[]="abcdefghijklmnopqrstuvwxyz";
char opentext[2][15]={"sgdiakaovttoc",
"oonysrvsiysne" };
char shyfr[2][15];
char a1,a2,a3,a4,b1,b2;
int a11,a22,a33,a44,x1,x2,m,z1,z2,k,j,i;
a1='b';a2='d';a3='d';a4='e';m=26;
for(i=0;i<=25;i++)
{if (a1==alfavit[i])
a11=i;}
for(i=0;i<=25;i++)
{if (a2==alfavit[i])
a22=i;}
for(i=0;i<=25;i++)
{if (a3==alfavit[i])
a33=i;}
for(i=0;i<=25;i++)
{if (a4==alfavit[i])
a44=i;}
for(j=0;opentext[0][j]>0;j++)
{ k=j;} k=k+1;
for(j=0;j<k;j++)
{b1=opentext[0][j];
b2=opentext[1][j];
for(i=0;i<=25;i++)
{if (b1==alfavit[i])
b1=i;}
for(i=0;i<=25;i++)
{if (b2==alfavit[i])
b2=i;}
x1=0;x2=0;z1=0;z2=0;
x1=a11*b1+a22*b2;
x2=a33*b1+a44*b2;
z1=x1%m; shyfr[0][j]=z1;
z2=x2%m; shyfr[1][j]=z2; }
for(j=0;j<k;j++)
{
for(i=0;i<=25;i++)
{if (shyfr[0][j]==i)
shyfr[0][j]=alfavit[i];}
printf(«%c»,shyfr[0][j]);
for(i=0;i<=25;i++)
{if (shyfr[1][j]==i)
shyfr[1][j]=alfavit[i];}
printf(«%c»,shyfr[1][j]);}
getch();
}
Результат виконання програми
Блок-схема алгоритму програми шифрування
-
+
-
+
-
+
-
+
-
+
-
+
-
+
Текст програми розшифрування
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
void main()
{
clrscr();
char alfavit[]="abcdefghijklmnopqrstuvwxyz";
char shyfr[2][15]={"iwqccjlqtnvbo",
"gwjquugkrxzqw" };
char rozshyfr[2][15];
char a1,a2,a3,a4;
int k1,a11,a22,a33,a44,b1,b2,x1,x2,m,z1,z2,w,i,k,j;
a1='b';a2='d';a3='d';a4='e';m=26;
k=0;a11=0;a22=0;a33=0;a44=0; z1=0;z2=0;
for(i=0;i<=25;i++)
{if (a1==alfavit[i])
a1=i;}
for(i=0;i<=25;i++)
{if (a2==alfavit[i])
a2=i;}
for(i=0;i<=25;i++)
{if (a3==alfavit[i])
a3=i;}
for(i=0;i<=25;i++)
{if (a4==alfavit[i])
a4=i;}
for(j=0;shyfr[0][j]>0;j++)
{ k1=j;} k1=k1+1;
for(j=0;j<k1;j++)
{b1=shyfr[0][j];b2=shyfr[1][j];
for(i=0;i<=25;i++)
{if (b1==alfavit[i])
b1=i;}
for(i=0;i<=25;i++)
{if (b2==alfavit[i])
b2=i;}
w=a1*a4-a2*a3;
if (w<0)
{i=1;while (w<0)
w=w+i*m;i++; }
else
w=w%m;
for(i=0;i<=m;i++)
{ if (1==w*i%m)
{k=i;break;} else k=0;}
a11=(a4*k)%m;
a22=-(a2*k);{ i=1;
while (a22<=0)
a22=a22+i*m;i++;}
a33=-(a3*k); { i=1;
while (a33<=0)
a33=a33+i*m;i++;}
a44=(a1*k)%m;
z1=(a11*b1+a22*b2)%m;rozshyfr[0][j]=z1;
z2=(a33*b1+a44*b2)%m;rozshyfr[1][j]=z2; }
for(j=0;j<k1;j++)
{
for(i=0;i<=25;i++)
{if (rozshyfr[0][j]==i)
rozshyfr [0][j]=alfavit[i];}
printf("%c",rozshyfr[0][j]);
for(i=0;i<=25;i++)
{if (rozshyfr[1][j]==i)
rozshyfr[1][j]=alfavit[i];}
printf("%c",rozshyfr[1][j]);}
getch();
}
Результат виконання програми розшифрування
Блок-схема алгоритму програми розшифрування
-
+
-
+
-
+
-
+
-
+
-
+
м
-
+
-
+
-
+
+
+
-
+
-
+
Висновки: у даній лабораторній роботі я реалізувала програми шифрування і розшифрування повідомлення за допомогою лінійного шифру 2-го порядку. Лінійний шифр є вразливим до атаки з відомим відкритим текстом, до атаки лише за крипто текстом цей шифр є стійкішим, тому що є великим простір ключів. Чим вищий порядок шифру тим більший час криптування і декриптування.