Частина тексту файла (без зображень, графіків і формул):
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Звіт до лабораторної роботи №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 і згенерувати вихідну послідовність цього регістру. Тоді можна підрахувати, скільки разів вихід РЗЛЗЗ співпадає з виходом генератора.
Ви не можете залишити коментар. Для цього, будь ласка, увійдіть
або зареєструйтесь.
Ділись своїми роботами та отримуй миттєві бонуси!
Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!