কম্পিউটার টিউটোরিয়াল

C++-এ হিল সাইফার (Hill Cipher) ইমপ্লিমেন্টেশন


লিনিয়ার অ্যালজেব্রার (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
  1. C++-এ ভিজিনার সাইফার (Vigenere Cipher) ইমপ্লিমেন্টেশন

  2. C++-এ সিজার সাইফার (Caesar Cipher) ইমপ্লিমেন্টেশন

  3. C++ প্রোগ্রাম: AVL ট্রি ইমপ্লিমেন্টেশন

  4. C++ STL-এ Set Symmetric Difference বাস্তবায়ন