Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра електронних
обчислювальних машин
Звіт
про виконання лабораторної роботи № 2
з курсу „ Захист інформації в комп’ютерних системах ”
Тема:
Шифр Цезаря.
Пошук ключа для зашифрованого файлу.
Виконав:
ст. гр. КІ-4
Львів – 2005
Мета роботи: Створити програму, яка б шукала ключ до зашифрованого файлу, та розшифровувала його, відомо, що файл зашифровано алгоритмом Цезаря, не використовуючи прямий перебір.
Виконання роботи:
Для пошуку ключа алгоритмом шифрування Цезаря було використано найпростішу реалізацію методу частотного аналізу. Метод частотного аналізу полягає в аналізі частоти входження символів у відкритому тексті. Отже я шукав символ, що зустрічається у зашифрованому тексті найчастіше, і при виборі ключа вважав, що це пробіл.
Варіант 12.
Текст програми:
#include "stdafx.h"
#include "stdlib.h"
#include "ctype.h"
#include "io.h"
#define THE_CHAR ' '
FILE * in, * out;
void error(int);
int findkey(); // функція пошуку ключа для даного зашифрованого файлу
void decrypt(int);// функція дешифрування файлу (відновлення оригінального тексту)
int main(int argc, char* argv[])
{
unsigned char key=3;
if (argc!=3) error(1);
if ( ((in = fopen(argv[1],"r"))!= NULL) && ((out = fopen(argv[2],"w"))!= NULL) ){
printf("Program: %s;\n input file: %s;\n output file: %s.\n",argv[0],argv[1],argv[2]);
}
else error(2);
key=findkey();
rewind(in);
decrypt(key);
fclose(in); fclose(out);
printf("\nEncrypted file has been decypted. Key was %d.\n",key);
return 0;
}
void error(int e)
{
if (e==1)
printf("Wrong parameters!\nSYNTAX: 2_decrypt <input file> <output file> \n");
else printf("File I/O error!\n");
exit(1);
}
/*** Функція пошуку ключа ***/
int findkey()
{
unsigned char ch=0, pop_char=0;
unsigned char key; // ключ алгоритму Цезаря
static int char_count_table[256];
int i, max_count;
printf("\n>>>\tKey fetchinп started");
while (!feof(in)) { // сканування файлу
ch=fgetc(in);
char_count_table[ch]++; // рахування повторів символів
}
max_count=0;
for ( i=0 ; i<256 ; i++ ) {
if ( max_count<=char_count_table[i] ) {
max_count=char_count_table[i];
pop_char=i;
}
}
puts("...SUCCESS!");
printf("max count has \"%c\" (hex%X,dec%d) - %d times\n",pop_char,pop_char,pop_char,max_count);
printf("assuming it's \"%c\" (hex%X,dec%d)\n",THE_CHAR,THE_CHAR,THE_CHAR);
key=pop_char-THE_CHAR;
return key;
}
/*** Функція дешифрування вхідного файлу за допомогою вказаного ключа k ***/
void decrypt(int k)
{
int ch;
printf("\n>>>\tDecrypting started");
ch=fgetc(in);
while (!feof(in)) {
ch=ch-k;
fputc(ch,out);
ch=fgetc(in);
}
puts("...DONE!");
}
Результати роботи програми:
Вхідний (зашифрований) файл (фрагмент):
%%%%%iАПТКНЖ;rКНЖДЙВ;bНКРЛ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;nI;fАЙП%mАМРАОП;БКН;^КИИАЙПОU;MOKQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;]]i;^КНЛ%j}ОКЗАПАОU;LSMR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mI;\ПЖДЙОКЙ%^|ПАВКНФU;nП|Й|НО;oН|~Ж;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;[cКИА;iАПТКНЖ%;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iКСАИ}АН;LTTS%%%;;;;;;;;;;;;;;;;dk;`Й~|ЛОРЗ|ПДЙВ;nА~РНДПФ;k|ФЗК|;C`nkD%%nП|ПРО;КБ;ПГДО;hАИК%%;;;oГДО;К~РИАЙП;ОЛА~ДБДАО;|Й;dЙПАНЙАП;ОП|Й|НО;ПН|~Ж;ЛНКПК~КЗ;БКН;ПГА%;;;dЙПАНЙАП;~КИИРЙДПФG;|Й;НАМРАОПО;ДО~РООДКЙ;|Й;ОРВВАОПДКЙО;БКН%;;;ДИЛНКСАИАЙПОI;;kЗА|ОА;НАБАН;ПК;ПГА;~РННАЙП;АДПДКЙ;КБ;ПГА;=dЙПАНЙАП%;;;jББД~Д|З;kНКПК~КЗ;nП|Й|НО=;Cno_;LD;БКН;ПГА;ОП|Й|НДХ|ПДКЙ;ОП|ПА%;;;|Й;ОП|ПРО;КБ;ПГДО;ЛНКПК~КЗI;;_ДОПНД}РПДКЙ;КБ;ПГДО;ИАИК;ДО;РЙЗДИДПАI%%
Вхідний файл – відкритий текст (фрагмент):
Network Working Group S. Kent
Request for Comments: 2406 BBN Corp
Obsoletes: 1827 R. Atkinson
Category: Standards Track @Home Network
November 1998
IP Encapsulating Security Payload (ESP)
Status of this Memo
This document specifies an Internet standards track protocol for the
Internet community, and requests discussion and suggestions for
improvements. Please refer to the current edition of the "Internet
Official Protocol Standards" (STD 1) for the standardization state
and status of this protocol. Distribution of this memo is unlimited.
Висновок: виконуючи цю лабораторну роботу, я навчився використовувати найпростіші методи зламування шифрів на прикладі алгоритму шифрування Цезаря. В результаті отримав читабельний текст.