МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Звіт до лабораторної роботи №2
з курсу «Методи та засоби криптологічних перетворень»
ДОСЛІДЖЕННЯ АФІННИХ ШИФРІВ
Виконав: студент групи ІБ-44
Перевірив:
Львів – 2010
Мета роботи - вивчити алгоритм закодування відкритого тексту афінним шифром та навчитися розробляти програмне забезпечення для реалізації цього алгоритму на комп'ютері.
Теоретичні відомості
1. Шифри простої заміни.
n-символьний алфавіт утотожнюємо з кільцем Zn. А саме, кожна буква замінюється своїм номером у алфавіті, прийому нумерація починається з нуля.
Наприклад, латинська абетка утотожнюється із Z26, а українська із Z33. Літера а української абетки трактується як 0, літера б як 1, в як 2 і т.д. Тепер до букв відкритого тексту ми можемо вільно застосовувати операції додавання та множення за відповідним модулем.
Шифр зсуву.
Ключ: s таке, що 0 < s < п.
Шифрування. У повідомленні кожна буква х заміщується буквою Е(х) = (х + s) mod n.
Дешифрування. У криптотексті кожна буква х' заміщується буквою D(x') = (х' + s') mod п, де s' = п - s. Величину зворотнього зсуву s' будемо називати дешифруючим ключем.
Лінійний шифр.
Ключ: а таке, що 0 < а < п і НСД (а, п) = 1.
Шифрування. У повідомленні кожна буква х заміщується буквою Е{х) = (ах) mod n.
Дешифрування. У криптотексті кожна буква х' заміщується буквою D(x') = (a'x') mod п, де а' — a-1 mod n — дешифруючий ключ.
Узагальненням і шифру зсуву, і лінійного шифру є Афінний шифр.
Ключ: a, s такі, що 0 < s < п, 0 < а <п і НСД (а, п) = 1.
Шифрування. У повідомленні кожна буква х заміщується буквою Е(х) = (ах + s) mod n.
Дешифрування. У криптотексті кожна буква х' заміщується буквою D(x') = (a'x'+ s’) mod n, де пара а’ – a-1 mod n, s’= (—a’s) mod n є дешифруючим ключем.
Як і кожен шифр простої заміни, афінний шифр піддається частотному аналізові.
2. Афінні шифри вищих порядків.
Подумаємо, як можна розширити монограмні шифри попереднього пункту так, щоб вони оперували з k-грамами для довільного k > 1. Спочатку введемо операцію додавання в Znk. Сумою векторів X=(x1,. . .,хk) і s=(s1,… ,sk) з Znk є вектор X + S = ((x1 + s1) mod n,…, (хk + sk) mod n). Zkn з операцією додавання є групою. Вектор —S = (n — s1,…, n — sk) є оберненим до вектора S — (s1,…,sk).
Шифр зсуву k-го порядку.
Ключ: S є Zkn.
Шифрування. Повідомлення розбивається на k-грами. Кожна k-грама X заміщується k-грамою Е(Х) = X + S.
Дешифрування. Кожна k-грама X' криптотексту заміщується k-грамою D(X') = X' + 5’, де S' = —S є дешифруючим ключем.
Лінійний шифр k-го порядку.
Ключ: А Є GLk(Zn).
Шифрування. Повідомлення розбивається на k-грами. Кожна k-грама X заміщується k-грамою Е(Х)= АХ.
Дешифрування. Кожна k-грама Х’ криптотексту заміщується к-грамою D(X') = A'X', де А’ = А-1 — дешифруючий ключ.
Афінний шифр k-го порядку.
Ключ: А Є GLk{Zn} і S Є Znk.
Шифрування. Повідомлення розбивається на k-грами. Кожна k-грама X заміщується k-грамою Е(Х) = АХ + S.
Дешифрування. Кожна k-грама X' криптотексту заміщується k-грамою D{X’} = А’X’ + S’, де А’ = А-1 і S’ = -A’S — дешифруючий ключ.
Приклад: Зашифрувати лінійним шифром другого порядку біг раму
Остаточна версія програми зашифрування
#include<stdio.h>
#define n 3
char A_asciicode[26] = {'a','b','c','d','e','f','g','h','i','j','k','l',
'm','n','o','p','q','r','s','t','u','v','w','x','y','z' };
int matrix[n][n] = { 9, 1, 3, 11,1,4, 14,5,1 } ;
int main()
{
FILE *IN, *OUT;
int jik;
int text[n][n],nnn[n][n];
int i,j,z,s,ch,k,q;
IN=fopen("C:\\str\\d2.txt","r");
OUT=fopen("C:\\str\\vd.txt","w+");
i=0;
j=0;
while(1)
{
ch=fgetc(IN);
if(feof(IN)) break;
k=0;
//system("pause");
while(ch!=A_asciicode[k])
{
k++;
printf("k=%i",k) ;
}
printf("%i\n",i) ;
if(i>2)
{
j++;
i=0;
}
text[i++][j]=k;
}
for(z=0;z<n;z++)
for(i=0;i<n;i++)
{
s=0;
for(j=0;j<n;j++)
{
q=matrix[i][j]*text[j][z];
s+=q;
}
nnn[i][z]=s;
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
fprintf(OUT, "%c", A_asciicode[nnn[j][i]%26]);
return 0;
}
Остаточна версія програми зашифрування
#include<stdio.h>
#define n 3
char A_asciicode[26] = {'a','b','c','d','e','f','g','h','i','j','k','l',
'm','n','o','p','q','r','s','t','u','v','w','x','y','z' };
int matrix[n][n] = { 1,2,15,25,25,7,17,3,22} ;
int main()
{
FILE *IN, *OUT;
int ch,k;
int text[n][n],nnn[n][n];
int i=0,j=0,q,s,z;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
text[i][j]=-1;
}
IN=fopen("C:\\str\\vd.txt","r");
OUT=fopen("C:\\str\\droz.txt","w+");
i=0;
j=0;
while(1)
{
ch=fgetc(IN);
if(feof(IN)) break;
k=0;
while(ch!=A_asciicode[k])
k++;
if(i>2)
{
j++;
i=0;
}
text[i++][j]=k;
}
for(z=0;z<n;z++)
for(i=0;i<n;i++)
{
s=0;
for(j=0;j<n;j++)
{
q=matrix[i][j]*text[j][z];
s+=q;
}
nnn[i][z]=s;
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
fprintf(OUT, "%c", A_asciicode[nnn[j][i]%26]);
return 0;
}
Результати виконання програми
Висновок: ми дослідили шифр простої заміни-лінійний шифр зсуву і реалізувала його програмно. Я побачила, що цей шифр є вразливим до атаки з відомим відкритим текстом. Якщо суперник знає, що шифруючи відображення E(X)=AX