Beruflich Dokumente
Kultur Dokumente
h>
#include<conio.h>
#include<ctype.h>
#include<math.h>
#define MAX 100
int
int
int
int
int
int
int
int
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];
}
}
}