Hill Cipher
Here we have some details regarding Hill Cipher.
finding key
/*
plain_text matrix contains the plain text in column wise manner,
cypher matrix contains cypher text in same column wise manner.
run code and one can find the key from output " key is"........
*/
#include <stdio.h>
int main()
{
int plain_text[3][3]={{12,0,3},{20,11,7},{17,8,0}};// the matrix that is entered by user
float transpose[3][3];//the transpose of a matrix plain_text
float adjoint[3][3];//the adjoint matrix of transpose of a matrix plain_text not adjoint of plain_text
double X[3][3];//the inverse
int y[3][3];
int result[3][3];
int cypher[3][3]={{4,9,8},{11,24,15},{14,1,11}};
int i,ii,j,k,l,m,a,s=3,b=0,arr[3][3],test_cypher[3][3]={{17,0,0},{0,0,0},{13,0,0}};
float x,n=0,c;//n is the determinant of plain_text
for(i=0;i<3;i++)
{ printf("\n");
for(j=0;j<3;j++)
{
transpose[i][j]=0;
adjoint[i][j]=0;
arr[i][j]=0;
}
}
for(i=0,j=0;j<3;j++)
{
if(j==2)
n+=plain_text[i][j]*plain_text[i+1][0]*plain_text[i+2][1];
else if(j==1)
n+=plain_text[i][j]*plain_text[i+1][j+1]*plain_text[i+2][0];
else
n+=plain_text[i][j]*plain_text[i+1][j+1]*plain_text[i+2][j+2];
}
for(i=2,j=0;j<3;j++)
{
if(j==2)
n-=plain_text[i][j]*plain_text[i-1][0]*plain_text[i-2][1];
else if(j==1)
n-=plain_text[i][j]*plain_text[i-1][j+1]*plain_text[i-2][0];
else
n-=plain_text[i][j]*plain_text[i-1][j+1]*plain_text[i-2][j+2];
}
printf("\n========== The plaintext is===================================\n");
for(i=0;i<3;i++)
{
printf("\n");
for(j=0;j<3;j++)
{
printf(" plain_text[%d][%d]= %d ",i,j,plain_text[i][j]);
}
}
printf("\nThe determinant of matrix plain_text is %.2f \n",n);
if(n!=0) x=1.0/n;
else
{
printf("Division by 0, not good!\n");
printf("=================================================================\n\n");
return 0;
}
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
transpose[i][j]=plain_text[j][i];
}
}
adjoint[0][0]=transpose[1][1]*transpose[2][2]-(transpose[2][1]*transpose[1][2]);
adjoint[0][1]=(-1)*(transpose[1][0]*transpose[2][2]-(transpose[2][0]*transpose[1][2]));
adjoint[0][2]=transpose[1][0]*transpose[2][1]-(transpose[2][0]*transpose[1][1]);
adjoint[1][0]=(-1)*(transpose[0][1]*transpose[2][2]-transpose[2][1]*transpose[0][2]);
adjoint[1][1]=transpose[0][0]*transpose[2][2]-transpose[2][0]*transpose[0][2];
adjoint[1][2]=(-1)*(transpose[0][0]*transpose[2][1]-transpose[2][0]*transpose[0][1]);
adjoint[2][0]=transpose[0][1]*transpose[1][2]-transpose[1][1]*transpose[0][2];
adjoint[2][1]=(-1)*(transpose[0][0]*transpose[1][2]-transpose[1][0]*transpose[0][2]);
adjoint[2][2]=transpose[0][0]*transpose[1][1]-transpose[1][0]*transpose[0][1];
ii=0;
while(1)
{
ii++;
b=(1-ii*n );
b=b%26;
if(b==0)
{
printf("\n mod of -ve %d\n",ii);
break;
}
}
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{ c=adjoint[i][j]*ii;
b=c;
b=b%26;
if(b<0)
b=b+26;
arr[i][j]=b;
}
}
printf("\n==========inv of plain txt ==========\n");
for(i=0;i<3;i++)
{ printf("\n");
for(j=0;j<3;j++)
{
printf(" %d",arr[i][j]);
}
}
printf("\n========== I matrix ==========\n");
for(i=0;i<s;i++)
{
for(j=0;j<s;j++)
{
result[i][j]=0;
for(k=0;k<s;k++)
{
result[i][j]+=plain_text[i][k]*arr[k][j];
}
}
}
for(i=0;i<s;i++)
{
for(j=0;j<s;j++)
{
printf("%d ",result[i][j]%26);
}
printf("\n");
}
printf("\n========== key is ==========\n");
for(i=0;i<s;i++)
{
for(j=0;j<s;j++)
{
result[i][j]=0;
for(k=0;k<s;k++)
{
result[i][j]+=cypher[i][k]*arr[k][j];
}
}
}
for(i=0;i<s;i++)
{
for(j=0;j<s;j++)
{
printf("%d ",result[i][j]%26);
}
printf("\n");
}
printf("\n========== kex X plaintext ==========\n");
for(i=0;i<s;i++)
{
for(j=0;j<s;j++)
{
arr[i][j]=0;
for(k=0;k<s;k++)
{
arr[i][j]+=result[i][k]*test_cypher[k][j];
}
}
}
printf("\n");
for(i=0;i<s;i++)
{
for(j=0;j<s;j++)
{
printf("%d ",arr[i][j]%26);
}
printf("\n");
}
return 0;
}
generating cipher text using key
/*
if one can get key from the above code its easy to get cipher text from key.
just enter key in column wise manner as earlier and run this code, input 3 plain text , corresponding cypher text can obtained.
*/
#include<stdio.h>
int key[3][3]={{7,13,6},{15,18,1},{0,9,4}};
int plaintext[3][3]={{0,0,0},{0,0,0},{0,0,0}};
int result[3][3];
int main()
{
int i,j,k,l,m,a,s=3,n=2;
printf("KEY\n");
for(i=0;i<s;i++)
{
for(j=0;j<s;j++)
{
printf("%d ",key[i][j]);
}
printf("\n");
}
while(1)
{
printf("enter 3 element for plain text\n");
for(i=0;i<s;i++)
{
scanf("%d",&a);
plaintext[i][0]=a;
}
for(i=0;i<s;i++)
{
for(j=0;j<s;j++)
{
result[i][j]=0;
for(k=0;k<s;k++)
{
result[i][j]+=key[i][k]*plaintext[k][j];
}
}
}
printf("cyphr txt:\n");
for(i=0;i<s;i++)
{
printf("%d ",result[i][0]%26);
printf("\n");
}
}
}