Вы находитесь на странице: 1из 13

МИНОБРНАУКИ РОССИИ

Федеральное государственное бюджетное образовательное

учреждение высшего профессионального образования

«Тульский государственный университет»

Кафедра «Информационная безопасность»

Криптографические методы защиты информации

Лабораторная работа № 1

«Алгоритмы гаммирования»

Выполнили: студенты группы 230711 Проверил: преподаватель

Акользина И. С.

Кузнецова А. В. Басалова Г. В.

Тула 2013
1. Цель работы
Реализовать программно алгоритм гаммирования с конечной гаммой.

2. Ход работы

Задание 1. Шифрование двух целых чисел. Необходимо создать


программу Gamma0, выполняющую шифрование двух чисел методом
гаммирования.

Алгоритм программы.
1. Ввести с клавиатуры исходное число.
2. Вывести его на экран.
3. Ввести с клавиатуры ключ.
4. Вывести его на экран.
5. Применить к исходному числу и ключу операцию XOR.
6. Вывести полученное число на экран.

Текст программы.
// gamma0.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream"
#include "conio.h"
using namespace std;

int x, key, y;

int _tmain(int argc, _TCHAR* argv[])


{
setlocale(LC_ALL, "RUS");
cout << "Введите исходное число" << endl;
cin>>x;
cout << "Было введено " << x << endl;
cout << "Введите ключ" << endl;
cin>>key;
cout << "Был введен ключ " << key << endl;
y=x^key;
cout<< "Результат " << y;

getch();
return 0;
}
Результат работы программы.
Шифрование.

Рис. 1

Расшифрование.

Рис. 2

Задание 2. Шифрование строки символов. Необходимо создать


программу Gamma1, выполняющую шифрование введенной с клавиатуры
строки методом гаммирования. При шифровании исходная строка
обрезается по длине ключа.

Алгоритм программы.
1. Ввести с клавиатуры исходную фразу.
2. Вывести исходную фразу на экран.
3. Присвоить переменной len1 значение, равное длине исходной
фразы.
4. Вывести длину исходной фразы на экран.
5. Ввести с клавиатуры ключ.
6. Вывести ключ на экран.
7. Присвоить переменной len2 значение, равное длине ключа.
8. Шифрование. Шифруется столько символов, сколько содержится
в ключе. Цикл i = 0 до i = len2.
9. Получить номер i-го символа из исходной фразы в таблице
кодировки символов(x).
10. Получить номер i-го символа ключа в таблице кодировки
символов(y).
11. Применить операцию XOR к числам x и y. Результат – число z.
12. Получить символ, номер которого в таблице кодировки символов
равен z.
13. Прибавить этот символ к результату.
14. Увеличить значение i на 1.
15. Переход к п. 9.
16. Вывести полученную строку на экран.
17. Расшифрование – аналогично шифрованию, только вместо
исходной фразы – полученная строка.

Текст программы.
// gamma1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream"
#include "conio.h"
#include "string"
using namespace std;

string str1, key, str2, str3;


int len1, len2, i, x, y, z;

int _tmain(int argc, _TCHAR* argv[])


{
setlocale(LC_ALL, "RUS");
cout << "Vvedite ishodnuyu frasu: " << endl;
getline(cin, str1);
cout << "You tiped: " << str1 << endl;
len1=str1.length();
cout << "Len of str " << len1 << endl;
cout << "Vvedite key" << endl;
getline(cin, key);
cout << "You tiped " << key << endl;
len2=key.length();
for (i=0; i<len2; i++)
{
x=int(str1[i]);
y=int(key[i]);
z=x^y;

string z1(1, z);


str2=str2+z1;

cout << "Zashifrovali: " << str2 << endl;

for (i=0; i<len2; i++)


{
x=int(str2[i]);
y=int(key[i]);
z=x^y;

string z1(1, z);


str3=str3+z1;

cout << "Rashifrovali: " << str3 << endl;


getch();

return 0;
}

Результат работы программы.

Рис. 3

Задание 3. Шифрование символов из файла. Необходимо создать


программу Gamma2, выполняющую шифрование символов, считываемых
из файла. Результатом работы программы будет текстовый файл,
содержащий зашифрованный текст, обрезанный по длине ключа.

Алгоритм программы.
1. Ввести с клавиатуры ключ.
2. Вывести ключ на экран.
3. Присвоить переменной len2 значение, равное длине ключа.
4. Открыть входной файл для чтения.
5. Открыть выходной файл для записи.
6. Присвоить переменной size значение, равное размеру входного
файла в байтах.
7. Шифрование. Цикл i = 0 до i = len2.
8. Считать i – й байт из входного файла.
9. Привести его значение к типу int. Результат – x.
10. Получить номер i-го символа ключа в таблице кодировки
символов(y).
11. Применить операцию XOR к числам x и y. Результат – число z.
12. Привести значение числа z к строковому типу.
13. Прибавить это значение к результату.
14. Увеличить значение i на 1.
15. Переход к п. 8.
16. Вывести результат в файл shifr.txt.
17. Расшифрование – аналогично шифрованию. Гаммирование
производится для файла shifr.txt и ключа. Результат побайтово
выводится в выходной файл.

Текст программы.
// gamma2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream"
#include "fstream"
#include "string"
using namespace std;

ofstream out("shifr.txt");

string key, str2, str3;


int len2, i, x, y, z;

int _tmain(int argc, _TCHAR* argv[])


{
cout << "Vvedite Key: " << endl;
getline(cin, key);
cout << "You tiped: " << key << endl;
len2=key.length();
FILE *file;
FILE *f;
char x1;
file=fopen("pr1.txt", "rb+");
f=fopen("pr1_1.txt", "rb+");

long size;
fseek(file, 0, SEEK_END);
size=ftell(file);
fseek(file, 0, SEEK_SET);

for (long i=0; i<len2; i++)


{
fread(&x1, sizeof(char),1,file);
x=int(x1);
y=int(key[i]);
z=x^y;

string z1(1, z);


str2=str2+z1;

out << "Zashifrovali: " << str2 << endl;

for (i=0; i<len2; i++)


{
x=int(str2[i]);
y=int(key[i]);
z=x^y;

char z1=char(z);
fwrite(&z1, sizeof(char),1,f);
}

fclose(file);
fclose(f);

return 0;
}

Результат работы программы (для текстового файла).

Рис. 4
Входной файл pr1.txt
1234567890

Файл shifr.txt
Zashifrovali: ZWJ
Выходной файл pr1_1.txt
123

Задание 4. Изменение программы для шифрования строки символов.


Необходимо изменить программу Gamma1 так, чтобы выполнялось
шифрование и расшифрование всей введенной с клавиатуры строки вне
зависимости от длины ключа.

Алгоритм программы.
1. Ввести с клавиатуры исходную фразу.
2. Вывести исходную фразу на экран.
3. Присвоить переменной len1 значение, равное длине исходной
фразы.
4. Вывести длину исходной фразы на экран.
5. Ввести с клавиатуры ключ.
6. Вывести ключ на экран.
7. Присвоить переменной len2 значение, равное длине ключа.
8. Присвоить переменной j значение, равное 0.
9. Цикл i = 0 до i = len1.
10. Если значение j = len2, то j = 0.
11. Получить номер i-го символа из исходной фразы в таблице
кодировки символов(x).
12. Получить номер i-го символа ключа в таблице кодировки
символов(y).
13. Применить операцию XOR к числам x и y. Результат – число z.
14. Получить символ, номер которого в таблице кодировки символов
равен z.
15. Прибавить этот символ к результату.
16. Увеличить значение j на 1.
17. Увеличить значение i на 1.
18. Переход к п. 10.
19. Вывести полученную строку на экран.
20. Расшифрование – аналогично шифрованию, только вместо
исходной фразы – полученная строка.

Текст программы.
// gamma3.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream"
#include "conio.h"
#include "string"
using namespace std;

string str1, key, str2, str3;


int len1, len2, i, x, y, z;

int _tmain(int argc, _TCHAR* argv[])


{
setlocale(LC_ALL, "RUS");
cout << "Vvedite ishodnuyu frasu: " << endl;
getline(cin, str1);
cout << "You tiped: " << str1 << endl;
len1=str1.length();
cout << "Len of str " << len1 << endl;
cout << "Vvedite key" << endl;
getline(cin, key);
cout << "You tiped " << key << endl;
len2=key.length();

int j=0;
for (i=0; i<len1; i++)
{
if (j==len2) j=0;

x=int(str1[i]);
y=int(key[j]);
z=x^y;

string z1(1, z);


str2=str2+z1;
j++;
}

cout << "Zashifrovali: " << str2 << endl;

j=0;
for (i=0; i<len1; i++)
{
if (j==len2) j=0;
x=int(str2[i]);
y=int(key[j]);
z=x^y;

string z1(1, z);


str3=str3+z1;
j++;
}

cout << "Rashifrovali: " << str3 << endl;


getch();

return 0;
}

Результат работы программы.

Рис. 5

Задание 5. Изменение программы для шифрования и расшифрования


файла. Необходимо изменить программу Gamma2, выполняющую
шифрование символов, считываемых из файла так, чтобы выполнялось
шифрование всего файла целиком.

Алгоритм программы.
1. Ввести с клавиатуры ключ.
2. Вывести ключ на экран.
3. Присвоить переменной len2 значение, равное длине ключа.
4. Открыть входной файл для чтения.
5. Открыть выходной файл для записи.
6. Присвоить переменной size значение, равное размеру входного
файла в байтах.
7. Присвоить переменной j значение, равное 0.
8. Шифрование. Цикл i = 0 до i = len2.
9. Если значение j = len2, то j = 0.
10.Считать i – й байт из входного файла.
11.Привести его значение к типу int. Результат – x.
12. Получить номер i-го символа ключа в таблице кодировки
символов(y).
13. Применить операцию XOR к числам x и y. Результат – число z.
14. Привести значение числа z к строковому типу.
15. Прибавить это значение к результату.
16. Увеличить значение j на 1.
17. Увеличить значение i на 1.
18. Переход к п. 9.
19. Вывести результат в файл shifr.txt.
20. Расшифрование – аналогично шифрованию. Гаммирование
производится для файла shifr.txt и ключа. Результат побайтово
выводится в выходной файл.

Текст программы.
// gamma4.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream"
#include "fstream"
#include "string"
using namespace std;

ofstream out("shifr.txt");

string key, str2, str3;


int len2, i, x, y, z;

int _tmain(int argc, _TCHAR* argv[])


{
cout << "Vvedite Key: " << endl;
getline(cin, key);
cout << "You tiped: " << key << endl;
len2=key.length();

FILE *file;
FILE *f;
char x1;
file=fopen("pr1.txt", "rb+");
f=fopen("pr1_1.txt", "rb+");

long size;
fseek(file, 0, SEEK_END);
size=ftell(file);
fseek(file, 0, SEEK_SET);
long j=0;
for (long i=0; i<size; i++)
{
if (j==len2) j=0;
fread(&x1, sizeof(char),1,file);
x=int(x1);
y=int(key[j]);
z=x^y;

string z1(1, z);


str2=str2+z1;
j++;
}

out << "Zashifrovali: " << str2 << endl;

j=0;
for (i=0; i<size; i++)
{
if (j==len2) j=0;
x=int(str2[i]);
y=int(key[j]);
z=x^y;

char z1=char(z);
fwrite(&z1, sizeof(char),1,f);
j++;
}

fclose(file);
fclose(f);

return 0;
}

Результат работы программы (для текстового файла).

Рис. 6
Входной файл pr1.txt
1234567890

Файл shifr.txt
Zashifrovali: ZWJ_PO\]@[

Выходной файл pr1_1.txt


1234567890
Размер файла результата такой же, как у исходного файла.

3. Вывод
В ходе лабораторной работы мы реализовали программно алгоритм
гаммирования с конечной гаммой.