Автор: Пользователь скрыл имя, 07 Мая 2012 в 18:54, лабораторная работа
Цель работы
Знакомство с методами подстановок в криптографии. Получение навыков шифрования и дешифрования сообщений, а также разработки соответствующего программного обеспечения на основе технологии визуального программирования.
Министерство образования и науки РФ
Государственное образовательное учреждение
высшего профессионального образования
Тульский государственный
КАФЕДРА ЭЛЕКТРОННЫХ ВЫЧИСЛИТЕЛЬНЫХ МАШИН
ЗАЩИТА ИНФОРМАЦИИ И ИНФОРМАЦИОННАЯ БЕЗОПАСНОСТЬ
Лабораторная работа № 1
«МЕТОДЫ КРИПТОГРАФИИ. ПОДСТАНОВКИ»
Выполнили
студенты гр. 230281:
Жуков А. А.
Корешков А. В.
Проверил:
Новиков А. В.
Тула 2012
Знакомство с методами подстановок в криптографии. Получение навыков шифрования и дешифрования сообщений, а также разработки соответствующего программного обеспечения на основе технологии визуального программирования.
Разработать программу шифрования текста с помощью шифра указанного в задании (величина смещения по алфавиту должна задаваться пользователем). Зашифровать любой текст достаточного объема (несколько тысяч знаков). Получить таблицу встречаемости символов алфавита в данном тексте.
В интегрированной среде
программирования разработать программное
обеспечение для
Вариант №4. G-контурная многоалфавитная подстановка.
Исходные данные:
Input.txt – файл, содержащий исходный текст сообщения;
Setup.txt – файл, содержащий словарь с множеством алфавитов;
Выходные данные:
Output.txt – файл, содержащий полученный шифрованный текст;
Листинг программы:
#include <stdio.h>
int main(int argc, char** argv)
{
//Открываем файл со словарем
FILE* inp = fopen(argv[3], "r");
int count_alphabits, length_alphabit, *Ts;
char** alphabits;
//Записываем словарь в память
fscanf(inp, "%d %d\n", &count_alphabits, &length_alphabit);
Ts = new int[count_alphabits];
alphabits = new char*[length_alphabit+1];
for(int i = 0; i < count_alphabits; i++)
alphabits[i] = new char[length_alphabit];
for(int i = 0; i < count_alphabits; i++)
{
fscanf(inp, "%d ", &(Ts[i]));
for(int j = 0; j < length_alphabit; j++)
alphabits[i][j] = fgetc(inp);
alphabits[i][length_alphabit] = '\0';
}
fclose(inp);
//Шифруем сообщение и
int i = 0, j = 0;
inp = fopen(argv[1], "r");
FILE* out = fopen(argv[2], "w+");
bool sign = false;
while(true)
{
int c = fgetc(inp);
if(feof(inp)) break;
int p = c;
if(argc == 5) printf("%c(%d)", (char)p, p);
for(int i = 0; i < count_alphabits; i++)
{
if(sign)
{
p += alphabits[i][j % Ts[i]];
if(argc == 5) printf("+%c(%d)", alphabits[i][j % Ts[i]], (int)(alphabits[i][j % Ts[i]]));
}
else
{
p -= alphabits[i][j % Ts[i]];
if(argc == 5) printf("-%c(%d)", alphabits[i][j % Ts[i]], (int)(alphabits[i][j % Ts[i]]));
}
sign = !sign;
}
p += 100;
if(argc == 5) printf("+(100)=%c(%d)\n", (char)p, p);
j++;
fputc(p, out);
}
fclose(inp);
fclose(out);
return 0;
}
Результат работы программы:
Словарь:
8 35
15 QWERTYUIOP{}ASDFGHJKL:"
20 []poiua/.,mnbvcxz! ytrewq';lkjhgfds
11 aqzxswedcvfrjm,kiol./;p[']!
12 ]'/.;[pl,mkrdxzseawq!
12 q]w[eprotiyua's;dlmbn! fkgjhz/x.c,v
11 /'][poiuytrew;lkjhgfds! qazxcvbnm,.
13 QAZXCDSWERFVBNHGTYUJ:P{"}! M<KIOL>?
12 QZAXWSCED:"{}! VRFBTGNYHMUJ<IK>OL?P
Текст входного сообщения:
Hello world! Anton hello! Evm forever! Hello world! Anton hello! Evm forever! Hello world! Anton hello!
Полученный шифро-текст:
ph}ЈП’Щµ‚/fV~ЊНГ`цnЭ‡
Исходные данные:
Input.txt – файл, содержащий шифрованный текст;
Setup.txt – файл, содержащий словарь с множеством алфавитов;
Выходные данные:
Output.txt – файл, содержащий полученный исходный текст сообщения;
Листинг программы:
#include <stdio.h>
int main(int argc, char** argv)
{
//Открываем файл со словарем
FILE* inp = fopen(argv[3], "r");
int count_alphabits, length_alphabit, *Ts;
char** alphabits;
//Записываем словарь в память
fscanf(inp, "%d %d\n", &count_alphabits, &length_alphabit);
Ts = new int[count_alphabits];
alphabits = new char*[length_alphabit+1];
for(int i = 0; i < count_alphabits; i++)
alphabits[i] = new char[length_alphabit];
for(int i = 0; i < count_alphabits; i++)
{
fscanf(inp, "%d ", &(Ts[i]));
for(int j = 0; j < length_alphabit; j++)
alphabits[i][j] = fgetc(inp);
alphabits[i][length_alphabit] = '\0';
}
fclose(inp);
//Шифруем сообщение и
int i = 0, j = 0;
inp = fopen(argv[1], "r");
FILE* out = fopen(argv[2], "w+");
bool sign = true;
while(true)
{
int c = fgetc(inp);
if(feof(inp))
break;
int p = c;
if(argc == 5) printf("%c(%d)", (char)p, p);
for(int i = count_alphabits-1; i >= 0; i--)
{
if(sign)
{
p -= alphabits[i][j % Ts[i]];
if(argc == 5) printf("-%c(%d)", alphabits[i][j % Ts[i]], (int)(alphabits[i][j % Ts[i]]));
}
else
{
p += alphabits[i][j % Ts[i]];
if(argc == 5) printf("+%c(%d)", alphabits[i][j % Ts[i]], (int)(alphabits[i][j % Ts[i]]));
}
sign = !sign;
}
p -= 100;
if(argc == 5) printf("-(100)=%c(%d)\n", (char)p, p);
j++;
fputc(p, out);
}
fclose(inp);
fclose(out);
return 0;
}
Результат работы программы:
Словарь:
8 35
15 QWERTYUIOP{}ASDFGHJKL:"
20 []poiua/.,mnbvcxz! ytrewq';lkjhgfds
11 aqzxswedcvfrjm,kiol./;p[']!
12 ]'/.;[pl,mkrdxzseawq!
12 q]w[eprotiyua's;dlmbn! fkgjhz/x.c,v
11 /'][poiuytrew;lkjhgfds! qazxcvbnm,.
13 QAZXCDSWERFVBNHGTYUJ:P{"}! M<KIOL>?
12 QZAXWSCED:"{}! VRFBTGNYHMUJ<IK>OL?P
Шифро-текст входного сообщения:
ph}ЈП’Щµ‚/fV~ЊНГ`цnЭ‡
Полученный исходный текст:
Hello world! Anton hello! Evm forever! Hello world! Anton hello! Evm forever! Hello world! Anton hello!
Исходные данные:
Input.txt – файл, содержащий шифрованный текст;
Выходные данные:
Output.txt – файл, содержащий полученный исходный текст сообщения;
Листинг программы:
#include <stdio.h>
#include <windows.h>
int main(int argc, char** argv)
{
FILE* inp, *out;
//Путь к программе шифрования
char encrypt[256];
strcpy(encrypt,argv[1]);
strcat(encrypt,"\\");
strcat(encrypt,argv[2]);
//Путь к шифро-тексту
char true_output[256];
strcpy(true_output,argv[1]);
strcat(true_output,"\\");
strcat(true_output,argv[3]);
//Путь к востановленному тексту
char open_input[256];
strcpy(open_input,argv[1]);
strcat(open_input,"\\");
strcat(open_input,argv[4]);
//Для работы с командной строкой
char cmd_cd[256];
strcpy(cmd_cd, argv[1]);
strcat(cmd_cd, "\\");
strcat(cmd_cd, argv[2]);
strcat(cmd_cd, " ");
strcat(cmd_cd, argv[1]);
strcat(cmd_cd, "\\");
strcat(cmd_cd, argv[4]);
strcat(cmd_cd, " ");
strcat(cmd_cd, argv[1]);
strcat(cmd_cd, "\\");
strcat(cmd_cd, argv[3]);
strcat(cmd_cd, " ");
strcat(cmd_cd, argv[1]);
strcat(cmd_cd, "\\");
strcat(cmd_cd, argv[5]);
//Копируем исходный шифротекст и считаем его длинну
int count_char = 0;
inp = fopen(true_output, "r+");
out = fopen("true_output.txt", "w+");
while(true)
{
int c = fgetc(inp);
if(feof(inp)) break;
fputc(c, out);
count_char++;
}
fclose(inp);
fclose(out);
//Выделим память под востановленный текст
char* true_input = new char[count_char+1];
for(int i = 0; i <= count_char; i++)
true_input[i] = '\0';
for(int c = -127; c < 128; c++)
{
printf("Brute-force attack %d%%\n", ((c+127)*100)/254);
//Генерируем текст из последовательности одного и того же символа
out = fopen(open_input, "w+");
for(int i = 0; i < count_char; i++)
fputc(c, out);
fclose(out);
//Запускаем программу шифрования
system(cmd_cd);
inp = fopen(true_output, "r");
FILE* inp2 = fopen("true_output.txt", "r");
//Если символ полученного шифро-текста совпадает с символом исходного шифро-текста, то сохраняем его
for(int i = 0; i < count_char; i++)
if(fgetc(inp) == fgetc(inp2)) true_input[i] = c;
fclose(inp2);
fclose(inp);
}
//Записываем восстановленный исходный текст в файл
out = fopen("open_input.txt", "w+");
for(int i = 0; i < count_char; i++)
fputc(true_input[i], out);
fclose(out);
//Восстанавливаем файл
inp = fopen("true_output.txt", "r");
out = fopen(true_output, "w+");
for(int i = 0; i < count_char; i++)
fputc(fgetc(inp), out);
fclose(out);
fclose(inp);
}
Результат работы программы:
Шифро-текст входного сообщения:
ph}ЈП’Щµ‚/fV~ЊНГ`цnЭ‡
Полученный исходный текст:
Hello world! Anton hello! Evm forever! Hello world! Anton hello! Evm forever! Hello world! Anton hello!
Листинг автоматизированного сценария:
@echo off
del input.txt
del output.txt
del setup.txt
copy restore\input.txt input.txt
copy restore\setup.txt setup.txt
cls
echo Исходные параметры приложения:
echo input.txt - Файл, содержащий текст
echo setup.txt - Словарь, содержащий N алфавитов по M букв в каждом
echo ==============================
pause
echo Получим шифро-текст при помощи разработанного ПО (encoder.exe)
echo output.txt - Файл, содержащий шифро-текст
encoder.exe input.txt output.txt setup.txt
echo ==============================
pause
echo Удалим файл input.txt, содержащий исходный текст
del input.txt
echo ==============================
pause
echo Переименуем файл output.txt в input.txt
rename output.txt input.txt
echo ==============================
pause
echo Восстановим текст при помощи разработанного ПО (decoder.exe)
echo output.txt - Файл, содержащий текст
decoder.exe input.txt output.txt setup.txt
echo ==============================
pause
del input.txt
del output.txt
del setup.txt
Результат работы автоматизированного сценария:
Рис. 1. Результат выполнения автоматизированного сценария
Рис. 2. Входной файл, содержащий шифро-текст
Рис. 3. Выходной файл, содержащий исходный текст
Листинг автоматизированного сценария:
@echo off
del encoder\input.txt
del encoder\output.txt
del encoder\setup.txt
del true_output.txt
del open_input.txt
copy restore\input.txt encoder\input.txt
copy restore\setup.txt encoder\setup.txt
cls
echo Исходные параметры приложения:
echo input.txt - Файл, содержащий текст
echo setup.txt - Словарь, содержащий N алфавитов по M букв в каждом
echo ==============================
pause
echo Получим шифро-текст при помощи разработанного ПО (encoder.exe)
echo output.txt - Файл, содержащий шифро-текст
encoder\encoder.exe encoder\input.txt encoder\output.txt encoder\setup.txt
echo ==============================
pause
echo Удалим файл input.txt, содержащий исходный текст
del encoder\input.txt
echo ==============================
pause
echo Восстановим текст при помощи разработанного ПО (brute-force.exe)
pause
brute-force.exe encoder encoder.exe output.txt input.txt setup.txt
echo ==============================
pause
del encoder\input.txt
del encoder\output.txt
del encoder\setup.txt
del true_output.txt
Результат работы автоматизированного сценария:
Рис. 4. Результат выполнения автоматизированного сценария
Рис. 5. Входной файл, содержащий шифро-текст
Рис. 6. Выходной файл, содержащий исходный текст
В ходе выполнения лабораторной работы мы ознакомились с методами подстановок в криптографии, получили навыки шифрования и дешифрования сообщений, а также разработали соответствующее программное обеспечение на основе технологии визуального программирования.