Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра автоматизованих систем управління
Лабораторна робота № 2
з ММПЗ
Тема: Шифрування даних методом квадратів.
Мета: Ознайомитися з методом квадратів для шифрування даних. Написати програму, яка б демонструвала роботу алгоритму.
Хід роботи
Написана мною програма складається з трьох частин. Перша – генерує ключі.
Друга - шифрує дані. Третя – їх дешифровує.
Текст першої частини:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#define N 16
#define M 256
void main(void){
/* unsigned char*/ int a[N][N],b[N][N],c[N][N],d[N][N],r;
int i,j,ii,jj;
FILE* f;
char keyfilename[100], text[256], crypted[256],cryptfilename[100];
int syma,symb;
int flag=1;
randomize();
clrscr();
//===============================================
for(i=0;i<N;i++)
for(j=0;j<N;j++){
a[i][j]=0;
b[i][j]=0;
c[i][j]=0;
d[i][j]=0;
keyfilename[i]=0;
text[i]=0;
crypted[i]=0;
cryptfilename[i]=0;
}
//================================================
for(i=0;i<N;i++)
for(j=0;j<N;j++){
//flag=1;
do{
flag=1;
r=random(M);
for(ii=0;ii<i;ii++)
for(jj=0;jj<=N;jj++)
if(a[ii][jj]==r){
flag=0;
break;
}
if(flag!=0)
for(jj=0;jj<j;jj++)
if(a[i][jj]==r)
flag=0;
}while(flag==0);
a[i][j]=r;
}
//===============================================
for(i=0;i<N;i++)
for(j=0;j<N;j++){
//flag=1;
do{
flag=1;
r=random(M);
for(ii=0;ii<i;ii++)
for(jj=0;jj<=N;jj++)
if(b[ii][jj]==r){
flag=0;
break;
}
if(flag!=0)
for(jj=0;jj<j;jj++)
if(b[i][jj]==r)
flag=0;
}while(flag==0);
b[i][j]=r;
}
//================================================
for(i=0;i<N;i++)
for(j=0;j<N;j++){
//flag=1;
do{
flag=1;
r=random(M);
for(ii=0;ii<i;ii++)
for(jj=0;jj<=N;jj++)
if(c[ii][jj]==r){
flag=0;
break;
}
if(flag!=0)
for(jj=0;jj<j;jj++)
if(c[i][jj]==r)
flag=0;
}while(flag==0);
c[i][j]=r;
}
//================================================
for(i=0;i<N;i++)
for(j=0;j<N;j++){
//flag=1;
do{
flag=1;
r=random(M);
for(ii=0;ii<i;ii++)
for(jj=0;jj<=N;jj++)
if(d[ii][jj]==r){
flag=0;
break;
}
if(flag!=0)
for(jj=0;jj<j;jj++)
if(d[i][jj]==r)
flag=0;
}while(flag==0);
d[i][j]=r;
}
//================================================
// printf("Vveditj imja fajly dlja zbere*ennja cljy4a\n");
// gets(keyfilename);
//================================================
do{
printf("Vveditj imja fajly dlja zbere*ennja cljy4a\n");
gets(keyfilename);
f=fopen(keyfilename,"w");
}while(f==NULL);
for(i=0;i<N;i++){
for(j=0;j<N;j++)
fprintf(f,"%d ",a[i][j]);
fprintf(f,"\n");
}
fprintf(f,"\n");
for(i=0;i<N;i++){
for(j=0;j<N;j++)
fprintf(f,"%d ",b[i][j]);
fprintf(f,"\n");
}
fprintf(f,"\n");
for(i=0;i<N;i++){
for(j=0;j<N;j++)
fprintf(f,"%d ",c[i][j]);
fprintf(f,"\n");
}
fprintf(f,"\n");
for(i=0;i<N;i++){
for(j=0;j<N;j++)
fprintf(f,"%d ",d[i][j]);
fprintf(f,"\n");
}
fclose(f);
//=================================================
}
Результатом роботи є файл ключа, який має вигляд чотирьох таблиць розміром 16х16.
Текст другої частини:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#define N 16
#define M 256
void main(void){
int a[N][N],b[N][N],c[N][N],d[N][N],r;
int i,j,ii,jj;
FILE* f;
char keyfilename[100], text[256], crypted[256],cryptfilename[100];
int syma,symb;
int flag=1;
randomize();
clrscr();
//===============================================
for(i=0;i<N;i++)
for(j=0;j<N;j++){
a[i][j]=0;
b[i][j]=0;
c[i][j]=0;
d[i][j]=0;
keyfilename[i]=0;
text[i]=0;
crypted[i]=0;
cryptfilename[i]=0;
}
do{
printf("Vveditj imja fajly dlja 4utannja cljy4a\n");
gets(keyfilename);
f=fopen(keyfilename,"r");
}while(f==NULL);
printf("Vveditj re4ennia\n");
gets(text);
for(i=0;i<N;i++){
for(j=0;j<N;j++)
fscanf(f,"%d ",&a[i][j]);
}
for(i=0;i<N;i++){
for(j=0;j<N;j++)
fscanf(f,"%d ",&b[i][j]);
}
for(i=0;i<N;i++){
for(j=0;j<N;j++)
fscanf(f,"%d ",&c[i][j]);
}
for(i=0;i<N;i++){
for(j=0;j<N;j++)
fscanf(f,"%d ",&d[i][j]);
}
fclose(f);
do{
printf("Vveditj imja fajla dlja zbere8ennja shufrovanoho texty\n");
gets(cryptfilename);
f=fopen(cryptfilename,"w");
}while(f==NULL);
int pos=0,ia,ja,ib,jb;
if(strlen(text)%2==1)
strcat(text," ");
while(pos<strlen(text)){
syma=text[pos];
symb=text[pos+1];
for(i=0;i<N;i++)
for(j=0;j<N;j++)
if(a[i][j]==syma){
ia=i;
ja=j;
break;
}
for(i=0;i<N;i++)
for(j=0;j<N;j++)
if(b[i][j]==symb){
ib=i;
jb=j;
break;
}
crypted[pos]=c[ia][jb];
crypted[pos+1]=d[ib][ja];
pos+=2;
}
for(i=0;i<strlen(crypted);i++){
fprintf(f,"%d ",(unsigned char)crypted[i]);
}
fclose(f);
getch();
}
Текст третьої частини:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#define N 16
#define M 256
void main(void){
/*unsigned char*/int a[N][N],b[N][N],c[N][N],d[N][N],r;
int i,j,ii,jj;
FILE* f;
char keyfilename[100], text[256], crypted[256],cryptfilename[100];
unsigned char syma,symb;
int flag=1;
randomize();
clrscr();
//===============================================
for(i=0;i<N;i++)
for(j=0;j<N;j++){
a[i][j]=0;
b[i][j]=0;
c[i][j]=0;
d[i][j]=0;
keyfilename[i]=0;
text[i]=0;
crypted[i]=0;
cryptfilename[i]=0;
}
//================================================
do{
printf("Vveditj imja fajla dlja 4utannia shufrovanoho texty\n");
gets(cryptfilename);
f=fopen(cryptfilename,"r");
}while(f==NULL);
i=0;
while(!feof(f)){
fscanf(f,"%d ",&j);
crypted[i]=(char)j;
i++;
}
fclose(f);
do{
printf("Vveditj imja fajly dlja 4utannja cljy4a\n");
gets(keyfilename);
f=fopen(keyfilename,"r");
}while(f==NULL);
//================================================
for(i=0;i<N;i++)
for(j=0;j<N;j++){
fscanf(f,"%d ",&a[i][j]);
}
//===============================================
for(i=0;i<N;i++)
for(j=0;j<N;j++){
fscanf(f,"%d ",&b[i][j]);
}
//================================================
for(i=0;i<N;i++)
for(j=0;j<N;j++){
fscanf(f,"%d ",&c[i][j]);
}
//================================================
for(i=0;i<N;i++)
for(j=0;j<N;j++){
fscanf(f,"%d ",&d[i][j]);
}
//================================================
fclose(f);
//=================================================
int pos=0,ic,jc,id,jd;
while(pos<strlen(crypted)){
syma=crypted[pos];
symb=crypted[pos+1];
for(i=0;i<N;i++)
for(j=0;j<N;j++)
if(c[i][j]==(int)syma){
ic=i;
jc=j;
break;
}
for(i=0;i<N;i++)
for(j=0;j<N;j++)
if(d[i][j]==symb){
id=i;
jd=j;
break;
}
text[pos]=a[ic][jd];
text[pos+1]=b[id][jc];
pos+=2;
}
for(i=0;i<strlen(text);i++){
printf("%c",text[i]);
}
getch();
}
Висновок: на цій лабораторній роботі, я ознайомився з алгоритмом квадратів, для шифрування даних і написав програму, яка демонструє його роботу.