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;
}
OUTPUT

Comments

Popular posts from this blog

How To Get Jio Prime Membership @ Rs 49 – Mobikwik

Reliance Jio Offers 100% Cashback For Prime Membership; Upto 120 GB Free

euclidean Algorithm to find GCD