অ্যাফাইন সাইফারে (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