এই স্কিমে, সহজ প্রতিস্থাপন সাইফারের ক্ষেত্রে একক অক্ষরের পরিবর্তে অক্ষরের জোড়া এনক্রিপ্ট করা হয়।
প্লেফেয়ার সাইফারে, প্রাথমিকভাবে একটি কী টেবিল তৈরি করা হয়। মূল সারণী হল একটি 5×5 বর্ণমালার গ্রিড যা প্লেইনটেক্সট এনক্রিপ্ট করার চাবিকাঠি হিসেবে কাজ করে। 25টি বর্ণমালার প্রত্যেকটি অবশ্যই অনন্য হতে হবে এবং বর্ণমালার একটি অক্ষর (সাধারণত J) টেবিল থেকে বাদ দেওয়া হয় কারণ আমাদের 26টির পরিবর্তে শুধুমাত্র 25টি বর্ণমালা প্রয়োজন৷ যদি প্লেইনটেক্সট J থাকে, তাহলে এটি I দ্বারা প্রতিস্থাপিত হবে৷
প্রেরক এবং প্রাপক একটি নির্দিষ্ট কী নিয়ে সিদ্ধান্ত নেন, বলুন 'টিউটোরিয়াল'। একটি কী টেবিলে, নকল অক্ষর বাদ দিয়ে সারণিতে প্রথম অক্ষর (বাম থেকে ডানে যাওয়া) হল বাক্যাংশ। টেবিলের বাকি অংশ প্রাকৃতিক ক্রমে বর্ণমালার অবশিষ্ট অক্ষর দিয়ে পূর্ণ হবে। মূল টেবিলটি −
হিসাবে কাজ করে
প্লেফেয়ার সাইফারের প্রক্রিয়া
প্রথমত, একটি প্লেইনটেক্সট বার্তা দুটি অক্ষরের জোড়ায় বিভক্ত হয় (ডিগ্রাফ)। বিজোড় সংখ্যক অক্ষর থাকলে, শেষ অক্ষরের সাথে একটি Z যোগ করা হয়। আসুন আমরা বিবেচনা করি যে, আমরা "টাকা লুকান" বার্তাটি এনক্রিপ্ট করতে চাই। এটি −
হিসাবে লেখা হবেHI DE MO NE YZ
এনক্রিপশনের নিয়ম হল −
- যদি উভয় অক্ষর একই কলামে থাকে, তাহলে প্রতিটির নিচে অক্ষরটি নিন (নিচে থাকলে উপরের দিকে ফিরে যাওয়া) ‘H’ এবং ‘I’ একই কলামে রয়েছে, তাই প্রতিস্থাপনের জন্য তাদের নীচে অক্ষর নিন। HI → QC
- যদি উভয় অক্ষর একই সারিতে থাকে, তবে অক্ষরটিকে প্রতিটির ডানদিকে নিয়ে যান (যদি সবচেয়ে দূরে ডানদিকে থাকে তবে বাম দিকে ফিরে যান) 'D' এবং 'E' একই সারিতে থাকে, তাই অক্ষরটি পৃষ্ঠায় নিন তাদের প্রতিস্থাপনের অধিকার। DE → EF
- পূর্ববর্তী দুটি নিয়মের কোনোটিই সত্য না হলে, দুটি অক্ষর দিয়ে একটি আয়তক্ষেত্র তৈরি করুন এবং আয়তক্ষেত্রের অনুভূমিক বিপরীত কোণে অক্ষরগুলি নিন।
এই নিয়মগুলি ব্যবহার করে, 'টিউটোরিয়াল'-এর কী সহ 'হাইড মানি'-এর এনক্রিপশনের ফলাফল হবে −
QC EF NU MF ZV
প্লেফেয়ার সাইফার ডিক্রিপ্ট করা একই প্রক্রিয়া বিপরীতে করার মতোই সহজ। রিসিভারের একই কী আছে এবং একই কী টেবিল তৈরি করতে পারে এবং তারপর সেই কী ব্যবহার করে করা যেকোনো বার্তা ডিক্রিপ্ট করতে পারে।
প্লেফেয়ার সাইফার ব্যবহার করে একটি বার্তা এনকোড করার জন্য এখানে একটি C++ প্রোগ্রাম দেওয়া হয়েছে।
অ্যালগরিদম
BeginFunction void play(int dir )For it =msg.begin() to it!=msg.end() If ( getPos( *it++, j, k) ) যদি ( getPos( *it, p, q) ) যদি ( j ==p ) nmsg+=getChar( j, k + dir ) nmsg +=getChar( p, q + dir ) অন্যথায় যদি ( k ==q ) nmsg +=getChar( j + dir, k ) nmsg + =getChar( p + dir, q ) else nmsg +=getChar( p, k ) nmsg +=getChar( j, q ) সম্পন্ন হয়েছে msg =nmsgdoneEnd
উদাহরণ
#include#include Namespace std;class playfair { public:string msg; char n[5][5]; অকার্যকর খেলা (স্ট্রিং কে, স্ট্রিং টি, বুল এম, বুল ই) { তৈরি করুন এনকোডার( কে, এম); getText( t, m, e); if(e) play(1); অন্য খেলা (-1); ছাপা(); } ব্যক্তিগত:void play(int dir) { int j,k,p,q; স্ট্রিং nmsg; for( string::const_iterator it =msg.begin(); it !=msg.end(); it++ ) { if( getPos( *it++, j, k ) ) if( getPos( *it, p, q) { //একই সারির জন্য if( j ==p ) { nmsg+=getChar( j, k + dir); nmsg +=getChar( p, q + dir); } // একই কলামের জন্য অন্য যদি ( k ==q ) { nmsg +=getChar( j + dir, k); nmsg +=getChar( p + dir, q); } অন্য { nmsg +=getChar( p, k); nmsg +=getChar( j, q); } } } msg =nmsg; } void print() // সমাধানটি প্রিন্ট করুন { cout <<"\n\n সমাধান:" < =26 ) cout < 90) চালিয়ে যান; if(*it =='J' &&m) *it ='I'; অন্যথায় যদি (*it =='Q' &&!m) চালিয়ে যান; বার্তা +=*এটি; } if( e ) { স্ট্রিং nmsg =""; size_t len =msg.length(); জন্য( size_t x =0; x 90) চালিয়ে যান; যদি( ( *it =='J' &&m) || ( *it =='Q' &&!m ) ) চালিয়ে যান; if(s.find(*it) ==-1 ) s +=*it; } কপি( s.begin(), s.end(), &n[0][0]); }};int main(int argc, char* argv[] ) { স্ট্রিং k, i, msg; bool m, c; cout <<"এনক্রিপ্টি নাকি ডিসিপ্ট?"; getline (cin, i); c =( i[0] =='e' || i[0] =='E'); cout <<"একটি কী লিখুন:"; গেটলাইন (সিন, কে); cout <<"I <-> J (Y/N):"; getline (cin, i); m =( i[0] =='y' || i[0] =='Y'); cout <<"বার্তাটি লিখুন:"; getline (cin, msg); playfair pf; pf.play( k, msg,m, c); রিটার্ন সিস্টেম("পজ");}