تعرفنا في المقال السابق على شيفرة قيصر وقمنا بكتابة برنامج بلغة البايثون يقوم بعملية التشفير وفك التشفير بشكل اتوماتيكي , في هذه المقال سوف نقوم بكتابة برنامج بلغة البايثون يقوم بكسر هذه الشيفرة (فك الشيفرة) hacking cipher يمكن فك شيفرة قيصر باستخدام تقنية تحليل التشفير – القوة الغاشمة brute-force- لأن البرنامج الذي سنقوم بكتابته قادر على كسر تشفير قيصر فلا تستخدم هذه الشيفرة في تشفير معلوماتك السرية.

هجوم القوة الغاشمة brute-force attack:

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

التقنية التي يتم من خلالها استخدام كل قيم الممكنة لمفتاح التشفير تسمى هجوم القوة الغاشمة brute-force attack وهذا الهجوم ليس هجوم معقد وهو غير فعال في كل الشيفرات ولكنه فعال ضد شيفرة قيصر.

النص البرمجي لبرنامج فك شيفرة قيصر:

افتح نافذة محرر النصوص من خلال File > New File وقم بكتابة الكود التالي ثم قم بحفظه باسم caesarHacker.py واضغط F5 من أجل تنفيذ هذا البرنامج.

يجب أن تقوم بتحميل الوحدة (الموديول) pyperclip.py module ووضعها في نفس المجلد الذي يحوي على الملف caesarHacker.py  

يمكنك الحصول على هذه الوحدة من http://invpy.com/pyperclip.py.

source-for-ceaserHacker

وعند تشغيل هذا البرنامج سوف نحصل على النتيجة التالية:

crypto-python-3

لاحظ أن نتيجة فك التشفير باستخدام المفتاح 13 هي العبارة المفهومة وبالتالي فإن مفتاح التشفير المستخدم في عملية التشفير يجب أن يكون 13.

كيف يعمل هذا البرنامج:

how-crypto-1

السطر الأول والثاني عبارة عن تعليقات لا يقوم البايثون بتنفيذها وهي فقط اسم البرنامج وعنوان الموقع الذي يحوي على هذا البرنامج.

هذا البرنامج يبدأ بخلق متغير باسم message والذي يحوي على النص المشفر المراد فك تشفيره.

المتغير LETTERS يحتوي على كل الأحرف التي يمكن أن يتم تشفيرها باستخدام الشيفرة وهذا المتغير يجب أن يحوي على نفس القيم التي يحويها المتغير LETTERS الموجود في برنامج شيفرة قيصر الذي استخدم من أجل القيام بعملية التشفير وإلا فإن برنامج فك الشيفرة لن يعمل بشكل صحيح.

التابع ()range:

السطر 8 يحوي على حلقة for والتي تقوم بالدوران عبر القيم التي يعيدها التابع range().

وهذا التابع يأخذ قيمة عدد صحيح ويعيد قيم لمجال هذه القيمة وقيم هذا المجال يمكن أن تستخدم في حلقة for من أجل تكرار الحلقة عدد معين من المرات.

في السطر 8 حلقة for تقوم بضبط قيمة المفتاح ضمن المجال من 0 – 26 (ولكن لا تتضمن 26) بدل من أن نقوم بكتابة القيمة 26 بشكل مباشر في كود البرنامج، قمنا باستخدام القيمة المعادة من التابع len(LETTERS) والسبب في ذلك هو في حال إضافة قيم جديد أو تعديل القيم الموجودة في المتغير LETTERS سيبقى البرنامج يعمل بشكل صحيح.

عندما يتم تنفيذ البرنامج أول مرة فهو يذهب عبر الحلقة ويتم ضبط قيمة المفتاح key = 0 ويتم فك تشفير الرسالة باستخدام المفتاح 0 (الكود الموجود ضمن حلقة for هو الذي يقوم بعملية فك التشفير) وعند تنفيذ الدورة الثانية للحلقة for في السطر الثامن فسوف يتم ضبط قيمة المفتاح key = 1 ويتم فك تشفير الرسالة بالمفتاح 1 وتستمر هذه العملية إلى أن نصل إلى قيمة المفتاح 26.

crypto-how-2

في السطر 12 تم إسناد قيمة سلسلة نصية فارغة للمتغير translated وفي الأسطر القادمة سوف يتم إضافة النص بعد عملية فك التشفير إلى المتغير translated.

how-crypto-3

من السطر 17 – 31 استخدمنا نفس الكود الذي استخدمناه في برنامج شيفرة قيصر في المقال السابق ولكنه مختلف قليلاً لأن هذا الكود يقوم بعملية فك التشفير فقط بدلاً من التشفير وفك التشفير.

في السطر 17  قمنا بتعريف حلقة for تقوم بالمرور أو الدوران على كل رمز من السلسلة النصية المشفرة الموجودة في المتغير message.

في السطر 18 يتم فحص كل رمز فيما إذا كان حرف كبير (إذا كان موجود ضمن المتغير LETTERS والذي يحوي على أحرف كبيرة فقط) إذا كان هذا محقق فيتم فك تشفير هذا الرمز.

في السطر 19 يتم تحديد مكان توضع الرمز في المتغير LETTERS باستخدام الطريقة find() ويتم تخزين القيمة التي تدل على مكان هذا الرمز في المتغير num.

crypto-how-4

في السطر 20 يتم طرح قيمة المفتاح من قيمة num (في شيفرة قيصر يتم الطرح في حالة فك التشفير) وفي حالة كانت النتيجة أصغر من الصفر يتم إضافة القيمة 26 وهي القيمة المعادة من التابع (len(LETTERS.

crypto-how-5

الآن وبعد أن تم تعديل قيمة num يتم حساب قيمة LETTERS[num] والتي هي الحرف أو الرموز بعد عملية فك التشفير

في السطر 27 يتم إضافة هذا الرمز إلى السلسلة النصية الموجودة في المتغير translated.

crypto-how-6

إذا كان الشرط في السطر 18 غير محقق أي أن الرمز غير موجود في LETTERS (ليس حرف كبير) فلن نطبق عليه عملية فك التشفير ويتم إضافته كما هو إلى القيمة النصية الموجودة في المتغير translated

التعليمة else هي خاصة بالتعليمة if في السطر 18.

تنسيق السلسلة النصية:

crypto-how-7

في السطر 34 قمنا باستدعاء التابع print() ليقوم بطباعة عدة أسطر بحسب عدد مرات تكرار الحلقة for في السطر 8

القيم التي تم تمريرها إلى التابع print() تقوم بتنسيق السلسلة النصية.

القيمة %s تستخدم من أجل وضع سلسلة نصية بجانب سلسلة نصية أخرى، حيث يتم استبدال %s الأولى بقيمة المتغير الأول واستبدال %s الثانية بقيمة المتغير الثاني

جرب المثال التالي:

crypto-string-test

تنسيق النصوص بهذه الطريقة هو أسهل من عملية جمع النصوص باستخدام المعامل ‘+’

إحدى ميزات تنسيق النص هذه هي إمكانية إضافة قيم غير نصية (أرقام مثلاً) إلى السلسلة النصية وهذا الأمر غير ممكن باستخدام المعامل ‘+’ حيث لا يمكن جمع قيمة نصية مع قيمة رقمية وسوف تحصل على رسالة خطأ، جرب المثال التالي:

crypto-string-test2

في السطر 34 من كود البرنامج استخدمنا خاصية تنسق النص من أجل خلق سلسلة نصية تحوي على قيمتي المتغيرين  key, translatedلأن المتغير key يحوي على قيمة عددية (عدد صحيح) أما المتغير translated يحوي على سلسلة نصية لذلك استخدمنا خاصية التنسيق السابقة.

كما تلاحظ فإن شيفرة قيصر هي شيفرة ضعيفة ويمكن كسرها بسهولة ولا يمكن الاعتماد في حماية المعلومات السرية.

في المقال القادم بإذن الله سوف نتعرف على شيفرة التحويل Transposition Cipher وسوف نقوم بكتابة برامج بلغة البايثون تقوم بالتشفير وفك التشفير باستخدام هذه الشيفرة.