रेखीय बीजगणित पर आधारित हिल सिफर क्रिप्टोग्राफी में एक पॉलीग्राफिक प्रतिस्थापन सिफर है।
संदेश एन्क्रिप्ट करने के लिए: कुंजी स्ट्रिंग और संदेश स्ट्रिंग को मैट्रिक्स रूप के रूप में दर्शाया जाता है। फिर उन्हें मॉड्यूलो 26 के विरुद्ध गुणा किया जाता है। कुंजी मैट्रिक्स को संदेश को डिक्रिप्ट करने के लिए उलटा होना चाहिए।
संदेश को डिक्रिप्ट करने के लिए: एन्क्रिप्ट किए गए संदेश को डिक्रिप्ट संदेश प्राप्त करने के लिए मॉड्यूल 26 के विरुद्ध एन्क्रिप्शन के लिए उपयोग किए जाने वाले उलटा कुंजी मैट्रिक्स से गुणा किया जाता है।
उदाहरण के लिए
कुंजी मैट्रिक्स
1 0 1 2 4 0 3 5 6
संदेश स्ट्रिंग 'एबीसी' मैट्रिक्स रूप में -
0 1 2
एन्क्रिप्शन के लिए
ऊपर दिए गए दो आव्यूहों को गुणा करने पर हमें मिलता है,
2 4 17
कौन सा एन्क्रिप्टेड संदेश 'सीईआर' होगा
डिक्रिप्शन के लिए
कुंजी मैट्रिक्स का व्युत्क्रम है -
1.09091 0.227273 -0.181818 -0.545455 0.136364 0.0909091 -0.0909091 -0.227273 0.181818
अब एन्क्रिप्टेड संदेश मैट्रिक्स के साथ कुंजी मैट्रिक्स के व्युत्क्रम मैट्रिक्स को गुणा करने के बाद -
0 1 2
मूल संदेश स्ट्रिंग 'एबीसी' है।
यहाँ, उपरोक्त उदाहरण को लागू करने के लिए एक C++ प्रोग्राम है।
एल्गोरिदम
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.
उदाहरण
#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(); }
आउटपुट
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