خوارزمية التشفير بالإضافة من أبسط أنواع خوارزميات التشفير، مبادئها سهلة أيضاً، فهي إحدى خوارزميات التشفير بالأبجدية الموحدة، يتم فيها إستبدال الأحرف و ليس تبديلها.
خطوات التشفير بالإضافة
- إلغاء المسافات بين الكلمات.
- تحويل الحروف إلى أرقام.
- إجراء عملية التشفير.
- تحويل الأرقام المشفرة إلى حروف مرة أخرى.
إجراء التشفير بالإضافة
يوجد مفهوم رياضي مهم و هو مستصحب في جميع خوارزميات التشفير، و هو مفهوم باقي القسمة (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.
- لتشفير الحرف a بإستخدام الجدول السابق فإن a=0 و مفتاح التشفير 2، بالرجوع لخوارزمية التشفير فإن الشفرة = 0+2 = 2، و الرقم 2 في الجدول هو الحرف c. إذاً فشفرة الحرف a هي c.
- لتشفير الحرف 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) و لننظر هل نستطيع إيجاد الرسالة قبل التشفير؟
- الحرف c =2 في الجدول، مفتاح التشفير = 2
P = (2-2) mod 26
P = 0 mod 26 =0
القيمة 0 هي الحرف a، صحيح؟ - الحرف r = 17 في الجدول، مفتاح التشفير = 2
P = (17-2) mod 26
P = 15 mod 26 = 15
القيمة 15 هي الحرف p. و هي الرسالة الصحيحة كما في المثال. - الحرف 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]مُهاجمة خوارزمية التشفير بالإضافة
مُهاجمة خوارزمية التشفير بالإضافة من من السهولة بمكان، بإمكانك إستخدامهما بكُل سُهولة بإحدى طريقتين
- إستخدام القوة العمياء Brute Force:
إذا تحصل المُهاجم على الشفرة، فإنه يستطيع تجربة المفاتيح واحداً تلو الآخر حتى يجد نصاً يُمثل معنى مقبولاً، و تُعتبر عملية سهلة جداً و ذلك لصغر مدى المفاتيح المُمكن إستخدامها، فعدد المفاتيح المُمكن إستخدامها هو 26 مفتاح فقط، و إذا حذفت المفتاح (0) لأنه لن يغير في النص كما رأينا في المثال السابق فإنه يتبقى 25 مفتاح و بإمكان المُهاجم تجربتهم بسهولة.
لاحظ أن المفتاحين 0 و 26 و 52 يمثلون نفس المفتاح، و ذلك لأن باقي القسمة لهم متساوي و هو 0، فإذا تساوى باقي القسمة لمجموعة أرقام فهذا يعني أنهم يمثلون مفتاحاً واحداً. - التحليل الإحصائي 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
اقرأ عن:
88فك التشفير التلفزيونيه برمجة الاشتراك نظام
السلام عليكم
اعجبني مقالك و لدي سؤال
لدي خوارزمية على هذا شكل 924454=AUYXNWdLD2XwNLJU سؤالي هو ماهي الصيغة التي حلت بها هذه الخوارزمية
key is 10 XD
نصف الطريق ،،، إذا فرضنا أن المفتاح 10 .. ما هي الرسالة الأصلية؟ ?
[y, o, u, a, r, e, r, e, a, l, l, y, g, e, n, i, u, s]
شكراً محمد ☺