خوارزمية التشفير بالإضافة Additive Cipher مع مقدمة رياضية للتشفير

خوارزمية التشفير بالإضافة من أبسط أنواع خوارزميات التشفير، مبادئها سهلة أيضاً، فهي إحدى خوارزميات التشفير بالأبجدية الموحدة، يتم فيها إستبدال الأحرف و ليس تبديلها.

 

خطوات التشفير بالإضافةالتشفير بالإضافة

  1. إلغاء المسافات بين الكلمات.
  2. تحويل الحروف إلى أرقام.
  3. إجراء عملية التشفير.
  4. تحويل الأرقام المشفرة إلى حروف مرة أخرى.

إجراء التشفير بالإضافة

يوجد مفهوم رياضي مهم و هو مستصحب في جميع خوارزميات التشفير، و هو مفهوم باقي القسمة (Modulo) (mod)، حيث تعتمد عليه خوارزميات التشفير تماماً، و لا بد من معرفته.

[divider style=”solid” top=”20″ bottom=”20″]

أمثلة لعمليات باقي القسمة

5 mod 2 =1
6 mod 2= 0
13 mod 8 = 5
15 mod 4 = 3

[divider style=”solid” top=”20″ bottom=”20″]

عملية التشفير تتم وفقاً للخوارزمية التالية

[one_half] C= Ciphertext : الشفرة
P = Plaintext : الرسالة
K = Key : مفتاح التشفير[/one_half]

[one_half_last]
C=P+k mod 26
P=C-K mod 26
[/one_half_last]

نقاط سريعة

[tie_list type=”thumbup”]

  • لتتحصل على الشفرة يحب أن تحصل على قيمة C.
  • لفك التشفير يعني أن تتحصل على الرسالة و ذلك يعني أن تتحصل على قيمة P.
  • عملية الحصول على قيمة c تسمى بالتشفير Encryption.
  • عملية الحصول على قيمة p تسمى بفك التشفير Decryption.[/tie_list]

    لماذا نستخدم عملية باقي القسمة؟

    لأكون أكثر تحديداً سيكون سؤالك لماذا نستخدم باقي قسمة 26. و هذا سؤال ينم عن تفكير و يحتاج إلى تركيز.

    يُستخدم باقي قسمة 26 لأن عدد أحرف اللغة الإنجليزية 26 حرف. و لو كُنت تُجري التشفير لرسالة باللغة العربية سيكون باقي القسمة للرقم 28. و لكن هذا لم يُجب على تساؤلك بعد. أُنظر للجدول التالي

    خوارزمية التشفير بالإضافة

     هذا الجدول يوضح إسناد 26 قيمة لـ 26 حرف باللغة الإنجليزية، و هذا يعني أن أي كلمة باللغة الإنجليزية بإستطاعتك تحويلها إلى أرقام بإستخدام هذا الجدول. و بكُل تأكيد فإنك تتوقع أن تكون نتيجة عملية التشفير هي حروف أيضاً من اللغة الإنجليزية، أليس كذلك؟
    باقي قسمة 26 هو ما يضمن لك أن نتيجة التشفير هو حروف من اللغة الإنجليزية، و هذا يعني أنه بإمكانك إستخدام الجدول الذي أنشأته مسبقاً لتحويل الأرقام الناتجة من التشفير إلى حروف مرة أخرى. إذا لم يكُن هذا واضحاً بما يكفي و عادةً ما يكون كذلك تابع المثال التالي.

    أمثلة لعملية التشفير بالإضافة

    لنُجري مثالاً بسيطاً لعملية تشفير بإستخدام مفتاح تشفير (2)، و وفقاً لخوارزمية التشفير كما تعلم

    C=P+k mod 26

    فإنه للتشفير يجب أن نضيف مفتاح التشفير ثم نحصل على باقي قسمة 26.

    1. لتشفير الحرف a بإستخدام الجدول السابق فإن a=0 و مفتاح التشفير 2، بالرجوع لخوارزمية التشفير فإن الشفرة = 0+2 = 2، و الرقم 2 في الجدول هو الحرف c. إذاً فشفرة الحرف a هي c.
    2. لتشفير الحرف p بإستخدام الجدول السابق فإن p=15 و مفتاح التشفير 2، بالرجوع لخوارزمية التشفير فإن الشفرة = 15+2 = 17، و الرقم 17 في الجدول هو الحرف r. إذاً فشفرة الحرف p هي r.

    عملية التشفير بسيطة، أليس كذلك؟ الآن ماذا لو أردت تشفير الحرف z، ستجد أنه سيكون 25+2 = 27، هل لديك الرقم 27 في الجدول السابق؟!!
    هنا يأتي دور عملية باقي القسمة، و هي جعل جميع عملية الإضافة تتم في المدى بين 0 إلى 25، مهما كان مفتاح التشفير كبيراً فستطيع إجراء عملية التشفير و فك التشفير.
    3. لتشفير الحرف z بإستخدام الجدول السابق فإن z=25 و مفتاح التشفير 2، بالرجوع لخوارزمية التشفير فإن الشفرة =

    C= (25+2) mod 26 = 27 mod 26 = 1

     و الرقم 1 في الجدول هو الحرف b. إذاً فشفرة الحرف z هي b.

    فك تشفير خوارزمية التشفير بالإضافة

    فك التشفير دائماً يعني عكس عملية التشفير بإستخدام نفس المفتاح. لذا فخوارزمية فك التشفير مُعاكسة لخوارزمية التشفير في عملياتها.

    P=C-K mod 26

    فك تشفير التشفير بالإضافة

    لنأخذ  الأمثلة السابقة لعملية التشفير و نستخدم نفس مفتاح التشفير (2) و لننظر هل نستطيع إيجاد الرسالة قبل التشفير؟

    1. الحرف c =2 في الجدول، مفتاح التشفير = 2
      P = (2-2) mod 26
      P = 0 mod 26 =0
      القيمة 0 هي الحرف a، صحيح؟
    2. الحرف r = 17 في الجدول، مفتاح التشفير = 2
      P = (17-2) mod 26
      P = 15 mod 26 = 15
      القيمة 15 هي الحرف p. و هي الرسالة الصحيحة كما في المثال.
    3. الحرف b = 1 في الجدول، مفتاح التشفير = 2
      P = (1-2) mod 26
      [tooltip text=”P = -1 mod 26 = -1 = 25″ gravity=”nw”]لتحويل القيمة -1 إلى قيمة موجبة -1 = 26-1 = 25[/tooltip]
      القيمة 25 هي الحرف z، رائع جداً. إذا تسائلت كيف حُسبت القيمة 25 ضع مؤشر الفأرة على العملية السابقة.

    تشفير كلمات كاملة

    [one_third]الرسالة

    ahmed
    ahmed
    ahmed
    ahmed
    ahmed
    ahmed[/one_third]

    [one_third]مفتاح التشفير

    5
    7
    0
    26
    3
    29[/one_third]

    [one_third_last]الشفرة

    fmrji
    hotlk
    ahmed
    ahmed
    dkphg
    dkphg[/one_third_last]

    مُهاجمة خوارزمية التشفير بالإضافة

    مُهاجمة خوارزمية التشفير بالإضافة من من السهولة بمكان، بإمكانك إستخدامهما بكُل سُهولة بإحدى طريقتين

    1. إستخدام القوة العمياء Brute Force:
      إذا تحصل المُهاجم على الشفرة، فإنه يستطيع تجربة المفاتيح واحداً تلو الآخر حتى يجد نصاً يُمثل معنى مقبولاً، و تُعتبر عملية سهلة جداً و ذلك لصغر مدى المفاتيح المُمكن إستخدامها، فعدد المفاتيح المُمكن إستخدامها هو 26 مفتاح فقط، و إذا حذفت المفتاح (0) لأنه لن يغير في النص كما رأينا في المثال السابق فإنه يتبقى 25 مفتاح و بإمكان المُهاجم تجربتهم بسهولة.
      لاحظ أن المفتاحين 0 و 26 و 52 يمثلون نفس المفتاح، و ذلك لأن باقي القسمة لهم متساوي و هو 0، فإذا تساوى باقي القسمة لمجموعة أرقام فهذا يعني أنهم يمثلون مفتاحاً واحداً.
    2. التحليل الإحصائي Statistical Analysis:
      لكل لغة من اللغات مُميزات خاصة بها، فعند كتابتك لنص طويل مثلاً يكون تكرار بعض الأحرف أكثر من الأخرى. علماء اللغات وضعوا بعض الإحصاءات التي يستطيع المُهاجم إستخدامها لحساب تكرار حرف معين و التنبؤ به، فإذا كان حرف (الألف) هو الأكثر تكراراً مثلاً في اللغة العربية، فإن المُهاجم سيحاول إيجاد الحرف الأكثر تكراراً و يعتبره حرف الألف.
      كما توجد بعض العبارات التي تتكرر بكثرة مثل (في، من) و غيرها، فيحاول المهاجم أيضاً إيجاد الكلمات المكونة من حرفان و إستخدام الإحصاءات اللغوية في التنبؤ بمعناها حتى الوصول إلى التنبؤ الصحيح!.

    خوارزمية التشفير بالإضافة بإستخدام لغة الجافا

    في هذه الشفرة البرمجية أعددتُ لك برنامجاً بسيطاً لتستخدمه في التشفير و فك التشفير، و أعددتُ لك تحدياً أيضاً.

    بدون أن أوفر لك مفتاح التشفير، هل تستطيع إيجاد الرسالة الأصلية الخاصة بالشفرة التالية iyekbobokvviqoxsec ؟
    ضع نتيجة محاولتك في التعليقات لأناقش معك حلّك.

     
    import java.util.Arrays;
    import java.util.Scanner;
    
    /**
     *
     * @author Mustafa Eltayeb - oolom.com
     */
    public class Additive_Cipher {
        static char Encryption_table[]={'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'};
        static Scanner reader=new Scanner(System.in);
        
        public static void main(String args[]){
            while(true){
                System.out.println("Enter 1 for encryption 2 for decryption");
                int choice=reader.nextInt();
                if(choice==1)
                    Encryption();
                else if(choice==2)
                    Decryption();
                else System.exit(0);
            }//end while        
        }//end main method
        
        
        
        static void Encryption(){
            char[] plaintext;
            char[] ciphertext;
            
            
            //read the plaintext
            System.out.println("What is the plaintext?");
            String p=reader.next();
            plaintext = p.toCharArray();
            
            //read the key
            ciphertext=new char[plaintext.length];
            System.out.println("What is the Encryption Key?");
            int k=reader.nextInt();
            
            //convert plaintext to numbers
            for(int i=0; i<plaintext.length;i++){
                plaintext[i]-=97;
            }//end for
            
            //encryt the numbers
            //convert the numbers to text.
            for(int i=0; i<plaintext.length;i++){
                ciphertext[i]=Encryption_table[(plaintext[i]+k)%26];
            }//end for
            
            //print the result
            System.out.println(Arrays.toString(ciphertext));
        }//end encryption
        
        
        
        
        static void Decryption(){
            char[] plaintext;
            char[] ciphertext;
            
            //read the plaintext
            System.out.println("What is the ciphertext?");
            String p=reader.next();
            plaintext = p.toCharArray();
            
            //read the key
            ciphertext=new char[plaintext.length];
            System.out.println("What is the Encryption Key?");
            int k=reader.nextInt();
            
            //convert ciphertext to numbers
            for(int i=0; i<plaintext.length;i++){
                plaintext[i]-=97;
            }//end for
            
            //decrypt the numbers
            //convert the numbers to text.
            for(int i=0; i<plaintext.length;i++){
                int loc=(plaintext[i]-k)%26;
                //change negative to positive
                if(loc<0){
                    loc+=26;
                }//end if
                ciphertext[i]=Encryption_table[loc];
            }//end for
            
            //print the result
            System.out.println(Arrays.toString(ciphertext));
        }//end encryption
        
    }//end additive chipher class

    اقرأ عن:

    خوارزمية تشفير أفيني Affine Cipher


قد يعجبك أيضا

ابسط شرح للتمرير بالمرجع و التمرير بالقيمة مع حيلة لتعمل الجافا بالتمرير بالمرجع

ابسط شرح للتمرير بالمرجع و التمرير بالقيمة مع حيلة لتعمل الجافا بالتمرير بالمرجع

جمل التحكم|هيكل التحكم Control Statements|Control Structure تحول الأفكار إلى شفرات مصدرية

جمل التحكم|هيكل التحكم Control Statements|Control Structure تحول الأفكار إلى شفرات مصدرية
ما رأيك؟ اترك تعليقاً أدناه


  1. السلام عليكم
    اعجبني مقالك و لدي سؤال
    لدي خوارزمية على هذا شكل 924454=AUYXNWdLD2XwNLJU سؤالي هو ماهي الصيغة التي حلت بها هذه الخوارزمية

{"email":"البريد الالكتروني غير صحيح","url":"رابط الموقع غير صحيح","required":"بعض الحقول المطلوبة لم تتم تعبئتها"}

نجاح!

تنبيه!

خطأ!