Міністерство освіти і науки України
Національний університет Львівська політехніка
Звіт
до лабораторної роботи № 1
на тему: “Афінні шифри”
Виконав
Ст. групи ІБ - 44
Перевірив
Львів — 2010
Мета роботи: навчитися за допомогою афінного шифру 2-ого порядку перетворювати відкритий текст в криптотекст і навпаки. Написати програму реалізацїї даного методу шифрування та розшифрування на мові програмування С.
Теоретичні відомості
Список використаних функцій, констант та змінних.
alpha[] – масив в якому знаходяться букви латинського алфавіту;
source[] – масив в який заноситься повідомлення;
key[] – масив в який заноситься ключ;
eresult[] та dresult[] – в ці масиви заносяться результати зашифрування та розшифрування у вигляді букв;
digital_text[] та digital_key[] – масиви в які записується числова інтерпретація відкритого тексту та ключа, відповідно;
A[], S[] – масиви в які записуються ключі в числовій інтерпретації;
Ax[], Sx[] – масиви в які записуються ключі для розшифрування криптотексту;
digital_eresult[] та digital_dresult[] – масиви в яких зберігаються результати зашифрування та розшифрування у вигляді їх індексів у відповідних алфавітах;
i, j – змінні що використовуються в лічильниках циклів;
tlen, klen – довжина повідомлення та довжина ключа відповідно;
alen – довжина алфавіту;
dlen – кількість стовпців в матриці, в яку записаний текст повідомлення;
strlen() – визначення довжини рядка, який може бути заданий напряму або в масиві;
Блок-схема програми
Код програми
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
void main()
{
char alfavit[]="abcdefghijklmnopqrstuvwxyz";
char slovo[2][10]={"oxk",
"ykb" };
char kod[2][10];
char a1,a2,a3,a4;
int k1,a11,a22,a33,a44,b1,b2,x1,s1,s2,x2,m,z1,z2,w,i,k,j;
a1='b';a2='d';a3='d';a4='e';s1='b';s2='b';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(i=0;i<=25;i++)
{if (s1==alfavit[i])
s1=i;}
for(i=0;i<=25;i++)
{if (s2==alfavit[i])
s2=i;}
for(j=0;slovo[0][j]>0;j++)
{ k1=j;} k1=k1+1;
for(j=0;j<k1;j++)
{b1=slovo[0][j];b2=slovo[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;}
b1=b1-s1;
if (b1<0)
{i=1;while (b1<0)
b1=b1+i*m;i++; }
else
b1=b1%m;
b2=b2-s2;
if (b2<0)
{i=1;while (b2<0)
b2=b2+i*m;i++; }
else
b2=b2%m;
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;kod[0][j]=z1;
z2=(a33*b1+a44*b2)%m;kod[1][j]=z2; }
for(j=0;j<k1;j++)
{
for(i=0;i<=25;i++)
{if (kod[0][j]==i)
kod[0][j]=alfavit[i];}
printf("\nvidpovid1:");
printf("%c",kod[0][j]);
for(i=0;i<=25;i++)
{if (kod[1][j]==i)
kod[1][j]=alfavit[i];}
printf("\nvidpovid2:");
printf("%c",kod[1][j]);}
getch();
}
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
void main()
{ clrscr();
char alfavit[]="abcdefghijklmnopqrstuvwxyz";
char slovo[2][10]={"tty",
"ybv" };
char kod[2][10];
char a1,a2,a3,a4,b1,b2,s1,s2,z1,z2;
int j,i,x1,x2,m,k;
a1='b';a2='d';a3='d';a4='e';s1='b';s2='b';m=26;
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(i=0;i<=25;i++)
{if (s1==alfavit[i])
s1=i;}
for(i=0;i<=25;i++)
{if (s2==alfavit[i])
s2=i;}
for(j=0;slovo[0][j]>0;j++)
{ k=j;} k=k+1;
for(j=0;j<k;j++)
{b1=slovo[0][j];b2=slovo[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=(a1*b1+a2*b2)+s1;
x2=(a3*b1+a4*b2)+s2;
z1=x1%m; kod[0][j]=z1;
z2=x2%m; kod[1][j]=z2; }
for(j=0;j<k;j++)
{
for(i=0;i<=25;i++)
{if (kod[0][j]==i)
kod[0][j]=alfavit[i];}
printf("\nvidpovid1:");
printf("%c",kod[0][j]);
for(i=0;i<=25;i++)
{if (kod[1][j]==i)
kod[1][j]=alfavit[i];}
printf("\nvidpovid2:");
printf("%c",kod[1][j]);}
getch();
}
Висновок
В даній лабораторній роботі я вивчив і реалізував алгоритм кодування та розкодування афінним шифром 2-ого порядку. Нескладно зауважити, що афінний шифр не стійкий до атаки з вибором відкритого тексту. Суперникові достатньо довідатись, в які криптотексти переходять відповідні к-грами за вибраним вектором, що дозволяю повністю визначити ключ.