ট্রান্সপজিশন সাইফারে আমরা দেখেছিলাম, বর্ণগুলোর অবস্থান পরিবর্তন করে সাইফার টেক্সট বানানোর উপায়। এর একটা বিকল্প হল সাবস্টিটিউশন সাইফার। এ ধরণের সাইফারের ক্ষেত্রে বর্ণের অবস্থান নয়, বরং বর্ণগুলোই বদলে দেওয়া হয়! এ ধরণের সাইফারের একটা প্রকৃষ্ট উদাহারণ হল সিজার সাইফার, যার প্রথম ব্যবহারকারী জুলিয়াস সিজার নিজে!

সিজার সাইফার

জুলিয়সা সিজার যা করতেন তা হল, একটি প্লেইন টেক্সট-এর প্রতিটি বর্ণের পরিবর্তে এর তিন ঘর পরবর্তী একটি বর্ণ বসাতেন। যেমনঃ

A হয়ে যেত D, B হয়ে যেত E

একটু ভেবে বল তো Z তাহলে কী হবে?

Z বদলে হয়ে যাবে C!

তাহলে এবার দেখা যাক, “SHOSHIKKHA”-র সাইফার টেক্সট কী হবে?

 

S V
H K
O R
S V
H K
I L
K N
K N
H K
A D

 

তাহলে পুরো শব্দটি দাঁড়াচ্ছে “VKRVKLNNKD”

কত সুন্দর একটি নামের কী যাচ্ছেতাই একটা অবস্থা। আরে, এটাই তো সাইফার টেক্সট বানানোর উদ্দেশ্য! 😀

সিজার তিন শব্দ পিছিয়েছিলেন। আমরা চাইলে দুই, চার যা খুশি এগিয়ে দিতে পারি, আবার পিছিয়েও দিতে পারি! তবে একটা ব্যাপার হল, রোমান (বা ইংরেজি) বর্ণমালার ক্ষেত্রে ২৫ ঘর সামনে যাওয়া যে কথা, এক ঘর পিছনে যাওয়া একই কথা! আবার, A কে ১৩ ঘর এগিয়ে দিলে আমরা পাব ১৪ নাম্বার বর্ণ। আবার, A কে এক ঘর পিছিয়ে পাব Z (২৬), এই Z-কে অবশিষ্ট (১৩-১) ঘর পিছালে পাব সেই ১৪। অর্থাৎ এগিয়ে-পিছিয়ে একই বর্ণ পাওয়ার ক্ষেত্রে প্যাটার্ণটা দাঁড়াচ্ছে এমনঃ যদি x ঘর এগিয়ে এবং y ঘর পিছিয়ে একই বর্ণ পাওয়া যায়, সে ক্ষেত্রে x+y = 26 () সর্বমোট বর্ণের সংখ্যা।

এবার যারা প্রোগ্রামিং পার, চল একটা সি কোড লিখে ফেলা যাক এনক্রিপশন-ডিক্রিপশনের! 😀

/*  এটা করার উদ্দেশ্য জুনিয়রদের প্রোগ্রামিং নিয়ে আগ্রহ বাড়ানো। তবে ধৈর্য না থাকলে স্কিপ করে চলে যেতে পার এই অংশটা। পরবর্তীতে ক্রিপ্টোগ্রাফি আলোচনায় এটার কোনো প্রভাব পড়বে না! */

আমাদের সুবিধা হল, আমরা দেখতেই পাচ্ছি, সিজার সাইফার অনুযায়ী ইংরেজীতে লেখা একটি সাইফার টেক্সট-এর সর্বোচ্চ ২৫ ধরণের রূপ হতে পারে। আমরা ডিক্রিপশনের ক্ষেত্রে ২৫-টা আলাদা টেক্সট জেনারেট করে কোনটা অর্থবহ সেটা দেখলেই হয়ে যাবে! আর এনক্রিপশনের কাজ তো আরও সোজা। ইউজারকে বলবো কত ঘর এগিয়ে বা পিছিয়ে দিতে চায়, সেটা বলতে। এরপর সে অনুযায়ী কাজ করবো। তো কথা না বাড়িয়ে কাজ শুরু করা যাক!

আমাদের প্রথম কাজ হবে একটা ইউজার ইন্টারফেস বানানো। যেটা ইউজারকে জিজ্ঞেস করবে, সে এনক্রিপ্ট করতে চায় নাকি ডিক্রিপ্ট। এরপর আমরা একটা if-else if-else ল্যাডার তৈরি করবে। সে যদি এনক্রিপ্ট করতে চায়, সে অনুযায়ী কাজ করবো। ডিক্রিপ্ট করতে চাইলে এনক্রিপ্ট করে দিব। আর ভুল ইনপুট দিলে তাকে ভদ্রভাবে(!) তার ভুল বুঝিয়ে দিয়ে আবার শুরুতে ফিরে যাব!

তো আমাদের কোডের বেসিক স্ট্রাকচারটা হবে নিচের মতঃ

#include <stdio.h>
int main() {
    printf("What operation do you want to execute?\n");
    printf("Press 1 for Encryption.\n");
    printf("Press 2 for Decryption.\n");
    int i;
    scanf("%d", &i);
    if (i==1) {

    }
    else if (i==2) {

    }
    else {
        printf("Vai thik moto input den na ken? :'(\n");
        printf("Abar notun kore shuru koren!\n\n");
        // nicher kaj ta interesting na? Ki hobe bolo to? :p
        main();
    }
    return 0;
}

এবার শুরু আমাদের মূল কাজ। 1 প্রেস করলে আমরা এনক্রিপশনের কাজ করবো। এনক্রিপশনের শুরুতেই আমাদের জানতে হবে সে এগিয়ে যেতে চায় নাকি পেছাতে, এবং কত ঘর সে সরাতে চায়। তো আমরা এটা ইউজার থেকে জেনে নিব দুইটা ভ্যারিয়েবলের সাহায্যে।

if (i==1) {
        int daanebaame, kotoghor;
        printf("Forward or backward?\n");
        printf("Press 1 for Forward.\n");
        printf("Press 2 for Backward.\n")
        scanf("%d", &daanebaame);

        printf("How many positions to move?\n");
        scanf("%d", &kotoghor);

        // nicher kaj ta keno korchi bolo to? 
        if (daanebaame == 2) {
            kotoghor = 26-kotoghor;
        }
    }

এখানে “nicher kaj ta keno korchi bolo to?”-এর নিচের কাজটা কেন করছি বুঝেছ তো? কারণ আমরা জানি x ঘর পিছিয়ে যাওয়া যে কথা, 26-x ঘর সামনে যাওয়া একই কথা! তাই আমরা শুধু সামনে যাওয়ার কোডটা লিখেই মুক্তি পেতে চাই!

তবে এই কোডের সবচেয়ে বড় ইনএফিসিয়েন্সি হল ইউজার যদি বলে ১ ঘর পেছাতে, আমরা ২৫ ঘর সামনে যাব! অর্থাৎ ২৫ গুণ বেশি কাজ করতে হবে আমাদের! যদিও এটা খুবই ক্ষতিকর, তবুও আমি অলস বলে বাড়তি কাজটা করতে চাচ্ছি না! 😉

তোমার কাজ হবে সামনে পিছনে দুই দিকে যাওয়ার কোড আলাদাভাবে লেখা। পারবে না?

এবার আমাদের বাকি কাজ হলঃ

প্রথমত, gets() ব্যবহার করে ইনপুট নিয়ে নেওয়া। আমরা ধরে নিব টেক্সটের সাইজ ১০০ বর্ণের বেশি হবে না।

যত দূর যেতে বলছে, তত দূর বর্ণগুলোকে সরিয়ে দেওয়া। যদি সেটা Z অতিক্রম করে যায়, সেক্ষেত্রে Z পর্যন্ত যেতে যা লাগে, সেটা ব্যবহার করে ফেলে বাকি ঘরগুলো A থেকে ঘুরিয়ে আনা। কাজটা সহজ। ধরা যাক, আমাদের পরীক্ষণীয় বর্ণ ch ভ্যারিয়েবলে আছে। আমরা ASCII-তে চেক করবো ch + kotoghor > ‘Z’ কি না। যদি এটা সত্য হয় সেক্ষেত্রে আমরা সাইফার টেক্সটের ch’ = ‘A’ +  kotoghor – (‘Z’-ch) লিখে দিব!

বুঝতে কষ্ট হচ্ছে? ধর আমাদের বর্তমান বর্ণ ch = X

kotoghor  = 5

তাহলে ch’ এর মান হবে, ch’ = ‘A’ + 5 – (‘Z’ –  ‘X’) = ‘A’ + 5-2 = ‘D’

এবার এনক্রিপশনের কোডটা শেষ করে নেওয়া যাক তাহলেঃ

if (i==1) {
        int daanebaame, kotoghor;
        printf("Forward or backward?\n");
        printf("Press 1 for Forward.\n");
        printf("Press 2 for Backward.\n");
        scanf("%d", &daanebaame);
        printf("How many positions to move?\n");
        scanf("%d", &kotoghor);
        // nicher kaj ta keno korchi bolo to?
        if (daanebaame == 2) {
            kotoghor = 26-kotoghor;
        }
        char plaintext[100];
        char cyphertext[100];
        getchar(); // eta dite hoyeche ekishathe gets ar scanf use korar karone. google korle aro jante parbe!
        gets(plaintext);
        int a,len = strlen(plaintext);
        for (a=0; a<len;a++) {
            if (plaintext[a] + kotoghor<='Z') cyphertext[a] = plaintext[a] + kotoghor;
            else cyphertext[a] = 'A' + kotoghor - ('Z'-plaintext[a]);
        }
        cyphertext[len] = '\0';
        printf("Your desired Encrypted text is:\n%s\n", cyphertext);
    }

এবার পালা ডিক্রিপশনের! এ কাজটা সহজ। আমরা শুধু একটা টেক্সট ইনপুট নিয়ে ২৫ লাইনে ২৫ টা সম্ভাব্য প্লেইন টেক্সট আউটপুট দিব। কথা না বাড়িয়ে কোডটাই দিয়ে দিচ্ছি সরাসরি! আমাদের ডিক্রিপশনের কোডটা হল এমনঃ

else if (i==2) {
        char cypher[100], plain[100];
        getchar();
        printf("Cypher text please?\n");
        gets(cypher);
        int ghor,a,len = strlen(cypher);
        for (ghor=1; ghor<=25;ghor++) {
            printf("Forwarding %d position: ", ghor);
            for (a=0; a<len; a++) {
                if (cypher[a] + ghor<='Z') plain[a] = cypher[a] + ghor;
                else plain[a] = 'A' + ghor - ('Z'- cypher[a]);
            }
            plain[len] = '\0';
            printf("%s\n", plain);
        }
    }

পুরো কোডটি পাবে এই লিংকে

এবার ফিরে আসা যাক আমাদের মূল আলোচনায়!

কামসূত্র সাইফার

এনক্রিপশনের প্রাচীনতম নিদর্শনগুলোর একটি হল কামসূত্র সাইফার। কামসূত্র লিখিত রূপ পায় খ্রিস্টাব্দ চতুর্থ শতাব্দীতে। তবএ এটির ভিত্তি ছিল খ্রিস্টপূর্ব চতর্থ শতাব্দীর পাণ্ডুলিপি, অর্থাৎ সেটি আজ থেকে প্রায় ২৫০০ বছর আগের কথা!

তো এই কামসূত্রতে নারীদেরকে ৬৪ রকমের শিল্পে পারদর্শী হতে বলা হয়েছে। এই লিস্টে যেমন আছে দাবা খেলা থেকে কাপড় সেলায়-এর মত কাজ, তেমনি এর ৪৫-তম শিল্পের নাম হল mlecchita-vikalpa। এই mlecchita-vikalpa-এর ইংরেজী হল The Art of Secret Writing! কামসূত্রে কয়েকধরণের এনক্রিপশন মেথডের কথা বলা হয়েছে।

এর মধ্যে একটিতে প্রথমে বর্ণমালার বর্ণগুলো নিয়ে কয়েকটি জোড় বানাতে হয়। আমি সংস্কৃত জানি না, তাই ইংরেজীতেই উদাহারণ দিচ্ছি। ইংরেজীতে বর্ণ আছে ২৬ টা। তাহলে এক্ষেত্রে জোড়া বানানো সম্ভব ১৩ টা। আবার এই জোড়া বানানো সম্ভব 26C2 উপায়ে!

জোড়া বানানো শেষে প্লেইন টেক্সটের প্রতিটা বর্ণ তার জোড়া অনুযায়ী অপর বর্ণ দ্বারা প্রতিস্থাপন করে দিলেই কাজ শেষ! যেমন ধরা যাক, আমার একটি জোড়া হল  M আর N। তাহলে আমি যেখানে M পাব, সেখানে লিখবো N। আর যেখানে N পাব, সেখানে লিখবো M!

মনোঅ্যালফাবেটিক সাইফার

আরেক ধরণের সাইফার মেথড আছে নতুন একটি বর্ণক্রম বানানোর মধ্যে। যেমন, বর্ণমালার মূল ক্রম হল এমনঃ

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

তো আমার ইচ্ছে হল আমার সাইফার টেক্সট তৈরির শুরুতে আমি একে অন্যভাবে সাজাবো। তো আমি উল্টাপাল্টা যেভাবে খুশি সাজিয়ে নিলাম

X Y Z A B C G F E D M N O K J V T R S U Q P W I J H

তো বল তো এখন “SHOSHIKKHA”-রূপ কী হবে? সুবিধার্থে এই দুইটা লাইন পর পর লিখে নিঃ

আসলঃ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

নকলঃ X Y Z A B C G F E D M N O K J V T R S U Q P W I J H

দেখতেই পাচ্ছ, SHOSHIKKHA হয়ে যাচ্ছে SFJSFEMMFX!

এ ধরণের সাইফারের একটা সুবিধা হল ২৬ বর্ণের বর্ণমালাকে ২৬!-১ বার পুনর্বিন্যস্ত করা সম্ভব, যার মান 400,000,000,000,000,000,000,000,000-এর চেয়েও বেশি! একারণে আমার বিন্যাস করা বর্ণমালার ক্রম না জানলে এটা অনুমান করে নেওয়া বেশ কঠিন!

সিজার সাইফারের ২৫টা শিফট দিয়ে এরকম বর্ণমালার ২৬ ধরনের বিন্যাস পাওয়া যায়ঃ

                A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
                B C D E F G H I J K L M N O P Q R S T U V W X Y Z A
                C D E F G H I J K L M N O P Q R S T U V W X Y Z A B
                D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
                E F G H I J K L M N O P Q R S T U V W X Y Z A B C D
                F G H I J K L M N O P Q R S T U V W X Y Z A B C D E
                G H I J K L M N O P Q R S T U V W X Y Z A B C D E F
                H I J K L M N O P Q R S T U V W X Y Z A B C D E F G
                I J K L M N O P Q R S T U V W X Y Z A B C D E F G H
                J K L M N O P Q R S T U V W X Y Z A B C D E F G H I
                K L M N O P Q R S T U V W X Y Z A B C D E F G H I J
                L M N O P Q R S T U V W X Y Z A B C D E F G H I J K
                M N O P Q R S T U V W X Y Z A B C D E F G H I J K L
                N O P Q R S T U V W X Y Z A B C D E F G H I J K L M
                O P Q R S T U V W X Y Z A B C D E F G H I J K L M N
                P Q R S T U V W X Y Z A B C D E F G H I J K L M N O
                Q R S T U V W X Y Z A B C D E F G H I J K L M N O P
                R S T U V W X Y Z A B C D E F G H I J K L M N O P Q
                S T U V W X Y Z A B C D E F G H I J K L M N O P Q R
                T U V W X Y Z A B C D E F G H I J K L M N O P Q R S
                U V W X Y Z A B C D E F G H I J K L M N O P Q R S T
                V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
                W X Y Z A B C D E F G H I J K L M N O P Q R S T U V
                X Y Z A B C D E F G H I J K L M N O P Q R S T U V W
                Y Z A B C D E F G H I J K L M N O P Q R S T U V W X
                Z A B C D E F G H I J K L M N O P Q R S T U V W X Y

সুন্দর এই ২৬x২৬ বর্গক্ষেত্রটার নাম হল Vigenère square!

পিগপেন সাইফার

রবার্ট ল্যাংডন সিরিজের সাথে যারা পরিচিত, তারা নিশ্চয় ফ্রিম্যাসন (Free Mason)-এর নাম শুনেছো। ফ্রিম্যাসনদের উল্লেখ আছে The Lost Symbol-এ। তো এই ফ্রিম্যাসনরা তাদের নথিপত্র নিরাপদ রাখতে এক ধরনের সাইফার ব্যবহার করতো। এর নাম পিগপেন সাইফার।

এ ধরণের সাইফারে বর্ণগুলো বর্ণ দ্বারা প্রতিস্থাপন করা হত না, বরং প্রতিস্থাপন করা হত চিহ্ন (Symbol) দ্বারা!  এই চিহ্নগুলোর প্যাটার্ন বুঝতে নিচের ছবিটি খেয়াল করঃ

file

প্রথমেই বর্ণগুলো এভাবে সাজানো হত। এবার নিচের ছবিটি দেখলেই আশা করি ধরতে পারবে কীভাবে বর্ণগুলো থেকে চিহ্ন পাওয়া যেত! 😉

file (1)

এবার এই সাইফারে “I LOVE BANGLADESH” লিখে দেখাও তো! 🙂

Muntasir Wahed

Muntasir Wahed

System Administrator at স্বশিক্ষা.com
Jack of all trades, master of none.
Muntasir Wahed
Muntasir Wahed