লিনিয়ার অ্যালজেব্রার (linear algebra) ভিত্তিক হিল সাইফার (Hill cipher) ক্রিপ্টোগ্রাফিতে একটি পলিগ্রাফিক সাবস্টিটিউশন সাইফার (polygraphic substitution cipher)।
মেসেজ এনক্রিপ্ট করতে: কী স্ট্রিং এবং মেসেজ স্ট্রিংকে ম্যাট্রিক্স ফর্মে রিপ্রেজেন্ট করা হয়। সেগুলো গুণ করা হয়, তারপর মডুলো 26 নেওয়া হয়। কী ম্যাট্রিক্সের ইনভার্স থাকতে হবে ডিক্রিপশনের জন্য।
মেসেজ ডিক্রিপ্ট করতে: এনক্রিপ্টেড মেসেজকে ইনভার্স কী ম্যাট্রিক্স দিয়ে গুণ করা হয় মডুলো 26-এ যাতে মূল মেসেজ পাওয়া যায়।
উদাহরণ
কী ম্যাট্রিক্স
1 0 1 2 4 0 3 5 6
মেসেজ স্ট্রিং 'ABC' ম্যাট্রিক্স ফর্মে:
0 1 2
এনক্রিপশনের জন্য
উপরোক্ত দুটি ম্যাট্রিক্স গুণ করলে পাওয়া যায়:
2 4 17
যা হবে এনক্রিপ্টেড মেসেজ 'CER'।
ডিক্রিপশনের জন্য
কী ম্যাট্রিক্সের ইনভার্স:
1.09091 0.227273 -0.181818 -0.545455 0.136364 0.0909091 -0.0909091 -0.227273 0.181818
ইনভার্স ম্যাট্রিক্স ও এনক্রিপ্টেড মেসেজ ম্যাট্রিক্স গুণ করলে:
0 1 2
যা মূল মেসেজ স্ট্রিং 'ABC'।
এলগরিদম
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 and print 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 to get original message.
End
উদাহরণ
#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() {
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() {
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);
}
void inversematrix() {
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() {
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);
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