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

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


অ্যাফাইন সাইফারে (Affine cipher), অ্যালফাবেটের প্রতিটি অক্ষর তার न्यूमেরিক সমতুল্যে ম্যাপ হয়, যা একটি মোনোআলফাবেটিক সাবস্টিটিউশন সাইফার (monoalphabetic substitution cipher)। এনক্রিপশন একটি সিম্পল ম্যাথেমেটিক্যাল ফাংশন দিয়ে করা হয় এবং আবার অক্ষরে রূপান্তরিত হয়।

সাইজ `m` এর অ্যালফাবেটের অক্ষরগুলো প্রথমে 0 থেকে `m-1` রেঞ্জের ইন্টিজারে ম্যাপ করা হয়। অ্যাফাইন সাইফারের 'কী' (key) হলো দুটি নম্বর `a` এবং `b`। `a` কে `m`-এর সাথে রিলেটিভলি প্রাইম (relatively prime) হতে হবে।

এনক্রিপশন (Encryption)

ইন্টিজারকে মডুলার অ্যারিথমেটিক (modular arithmetic) ব্যবহার করে ট্রান্সফর্ম করা হয় যাতে প্রতিটি প্লেইনটেক্স্ট লেটার একটি সাইফারটেক্স্ট লেটারের সাথে মেলে। একটি সিঙ্গেল লেটারের জন্য এনক্রিপশন ফাংশন:

E(x) = (a*x + b) mod m
m: অ্যালফাবেটের সাইজ
a, b: সাইফারের কী

ডিক্রিপশন (Decryption)

ডিক্রিপশনে প্রতিটি সাইফারটেক্স্ট লেটারকে তাদের ইন্টিজার ভ্যালুতে রূপান্তর করা হয়। ডিক্রিপশন ফাংশন:

D(x) = a^-1 * (x - b) mod m
a^-1: a-এর মডুলার মাল্টিপ্লিকেটিভ ইনভার্স (modular multiplicative inverse) মডুলো m। অর্থাৎ, এটি 1 = a*a^-1 mod m সমীকরণকে স্যাটিসফাই করে।

নিচে এই প্রসেস ইমপ্লিমেন্ট করার C++ প্রোগ্রাম দেওয়া হলো।

এলগরিদম

Begin Function encryption(string m)
    for i = 0 to m.length()-1
        if(m[i] != ' ')
            c = c + (char) ((((a * (m[i]-'A') ) + b) % 26) + 'A')
        else
            c += m[i]
    return c
End

Begin Function decryption(string c)
    Initialize a_inverse = 0, flag = 0
    For i = 0 to 25
        flag = (a * i) % 26
        if (flag == 1)
            a_inverse = i
    done
    For i = 0 to c.length() - 1
        if(c[i] != ' ')
            m = m + (char) (((a_inverse * ((c[i]+'A' - b)) % 26)) + 'A')
        else
            m = m + c[i]
    done
End

উদাহরণ

#include <bits/stdc++.h>
using namespace std;

static int a = 7;
static int b = 6;

string encryption(string m) {
    string c = "";
    for (int i = 0; i < m.length(); i++) {
        if(m[i] != ' ')
            c = c + (char) ((((a * (m[i]-'A') ) + b) % 26) + 'A');
        else
            c += m[i];
    }
    return c;
}

string decryption(string c) {
    string m = "";
    int a_inverse = 0;
    int flag = 0;
    for (int i = 0; i < 26; i++) {
        flag = (a * i) % 26;
        if (flag == 1) {
            a_inverse = i;
        }
    }
    for (int i = 0; i < c.length(); i++) {
        if(c[i] != ' ')
            m = m + (char) (((a_inverse * ((c[i]+'A' - b)) % 26)) + 'A');
        else
            m += c[i];
    }
    return m;
}

int main(void) {
    string msg = "TUTORIALSPOINT";
    string c = encryption(msg);
    cout << "Encrypted Message is : " << c << endl;
    cout << "Decrypted Message is: " << decryption(c);
    return 0;
}

আউটপুট

Encrypted Message is : JQJAVKGFCHAKTJ
Decrypted Message is: TUTORIALSPOINT
  1. C++ প্রোগ্রাম: AVL ট্রি ইমপ্লিমেন্টেশন

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

  3. C++ প্রোগ্রাম: অ্যাডজেসেন্সি ম্যাট্রিক্স বাস্তবায়ন

  4. C++ প্রোগ্রাম: অ্যাডজেসেন্সি লিস্ট বাস্তবায়ন