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

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

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

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

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

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


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

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


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

C= Ciphertext : الشفرة
P = Plaintext : الرسالة
K = Key : مفتاح التشفير
C=P+k mod 26
P=C-K mod 26

نقاط سريعة

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

 

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

لأكون أكثر تحديداً سيكون سؤالك لماذا نستخدم باقي قسمة 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
    P = -1 mod 26 = -1 = 25 القيمة 25 هي الحرف z، رائع جداً. إذا تسائلت كيف حُسبت القيمة 25 ضع مؤشر الفأرة على العملية السابقة.

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

الرسالة

ahmed
ahmed
ahmed
ahmed
ahmed
ahmed

مفتاح التشفير

5
7
0
26
3
29

الشفرة

fmrji
hotlk
ahmed
ahmed
dkphg
dkphg

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

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

  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

مصطفى الطيب

صديقٌ لنُظمِ المعلُومات و عُلومِ الحَاسِب و مُختصٌ بهما، مُحبٌ للعِلمِ و نَشرِه. أُشاركُ معارفي و تَجاربي و خِبراتي في تَدويناتٍ و دوراتٍ من خلال مُدونةِ عُلوم.

‫5 تعليقات

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

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

مقالات ذات صلة

زر الذهاب إلى الأعلى