Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лабы Защита инфы.docx
Скачиваний:
37
Добавлен:
11.04.2015
Размер:
119.66 Кб
Скачать

Лабораторная работа №1 Изучение алгоритма симметричного шифрования

Цель работы: изучить один из алгоритмов симметричного шифрования.

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

Ход работы Описание алгоритма и программы

Маги́ческий, или волше́бный квадра́т — это квадратная таблица nxn, заполненнаяn2числами таким образом, что сумма чисел в каждой строке, каждом столбце и на обеих диагоналях одинакова. Нормальным называется магический квадрат, заполненный натуральными числами от 1 доn2. В данной лабораторной будет использоваться алгоритм генерации нормальных магических квадратов 4х4, взятый по адресуhttp://svb.hut.ru/ALG/perm2.htm. Идея состоит в следующем: ключом является номер квадрата и, возможно, начальный набор цифр; по ключу генерируется магический квадрат; исходный текст сопоставляется строкам квадрата последовательно; далее реализуется перестановка в соответствии с числами в квадрате. Расшифровка происходит в обратном порядке. Алгоритм обладает низкой криптостойкостью, т.к. является простейшим и служит лишь для примера.

Рисунок 1. Работа программы

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

#include <stdio.h>

#include <conio.h>

#include <locale.h>

#include <windows.h>

#include <stdlib.h>

#include <iostream>

#include <string>

using namespace std;

int n=4,l,i,j,k=0,c=0,nn=16,sum=0,ti=0,C;

short sn;

int p[20],z[20];

bool flag=0;

char *s=new char[256],*sx=new char[64];

//====================================================

long int fuck(int x){

return (x>0||x==1)? x*fuck(x-1):1;

}

void out(){

printf("%d: \n",c);

printf("%3d %3d %3d %3d\n",p[1],p[5],p[6],p[2]);

printf("%3d %3d %3d %3d\n",p[13],p[12],p[9],p[14]);

printf("%3d %3d %3d %3d\n",p[15],p[11],p[10],p[16]);

printf("%3d %3d %3d %3d\n",p[3],p[7],p[8],p[4]);

z[1]=p[1];z[2]=p[5];z[3]=p[6];z[4]=p[2];z[5]=p[13];z[6]=p[12];z[7]=p[9];z[8]=p[14];z[9]=p[15];z[10]=p[11];z[11]=p[10];z[12]=p[16];z[13]=p[3];z[14]=p[7];z[15]=p[8];z[16]=p[4];

}

int good(int x){

int s,gd;

gd=sum;

switch (x){

case 3: if (p[2]<p[1]) gd=0; break;

case 4: {s=sum-(p[1]+p[2]+p[3]);

if ((s<p[1])||(p[3]<p[2])) gd=0;

else gd=s;

}break;

case 6: gd=sum-(p[1]+p[2]+p[5]);break;

case 8: gd=sum-(p[4]+p[3]+p[7]);break;

case 10: gd=sum-(p[8]+p[9]+p[6]);break;

case 11: gd=sum-(p[2]+p[9]+p[3]);break;

case 12: gd=sum-(p[5]+p[7]+p[11]);break;

case 14: gd=sum-(p[13]+p[12]+p[9]);break;

case 15: gd=sum-(p[1]+p[13]+p[3]);break;

default: gd=sum;

}

return gd;

}

void perm(int x){

int i,d,q;

ti++;

if (x==nn){

c++;

if(c==C) {out();flag=true;}}

if(ti>=0&&flag==1){ti--;

return;}

q=good(x); if(q==0) return;

d=p[x];

if (q==sum)

for(i=x;i<=nn;i++){

p[x]=p[i];

p[i]=d;

perm(x+1);

if (flag==1) break;

p[i]=p[x];

p[x]=d;

}

else

for(i=x;i<=nn;i++){

if(p[i]==q){

p[x]=p[i];

p[i]=d;

perm(x+1);

if (flag==1) break;

p[i]=p[x];

p[x]=d;

break;

}

}

ti--;

}

//===========================================================

void main(void){

setlocale(LC_ALL,"russian");

SetConsoleCP(1251);

//SetConsoleOutputCP(1251);

printf("Magic 4x4\n");

cprintf("Введите номер магического квадрата(ключ): ");

C=7;

scanf("%d",&C); if(C<1||C>880) C=880;

_cprintf("\nВведите строку для шифрования: ");

cin>>s;

for(i=1;i<=nn;i++)

p[i]=i;

for(i=1;i<=nn;i++){

sum=sum+p[i];

if(p[i]>k) k=p[i];

}

l=2;

while(k>=10){

l++;

k=k/10;

}

i=sum%n;

if((sum%n)!=0) return;

sum=sum/n;

cprintf("Сумма = %d\n",sum);

perm(1);

for(i=0;s[i]!='\0';i++)

sn=i+1;

if(sn%16!=0){ //если строка не кратна 16 - дополняем её пробелами

short t=sn/16;

for(i=sn%16+t*16;sn%16!=0;i++){

sn++;

s[i]=' ';

}

}

sx[0]=' ';

for(i=0;i<sn;i++){

sx[z[i%16+1]]=s[i];

}

cprintf("Зашифровали = ");

for(i=1;i<=sn;i++)

//cout<<sx[i];

cprintf("%c",sx[i]);

_getch();

}

Вывод: я изучил алгоритм симметричного шифрования и создал программу.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]