- •Лабораторная работа №1 Изучение алгоритма симметричного шифрования
- •Ход работы Описание алгоритма и программы
- •Лабораторная работа №2 Изучение алгоритма асимметричного шифрования
- •Ход работы Описание алгоритма
- •Листинг:
- •Лабораторная работа №3 Изучение алгоритма электронной цифровой подписи (эцп)
- •Ход работы
- •Лабораторная работа №4 Изучение методов защиты от копирования
- •Выполнение работы
- •Современные технологии drm
- •Примеры современных средств защиты
Лабораторная работа №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();
}
Вывод: я изучил алгоритм симметричного шифрования и создал программу.