C++ Program to Implement the Hill Cypher



Based on linear algebra Hill cipher is a polygraphic substitution cipher in cryptography.

To encrypt message: The key string and message string are represented as matrix form. They are multiplied then, against modulo 26. The key matrix should have inverse to decrypt the message.

To decrypt message: The encrypted message is multiplied by inverse key matrix used for encryption against modulo 26 to get decrypt message.

For example

Key matrix

1 0 1 2 4 0 3 5 6

Message string ‘ABC’ in matrix form −

0 1 2

For encryption

After multiplying above two matrices we get,

2 4 17

Which will be the encrypted message ‘CER’

For decryption

Inverse of key matrix is −

1.09091 0.227273 -0.181818 -0.545455 0.136364 0.0909091 -0.0909091 -0.227273 0.181818

Now after multiplying the inverse matrix of key matrix with encrypted message matrix is −

0 1 2

Which is the original message string is ‘ABC’.

Here, is a C++ program to implement above example.

Algorithms

Begin Function getKeyMatrix()    For i = 0 to 2       For j = 0 to 3       Take the elements of matrix a[i][j] as input.          m[i][j] = a[i][j]       done    done    Take the message string as user input.    For i = 0 to 2       msg[i][0] = mes[i] - 65    done End Begin Function encrypt()    For i = 0 to 2       For j = 0 to 0          For k = 0 to 2             en[i][j] = en[i][j] + a[i][k] * msg[k][j]    Take modulo 26 for each element of the matrix obtained by multiplication and print the encrypted message. End Begin Function decrypt()    Call function inversematrix()    For i = 0 to 2       For j = 0 to 0          For k = 0 to 2             de[i][j] = de[i][j] + b[i][k] * en[k][j] Take modulo 26 of the multiplication to get the original message.

Example

#include<iostream> #include<math.h> using namespace std; float en[3][1], de[3][1], a[3][3], b[3][3], msg[3][1], m[3][3]; void getKeyMatrix() { //get key and message from user    int i, j;    char mes[3];    cout<<"Enter 3x3 matrix for key (should have inverse):\n";    for(i = 0; i < 3; i++)    for(j = 0; j < 3; j++) {       cin>>a[i][j];       m[i][j] = a[i][j];    }    cout<<"\nEnter a string of 3 letter(use A through Z): ";    cin>>mes;    for(i = 0; i < 3; i++)    msg[i][0] = mes[i] - 65; } void encrypt() { //encrypts the message    int i, j, k;    for(i = 0; i < 3; i++)    for(j = 0; j < 1; j++)    for(k = 0; k < 3; k++)    en[i][j] = en[i][j] + a[i][k] * msg[k][j];    cout<<"\nEncrypted string is: ";    for(i = 0; i < 3; i++)    cout<<(char)(fmod(en[i][0], 26) + 65); //modulo 26 is taken for each element of the matrix obtained by multiplication } void inversematrix() { //find inverse of key matrix    int i, j, k;    float p, q;    for(i = 0; i < 3; i++)    for(j = 0; j < 3; j++) {       if(i == j)          b[i][j]=1;       else          b[i][j]=0;    }    for(k = 0; k < 3; k++) {       for(i = 0; i < 3; i++) {          p = m[i][k];          q = m[k][k];          for(j = 0; j < 3; j++) {             if(i != k) {                m[i][j] = m[i][j]*q - p*m[k][j];                b[i][j] = b[i][j]*q - p*b[k][j];             }          }       }    }    for(i = 0; i < 3; i++)    for(j = 0; j < 3; j++)    b[i][j] = b[i][j] / m[i][i];    cout<<"\n\nInverse Matrix is:\n";    for(i = 0; i < 3; i++) {       for(j = 0; j < 3; j++)       cout<<b[i][j]<<" ";       cout<<"\n";    } } void decrypt() { //decrypt the message    int i, j, k;    inversematrix();    for(i = 0; i < 3; i++)    for(j = 0; j < 1; j++)    for(k = 0; k < 3; k++)    de[i][j] = de[i][j] + b[i][k] * en[k][j];    cout<<"\nDecrypted string is: ";    for(i = 0; i < 3; i++)    cout<<(char)(fmod(de[i][0], 26) + 65); //modulo 26 is taken to get the original message    cout<<"\n"; } int main() {    getKeyMatrix();    encrypt();    decrypt(); }

Output

Enter 3x3 matrix for key (should have inverse): 1 0 1 2 4 0 3 5 6 Enter a string of 3 letter(use A through Z): ABC Encrypted string is: CER Inverse Matrix is: 1.09091 0.227273 -0.181818 -0.545455 0.136364 0.0909091 -0.0909091 -0.227273 0.181818 Decrypted string is: ABC
Updated on: 2019-07-30T22:30:26+05:30

8K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements