Частина тексту файла (без зображень, графіків і формул):
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Звіт до лабораторної роботи №3
з курсу «Методи та засоби криптологічних перетворень»
ДОСЛІДЖЕННЯ ШИФРУ ГЕФФА
Виконав: студент групи ІБ-44
Перевірив:
Львів – 2010
Мета роботи - вивчити алгоритм закодування відкритого тексту шифром Геффа та навчитися розробляти програмне забезпечення для реалізації цього алгоритму на комп'ютері.
Теоретичні відомості
У генераторі Геффа потоку ключів використовуються три РЗЛЗЗ, об'єднані нелінійним чином. Два РЗЛЗЗ є входами мультиплексора, а третій РЗЛЗЗ управляє виходом мультиплексора. Якщо a1, a2 і a3 - виходи три РЗЛЗЗ, вихід генератора Геффа (Geffe) можна описати як:
Рис.1.4. Генератор Геффа
Якщо довжини РЗЛЗЗ рівні п1 , п2 і п3 відповідно, то лінійна складність генератора рівна:
Період генератора рівний найменшому загальному дільникові періодів трьох генераторів . За умови, що ступені трьох примітивних многочленів зворотного зв'язку взаємно прості, період цього генератора буде рівний добутку періодів трьох РЗЛЗЗ.
Блок-схема алгоритму
-
+
-
+
-
+
-
+
i=0,8
i++
Остаточна версія програми шифрування
#include<stdio.h>
#include<conio.h>
unsigned short int mask=0xF9;
unsigned short int register8_1=0xFF;
unsigned short int register8_2=0xA1;
unsigned short int register8_3=0x31;
unsigned short int temp_bite=0;
int fibon(unsigned short int ®ister8)
{
unsigned short int register_temp=0;
for(int i=7;i>=0;i--)
{int zsyv;
zsyv=((mask>>i)?i:9);
register_temp=register_temp ^ (register8>>zsyv);
}
register8=((register_temp & 0x01)
<<7)
|(register8>>1);
return (register8 & 0x01);
}
void main()
{
FILE *Ptr1,*Ptr2;
unsigned char bite1=0;
if ((Ptr1=fopen("c:\\qwerty\\OPTEXT.TXT", "r"))== NULL)
printf("File could't be open to read\n");
if ((Ptr2=fopen("c:\\qwerty\\CRTEXT.TXT", "w"))== NULL)
printf("File could't be open to write\n");
while(!feof(Ptr1))
{
bite1=fgetc(Ptr1);
if(bite1==255) break;
for(int i=0;i<8;i++)
{
temp_bite<<=1;
int temp;
temp=fibon(register8_1);
temp_bite|=0x01&((temp &fibon(register8_2))^
(~temp & fibon(register8_3)));
}
bite1=bite1 ^ temp_bite;
fputc((bite1),Ptr2);
}
/*fprintf(Ptr2,"qwqdwdfs");*/
fclose(Ptr1);
fclose(Ptr2);
printf("done\n");
getch();
}
Остаточна версія програми розшифрування
#include<stdio.h>
#include<conio.h>
unsigned short int mask=0xF9;
unsigned short int register8_1=0xFF;
unsigned short int register8_2=0xA1;
unsigned short int register8_3=0x31;
unsigned short int temp_bite=0;
int fibon(unsigned short int ®ister8)
{
unsigned short int register_temp=0;
for(int i=7;i>=0;i--)
{int zsyv;
zsyv=((mask>>i)?i:9);
register_temp=register_temp ^ (register8>>zsyv);
}
register8=((register_temp & 0x01)
<<7)
|(register8>>1);
return (register8 & 0x01);
}
void main()
{
//
FILE *Ptr1,*Ptr2;
unsigned char bite1=0;
if ((Ptr1=fopen("c:\\qwerty\\CRTEXT.TXT", "r"))== NULL)
printf("File could't be open to read\n");
if ((Ptr2=fopen("c:\\qwerty\\DECRTEXT.TXT", "w"))== NULL)
printf("File could't be open to write\n");
while(!feof(Ptr1))
{
bite1=fgetc(Ptr1);
if(bite1==255) break;
for(int i=0;i<8;i++)
{
temp_bite<<=1;
int temp;
temp=fibon(register8_1);
temp_bite|=0x01&((temp &fibon(register8_2))^
(~temp & fibon(register8_3)));
}
bite1=bite1 ^ temp_bite;
fputc((bite1),Ptr2);
}
fclose(Ptr1);
fclose(Ptr2);
printf("done\n");
getch();
}
Результати виконання програми
Висновок: Цей генератор криптографічно слабкий і може бути взламаний за домогою кореляційного розкриття. У 75 відсотках часу вихід генератора рівний виходу РЗЛЗЗ-2. Тому, якщо відомі послідовності відводів зворотного зв'язку, можна визначити про початкове значення РЗЛЗЗ-2 і згенерувати вихідну послідовність цього регістру. Тоді можна підрахувати, скільки разів вихід РЗЛЗЗ співпадає з виходом генератора.