Sie sind auf Seite 1von 5

#include<stdio.

h>
#include<conio.h>
#include<ctype.h>
#include<math.h>
#define MAX 100
int
int
int
int
int
int
int
int

minor(int mat[5][5],int x,int y,int size);


cofactor(int mat[5][5],int x,int y,int size);
det(int mat[5][5],int size);
matinverse(int mat[5][5],int inv[5][5],int size);
transpose(int mat[5][5],int inv[5][5],int size);
matmul(int mat1[5][5],int mat2[5][5],int mul[5][5],int size);
a_inverse(int x);
clear_input_buffer(void);

void main()
{
char text[MAX],ctext[MAX];
int siz,j,k,i,ch,sqmat[5][5],determinant,detin,p[5][5],c[5][5],key,z,y,i
nv[5][5];
clrscr();
do
{
printf("\nHill Cipher\n");
printf("-----------\n");
printf("1. Encryption\n");
printf("2. Decryption\n");
printf("\nEnter your choice: ");
scanf("%d",&ch);
switch(ch)
{
case 1:
printf("\nEnter the size of square matrix (key):
");
scanf("%d",&siz);
printf("\n");
for(i=0;i<siz;i++)
{
printf("Enter the elements of row %d: ",
i);
for(j=0;j<siz;j++)
scanf("%d",&sqmat[i][j]);
}
determinant=det(sqmat,siz);
if(determinant%2==0 || determinant%13==0)
printf("\nWarning: Decryption will not b
e correct\n");
printf("\nEnter the plaintext to be encrypted: \
n");
clear_input_buffer();
gets(text);
i=0,y=0;
while(text[i]!='\0')
{
for(k=0;k<siz;k++)
for(j=0;j<siz;j++)
{
if(text[i]!='\0')

p[j][k]=text[i++
]-97;
else
p[j][k]=0;
}
matmul(sqmat,p,c,siz);
for(k=0;k<siz;k++)
for(j=0;j<siz;j++)
{
if(y==i)
ctext[y]='\0';
else
ctext[y++]=(c[j]
[k] % 26)+97;
}
}
printf("\nCiphertext: \n");
puts(ctext);
break;
case 2:
printf("\nEnter the size of square matrix (key):
");
scanf("%d",&siz);
printf("\n");
for(i=0;i<siz;i++)
{
printf("Enter the elements of row %d: ",
i);
for(j=0;j<siz;j++)
scanf("%d",&sqmat[i][j]);
}
printf("\nEnter the ciphertext to be decrypted:
\n");
clear_input_buffer();
gets(text);
determinant=det(sqmat,siz);

// printf(

detin=a_inverse(abs(determinant));
if(determinant<0)
detin=26-detin;
matinverse(sqmat,inv,siz);

// printf(

"det: %d",determinant);

"detin: %d",detin);
i=0,y=0;
while(text[i]!='\0')
{
for(k=0;k<siz;k++)
for(j=0;j<siz;j++)
{
if(text[i]!='\0')
c[j][k]=text[i++
]-97;
else

c[j][k]=0;
}
matmul(inv,c,p,siz);
for(k=0;k<siz;k++)
for(j=0;j<siz;j++)
{
//printf(" %d ",p[j][k]
);
if(y>=i)
ctext[y++]='\0';
else
{
p[j][k]%=26;
//printf(" %d ",p[j][k]);
if(p[j][k]<0) p[
j][k]+=26;
p[j][k]*=detin;
p[j][k]%=26;
ctext[y++]=(p[j]
[k] % 26)+97; //printf("\n%d",ctext[y-1]); puts(ctext);
}
}
}
printf("\nPlaintext: \n");
puts(ctext);
break;
default:
break;
}
printf("\nDo you want to continue?\n");
ch=getchar();
}
while(ch=='y' || ch=='Y');
getch();
}
int clear_input_buffer(void)
{
int ch;
while(((ch=getchar())!=EOF) && (ch != '\n'));
return ch;
}
int matmul(int mat1[5][5],int mat2[5][5],int mul[5][5],int size)
{
int i,j,k;
for(i=0;i<size;i++)
for(j=0;j<size;j++)
{
mul[i][j]=0;
for(k=0;k<size;k++)
{
mul[i][j]+=mat1[i][k]*mat2[k][j];
}
}
}

int cofactor(int mat[5][5],int x,int y,int size)


{
if( (x+y) % 2 == 0 )
return minor(mat,x,y,size);
else
return -minor(mat,x,y,size);
}
int minor(int mat[5][5],int x,int y,int size)
{
int minor[5][5],i,j;
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
{
if(i==x || j==y)
{}
else
{
if(i<x && j<y)
minor[i][j]=mat[i][j];
if(i<x && j>y)
minor[i][j-1]=mat[i][j];
if(i>x && j<y)
minor[i-1][j]=mat[i][j];
if(i>x && j>y)
minor[i-1][j-1]=mat[i][j];
}
}
}
return det(minor,size-1);
}
int det(int mat[5][5],int size)
{
int det=0,i;
if(size==1)
return mat[0][0];
else
for(i=0;i<size;i++)
{
det+=(cofactor(mat,0,i,size)*mat[0][i]);
}
return det;
}
int matinverse(int mat[5][5],int inv[5][5],int size)
{
int adj[5][5],i,j;
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
{
adj[i][j]=cofactor(mat,i,j,size);
}
}
return transpose(adj,inv,size);
}

int transpose(int mat[5][5],int inv[5][5],int size)


{
int i,j;
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
{
inv[j][i]=mat[i][j];
}
}
return inv;
}
int a_inverse(int x)
{
int i;
for(i=1;i>0;i++) if((i*x) % 26 == 1) break;
return i;
}

Das könnte Ihnen auch gefallen