Ім'я файлу: Расчетка_Технологии защиты информации.docx
Розширення: docx
Розмір: 339кб.
Дата: 22.01.2021
скачати
Пов'язані файли:
13.pdf
Податкова політика Контр. раб..docx
Контрольная Маркетинг.docx

Расчетная работа

по курсу «Технологии защиты информации»

Вариант 3

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

Написать программу на языке С++, выполняющую следующие действия:

1. Ввод ключа (последовательности символов, используемой в дальнейшем для шифрования информации).

2.1. Последовательное чтение содержимого произвольного выбранного файла блоками заданного размера.

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

2.3. Последовательная запись зашифрованного блока информации в выходной файл (отличный от входного).

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

Обратимые функции согласно варианту – XOR , Таблица подстановки.

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



Рис. 1.1 Ввод ключа



Рис. 1.2 Меню выбора действия



Рис. 1.3 Конец кодирования



Рис. 1.4 Конец декодирования

Содержимое файлов



Рис. 1.5 Исходный файл 1.txt



Рис. 1.6 Закодированный файл 2.txt



Рис. 1.7 Раскодированный файл 3.txt

Исходный и раскодированный файлы совпали , из чего можно сделать вывод что программа работает правильно.

Листинг программы 1:

#include

#include

#include

#include

#include

#include

using namespace std;

char str[1000];

int z=0;

int nkey;

int nstr;

int n;

int key[15];

char buf[15];

int main() {

FILE *in;

FILE *out;

system("cls");

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

int f=0;

while(f==0){

printf("Введите двоичный ключ(5-15 знаков)\n");

scanf("%s",buf);

nkey=strlen(buf);

if(strspn(buf,"01")==nkey)

f++;

else

printf("Kлюч введено некорректно, повторите ввод\n");

if(nkey<5||nkey>15){

f=0; } }

for(int i=0;i
key[i]=(int)(buf[i]);

if(key[i]==48)

key[i]=0;

else

key[i]=1; }

f=0;

for(int i=0;i
z+=key[i];

if(nkey<13){

for(int i=0;i<13-nkey;i++)

key[nkey+i]=key[i]; }

nkey=13;

system("cls");

printf("Выберите действие\n");

printf("1. Кодирование\n");

printf("2. Декодирование\n");

scanf("%d",&f);

if(f==1){

system("cls");

in=fopen("1.txt","r+");

out=fopen("2.txt","w+");

fgets(str,1000,in);

nstr=strlen(str);

n=nstr*8;

bool code[n];

for(int i=0;i
int b=str[i];

for (int j=0;j<8;j++){

code[(i*8)+j] = (b >> 7-j) & 0x01; } }

for(int i=0;i
for(int j=0;j<13;j++){

if(code[(i)+j]==key[j]){

code[(i)+j]=0; }

else

code[(i)+j]=1; }

for(int j=0;j
bool bb=code[i];

for(int t=1;t<13;t++)

code[(i)+(t-1)]=code[(i)+t];

code[(i)+12]=bb; } }

for(int i=0;i
int d=0;

for(int j=7;j>=0;j--)

d+=(code[i+j]*pow(2,7-j));

fprintf(out,"%c",d); }

printf("Кодирование успешно завершено\n");}

if(f==2){

system("cls");

in=fopen("2.txt","r+");

out=fopen("3.txt","w+");

fgets(str,1000,in);

nstr=strlen(str);

n=nstr*8;

bool code[n];

for(int i=0;i
int buf=(int)(str[i]);

for (int j=0;j<8;j++){

code[(i*8)+j] = (buf >> 7-j) & 0x01; } }

for(int i=0;i
for(int j=0;j
bool bb=code[i+12];

for(int t=12;t>=0;t--)

code[(i)+t]=code[(i)+(t-1)];

code[(i)]=bb; }

for(int j=0;j<13;j++){

if(code[(i)+j]==key[j])

code[(i)+j]=0;

else

code[(i)+j]=1; } }

for(int i=0;i
int d=0;

for(int j=7;j>=0;j--)

d+=(code[i+j]*pow(2,7-j));

fprintf(out,"%c",d); }

printf("Декодирование успешно завершено\n");}

return 0;}

Задание 2: Построение и исследование генераторов псевдослучайных чисел.

1. Разработать три генератора ПСЧ:

– генератор целых чисел на основе линейного конгруэнтного генератора;

– генератор чисел с плавающей точкой на основе алгебраических функций;

– генератор битовой последовательности на основе модели сдвигового регистра.

Каждый генератор должен инициализироваться значением, получаемым на основании введенного ключа (набора символов некоторой длины).

2. Выполнить графическую визуализацию эффективности каждого из разработанных генераторов путем заполнения псевдослучайными точками прямоугольной области на экране компьютера.

3. Выбрать наиболее эффективный генератор ПСЧ среди трех разработанных генераторов.

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

Рис. 2.1. Выбор генератора целых чисел.



Рис. 2.2. Ввод начального значения (семени).



Рис 2.3. Пример работы генератора 1.



Рис 2.4. Пример работы генератора 2.



Рис 2.5. Пример работы генератора 3.

Листинг программы 2:

#define _WIN32_WINNT 0x0501

#include "stdafx.h"

#include

#include

#include

void randu(unsigned seed, unsigned &uResult, double &dbResult){

uResult = seed * 65539;

if (uResult < 0) {

uResult *= 214748367 + 1; }

dbResult = uResult;

dbResult *= 0.4656613e-09;}

int main(){

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

void* handle = GetStdHandle(STD_OUTPUT_HANDLE);

CONSOLE_CURSOR_INFO structCursorInfo;

GetConsoleCursorInfo(handle, &structCursorInfo);

structCursorInfo.bVisible = FALSE;

SetConsoleCursorInfo(handle, &structCursorInfo);

HWND hWnd = GetConsoleWindow();

HDC hDc = GetDC(hWnd);

system("cls");

SetPixel(hDc, 503, 503, 0x00ffff);

system("cls");

printf("Выберите генератор псевдослучайных чисел\n");

printf("1. Генератор целых чисел на основе линейного конгруэнтного генератора;\n");

printf("2. Генератор чисел с плавающей точкой на основе алгебраических функций;\n");

printf("3. Генератор битовой последовательности на основе модели сдвигового регистра.\n");

int a = 0;

scanf_s("%d",&a);

system("cls");

printf("Введите ключ N (0
unsigned seed = 0;

scanf_s("%d", &seed);

int x = 0;

int y = 0;

unsigned uResult = 0;

double dbResult = 0;

if (a == 1){

system("cls");

while(a>0){

seed = (71 * seed + 21) % 500;

x = seed;

seed = (71 * seed + 21) % 500;

y = seed;

SetPixel(hDc, x, y, RGB(255, 255, 255)); } }

if (a == 2) {

system("cls");

while (a>0) {

randu(seed, uResult, dbResult);

seed = uResult ;

x = dbResult * 500;

x = x % 500;

randu(seed, uResult, dbResult);

seed = uResult ;

y = dbResult * 500;

y = y % 500;

SetPixel(hDc, x, y, RGB(255, 255, 255)); } }

if (a == 3) {

system("cls");

while (a > 0) {

bool code[10];

for (int j = 0;j < 10;j++) {

code[j] = (seed >> 10 - j) & 0x01; }

int ans;

ans = code[9];

for (int i = 8;i >= 0;i--) {

code[i + 1] = code[i];

ans += code[i]; }

code[0] = ans % 2;

int d = 0;

for (int j = 9;j >= 0;j--)

d += (code[j] * pow(2, 10 - j));

seed = d;

x = seed % 500;

for (int j = 0;j < 10;j++) {

code[j] = (seed >> 10 - j) & 0x01; }

ans = code[9];

for (int i = 8;i >= 0;i--) {

code[i + 1] = code[i];

ans += code[i]; }

code[0] = ans % 2;;

for (int j = 9;j >= 0;j--)

d += (code[j] * pow(2, 10 - j));

seed = d;

y = seed % 500;

SetPixel(hDc, x, y, RGB(255, 255, 255)); } }

system("pause");

return 0;}

Задание 3: Шифрование данных на основе базовых криптографических методов.

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

Данная лабораторная работа по своей сути должна объединять в себе третью и четвертую лабораторные работы. Шифрование и дешифровка файла производятся теми же методами и теми же блоками, что и в первом задании, но при этом используется не информация заданного ключа, а информация, формируемая генераторами ПСЧ, разработанными во втором задании. А вот инициализация генераторов должна осуществляться с помощью вводимого с клавиатуры ключа.

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



Рис. 3.1 Ввод ключа



Рис. 3.2 Меню выбора действия



Рис. 3.3 Конец кодирования



Рис. 3.4 Конец декодирования

Содержимое файлов



Рис. 3.5 Исходный файл 1.txt



Рис. 3.6 Закодированный файл 2.txt



Рис. 3.7 Раскодированный файл 3.txt

Исходный и раскодированный файлы совпали, из чего можно сделать вывод что программа работает правильно.

Листинг программы 3:

#include

#include

#include

#include

#include

#include

void randu(unsigned seed, unsigned &uResult, double &dbResult){

uResult = seed * 65539;

if (uResult < 0) {

uResult *= 214748367 + 1; }

dbResult = uResult;

dbResult *= 0.4656613e-09;}

char str[1000];

int nkey;

int nstr;

int n;

int key[15];

unsigned seed;

unsigned uResult;

double dbResult;

int main(){

FILE *in;

FILE *out;

system("cls");

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

int f = 0;

char buf[1000];

while (f == 0) {

printf("Введите ключ(5-15 знаков)\n");

scanf("%s",buf);

nkey = strlen(buf);

f++;

if (nkey<5 || nkey>15) {

printf("Kлюч введено некорректно, повторите ввод\n");

f = 0; } }

for (int i = 0;i
key[i] = (int)(buf[i]);

f = 0;

system("cls");

printf("Выберите действие\n");

printf("1. Кодирование\n");

printf("2. Декодирование\n");

scanf("%d", &f);

if (f == 1) {

system("cls");

in = fopen("1.txt", "r+");

out = fopen("2.txt", "w+");

fgets(str, 1000, in);

nstr = strlen(str);

int k = 0;

while (k <= nstr - nkey) {

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

seed = key[i];

randu(seed, uResult, dbResult);

seed = uResult % 256;

key[i] == seed; }

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

str[k + i] = (str[k + i] + key[i]) % 256; }

k += 8; }

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

seed = key[i];

randu(seed, uResult, dbResult);

seed = uResult % 256;

key[i] == seed; }

for (int i = 0;i < nstr-k;i++)

str[k + i] = (str[k + i] + key[i]) % 256;

for(int i=0;i
fprintf(out, "%c", str[i]);

printf("Кодирование успешно завершено\n"); }

if (f == 2) {

system("cls");

in = fopen("2.txt", "r+");

out = fopen("3.txt", "w+");

fgets(str, 1000, in);

nstr = strlen(str);

int k = 0;

while (k <= nstr - nkey) {

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

seed = key[i];

randu(seed, uResult, dbResult);

seed = uResult % 256;

key[i] == seed; }

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

str[k + i] = (str[k + i] - key[i]) % 256; }

k += 8; }

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

seed = key[i];

randu(seed, uResult, dbResult);

seed = uResult % 256;

key[i] == seed; }

for (int i = 0;i < nstr - k;i++) {

str[k + i] = (str[k + i] - key[i]) % 256; }

for (int i = 0;i
fprintf(out, "%c", str[i]);

printf("Декодирование успешно завершено\n"); }

return 0;}

скачати

© Усі права захищені
написати до нас