Hill cipher substitution
AIM:
To implement a program to encrypt and decrypt using the Hill cipher substitution
technique.
CODE
#include<iostream>
#include<cstring>
using namespace std;
int main(){
int i,j,k,matrix[2][2],inverse[2][2],det,detinv;
char str[20],encrypted[20],decrypted[20],key[4];
cout<<"Enter key : ";
cin>>key;
cin.ignore();
for(i=0;i<2;i++){
for(j=0;j<2;j++){
matrix[i][j]=key[i*2+j]-97;
}
}
cout<<"Encryption Matrix : "<<endl;
for(i=0;i<2;i++){
for(j=0;j<2;j++){
cout<<matrix[i][j]<<"\t";
}
cout<<endl;
}
det=(676+matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0])%26;
if(det==0||det%2==0||det%13==0){
cout<<"Invalid Key";
return -1;
}
cout<<"Determinant : "<<det<<endl;
i=1;
while(1){
if((det*i)%26==1){
break;
}
i++;
}
detinv=i;
cout<<"Determinant Inverse : "<<detinv<<endl;
cout<<"Enter string : ";
cin.getline(str,sizeof(str));
//remove spaces
i=0;
while(i<strlen(str)){
if(str[i]==' '){
for(j=i;j<strlen(str);j++){
str[j]=str[j+1];
}
}
i++;
}
cout<<"Spaces removed : "<<str<<endl;
//make length even
if(strlen(str)%2!=0){
str[strlen(str)+1]='\0';
str[strlen(str)]='x';
}
cout<<"Even length : "<<str<<endl;
//encryption
i=0;
while(i<strlen(str)){
encrypted[i]=(matrix[0][0]*(str[i]-97)+matrix[0][1]*(str[i+1]-97))%26+97;
encrypted[i+1]=(matrix[1][0]*(str[i]-97)+matrix[1][1]*(str[i+1]-97))%26+97;
i+=2;
}
encrypted[strlen(str)]='\0';
cout<<"Encrypted matrix : "<<encrypted<<endl;
//decryption
decrypted[strlen(encrypted)]='\0';
inverse[0][0]=(26+matrix[1][1])%26;
inverse[0][1]=(26-matrix[0][1])%26;
inverse[1][0]=(26-matrix[1][0])%26;
inverse[1][1]=(26+matrix[0][0])%26;
for(i=0;i<2;i++){
for(j=0;j<2;j++){
inverse[i][j]=(detinv*inverse[i][j])%26;
}
}
i=0;
while(i<strlen(str)){
decrypted[i]=(inverse[0][0]*(encrypted[i]-97)+inverse[0][1]*(encrypted[i+1]-97))%26+97;
decrypted[i+1]=(inverse[1][0]*(encrypted[i]-97)+inverse[1][1]*(encrypted[i+1]-97))%26+97;
i+=2;
}
cout<<"Decrypted matrix : "<<decrypted<<endl;
return 0;
}
To implement a program to encrypt and decrypt using the Hill cipher substitution
technique.
CODE
#include<iostream>
#include<cstring>
using namespace std;
int main(){
int i,j,k,matrix[2][2],inverse[2][2],det,detinv;
char str[20],encrypted[20],decrypted[20],key[4];
cout<<"Enter key : ";
cin>>key;
cin.ignore();
for(i=0;i<2;i++){
for(j=0;j<2;j++){
matrix[i][j]=key[i*2+j]-97;
}
}
cout<<"Encryption Matrix : "<<endl;
for(i=0;i<2;i++){
for(j=0;j<2;j++){
cout<<matrix[i][j]<<"\t";
}
cout<<endl;
}
det=(676+matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0])%26;
if(det==0||det%2==0||det%13==0){
cout<<"Invalid Key";
return -1;
}
cout<<"Determinant : "<<det<<endl;
i=1;
while(1){
if((det*i)%26==1){
break;
}
i++;
}
detinv=i;
cout<<"Determinant Inverse : "<<detinv<<endl;
cout<<"Enter string : ";
cin.getline(str,sizeof(str));
//remove spaces
i=0;
while(i<strlen(str)){
if(str[i]==' '){
for(j=i;j<strlen(str);j++){
str[j]=str[j+1];
}
}
i++;
}
cout<<"Spaces removed : "<<str<<endl;
//make length even
if(strlen(str)%2!=0){
str[strlen(str)+1]='\0';
str[strlen(str)]='x';
}
cout<<"Even length : "<<str<<endl;
//encryption
i=0;
while(i<strlen(str)){
encrypted[i]=(matrix[0][0]*(str[i]-97)+matrix[0][1]*(str[i+1]-97))%26+97;
encrypted[i+1]=(matrix[1][0]*(str[i]-97)+matrix[1][1]*(str[i+1]-97))%26+97;
i+=2;
}
encrypted[strlen(str)]='\0';
cout<<"Encrypted matrix : "<<encrypted<<endl;
//decryption
decrypted[strlen(encrypted)]='\0';
inverse[0][0]=(26+matrix[1][1])%26;
inverse[0][1]=(26-matrix[0][1])%26;
inverse[1][0]=(26-matrix[1][0])%26;
inverse[1][1]=(26+matrix[0][0])%26;
for(i=0;i<2;i++){
for(j=0;j<2;j++){
inverse[i][j]=(detinv*inverse[i][j])%26;
}
}
i=0;
while(i<strlen(str)){
decrypted[i]=(inverse[0][0]*(encrypted[i]-97)+inverse[0][1]*(encrypted[i+1]-97))%26+97;
decrypted[i+1]=(inverse[1][0]*(encrypted[i]-97)+inverse[1][1]*(encrypted[i+1]-97))%26+97;
i+=2;
}
cout<<"Decrypted matrix : "<<decrypted<<endl;
return 0;
}
OUTPUT
Comments
Post a Comment