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

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

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

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

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

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

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

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

«Программная реализация алгоритма шифрования перестановкой


по таблице»

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

Акользина И. С. Басалова Г. В.

Кузнецова А. В.

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

2. Ход работы
Вариант 2.

Задание. Разработать программы шифрования/расшифрования


файлов произвольного размера методом перестановки по таблице. Размеры
таблицы: 4 столбца × 5 строк. Ключ – последовательность заполнения
строк таблицы; задается с клавиатуры.

Шифрование.
Алгоритм программы.
1. Открыть входной файл для чтения.
2. Открыть выходной файл для записи.
3. Ввести ключ с клавиатуры.
4. Для каждых 20 байтов входного файла:
5. Создать таблицу 4 столбца × 5 строк.
6. Заполнить таблицу по строкам в соответствии с ключом.
7. Считать данные из таблицы по столбцам.
8. Вывести результат в выходной файл.

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

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

int key;

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


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

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

setlocale(LC_ALL, "RUS");
cout << "Введите ключ" << endl;
cin >> key;

int s1[5];

s1[0]=key/10000-1;
key=key%10000;
s1[1]=key/1000-1;
key=key%1000;
s1[2]=key/100-1;
key=key%100;
s1[3]=key/10-1;
key=key%10;
s1[4]=key-1;

int** m;
m=new int*[5];
for (int i=0; i<5; i++)
m[i]=new int[4];

long k2;
if ((size%20)==0) k2=size/20;
else k2=size/20+1;

long x=0;

for (long o=0; o<k2; o++)


{

for (int i=0; i<5; i++) {


for (int c=0; c<4; c++)
m[i][c]=-1000000;
}

for (int j=0; j<5; j++)


{
for (int i=0; i<4; i++)
{
if (x<size) {
fread(&x1, sizeof(char),1,file);
m[s1[j]][i]=int(x1);
x++;}
}
}

for (int i=0; i<4; i++)


{
for (int c=0; c<5; c++)
{
char z2;
if (m[c][i]!=-1000000)
{z2=char(m[c][i]);
fwrite(&z2, sizeof(char),1,f);}
}
}
}

fclose(file);
fclose(f);

return 0;
}

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


Ключ: 24351

Файл pr1.txt
1234567890qwertyuiopas

Файл shifr.txt
u195ei206ro3q7tp4w8yas

Расшифрование.
Алгоритм программы.
1. Открыть входной файл для чтения.
2. Открыть выходной файл для записи.
3. Ввести ключ с клавиатуры.
4. Для каждых 20 байтов входного файла:
5. Создать таблицу 4 столбца × 5 строк.
6. Заполнить таблицу по столбцам.
7. Считать данные из таблицы по строкам в соответствии с ключом.
8. Вывести результат в выходной файл.

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

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

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


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

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

setlocale(LC_ALL, "RUS");
cout << "Введите ключ" << endl;
cin >> key;

int s1[5];

s1[0]=key/10000-1;
key=key%10000;
s1[1]=key/1000-1;
key=key%1000;
s1[2]=key/100-1;
key=key%100;
s1[3]=key/10-1;
key=key%10;
s1[4]=key-1;

int** m;
m=new int*[5];
for (int i=0; i<5; i++)
m[i]=new int[4];

long k2, k3;


k2=size/20;
k3=size%20;

long x=0;

for (long o=0; o<k2; o++)


{
for (int i=0; i<5; i++) {
for (int c=0; c<4; c++)
m[i][c]=-1000000;
}

for (int i=0; i<4; i++)


{
for (int j=0; j<5; j++)
{
if (x<size) {
fread(&x1, sizeof(char),1,file);
m[j][i]=int(x1);
x++;
}
}
}

for (int i=0; i<5; i++)


{
for (int c=0; c<4; c++)
{
char z2;
if (m[s1[i]][c]!=-1000000)
{z2=char(m[s1[i]][c]);
fwrite(&z2, sizeof(char),1,f);}
}
}
}

if (k3!=0)
{
int k4=k3/4;
int k5=k3-k4*4;

for (int i=0; i<5; i++) {


for (int c=0; c<4; c++)
m[i][c]=-1000000;
}

for (int i=0; i<4; i++)


{
for (int j=0; j<5; j++)
{
if (x<size) {
bool l=1;
if (i<k5) {
for (int b=k4+1; b<5; b++)
if (j==s1[b]) l=0;}
else {
for (int b=k4; b<5; b++)
if (j==s1[b]) l=0;}
if (l!=0) {
fread(&x1, sizeof(char),1,file);
m[j][i]=int(x1);
x++;
}
}
}
}

for (int i=0; i<5; i++)


{
for (int c=0; c<4; c++)
{
char z2;
if (m[s1[i]][c]!=-1000000)
{z2=char(m[s1[i]][c]);
fwrite(&z2, sizeof(char),1,f);}
}
}
}

fclose(file);
fclose(f);

return 0;
}
Результат работы программы.
Ключ: 24351

Файл shifr.txt
u195ei206ro3q7tp4w8yas

Файл pr1_1.txt
1234567890qwertyuiopas

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