Worksheet 1.3
Worksheet 1.3
: 3
2. Algorithm/Flowchart:
Hill cipher is a polygraphic substitution cipher based on Linear Algebra. It was invented by
Lester S. Hill in the year 1929. In simple words, it is a cryptography algorithm used to encrypt
and decrypt data for the purpose of data security.
The algorithm uses matrix calculations used in Linear Algebra. It is easier to understand if we
have the basic knowledge of matrix multiplication, modulo calculation, and the inverse
calculation of matrices.
Encryption: The given message string and key string is represented in the form of matrix. Then
key and message matrix are multiplied. Finally modulo 26 is taken for each element of matrix
obtained by multiplication. The key matrix that we take here should be invertible, otherwise
decryption will not be possible.
Decryption: The encrypted message matrix is multiplied by the inverse of key matrix and
finally its modulo 26 is taken to get the original message
3. Code:
#include<iostream>
#include<math.h>
int main() {
getKeyMessage();
encryption();
decryption();
return 0;
}
void encryption() {
int i, j, k;
for(i = 0; i < 3; i++)
for(j = 0; j < 1; j++)
for(k = 0; k < 3; k++)
encrypt[i][j] = encrypt[i][j] + a[i][k] * mes[k][j];
cout<<"\nEncrypted string is: ";
for(i = 0; i < 3; i++)
cout<<(char)(fmod(encrypt[i][0], 26) + 97);
}
void decryption() {
int i, j, k;
inverse();
for(i = 0; i < 3; i++)
for(j = 0; j < 1; j++)
for(k = 0; k < 3; k++)
decrypt[i][j] = decrypt[i][j] + b[i][k] * encrypt[k][j];
cout<<"\nDecrypted string is: ";
for(i = 0; i < 3; i++)
cout<<(char)(fmod(decrypt[i][0], 26) + 97);
cout<<"\n";
}
void getKeyMessage() {
int i, j;
char msg[3];
cout<<"Enter 3x3 inversible matrix:\n";
for(i = 0; i < 3; i++)
for(j = 0; j < 3; j++) {
cin>>a[i][j];
c[i][j] = a[i][j];
}
cout<<"\nEnter a 3 letter string: ";
cin>>msg;
for(i = 0; i < 3; i++)
mes[i][0] = msg[i] - 97;
}
void inverse() {
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 = c[i][k];
q = c[k][k];
for(j = 0; j < 3; j++) {
if(i != k) {
c[i][j] = c[i][j]*q - p*c[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] / c[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";
}
}
Code Snipett:
4. Output:
Learning outcomes: