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");

}

}

}