كمختبر اختراق يجب أن تكون قادر على فهم خوارزميات التشفير بشكل جيد ويجب أن تكون قادر على كتابة برامج تقوم بعملية التشفير أو حتى كسر التشفير وفك الشيفرات السرية وفي هذه السلسلة من المقالات سوف نتعلم أساسيات التشفير بالإضافة إلى خوارزميات التشفير الأساسية وسوف نقوم بكتابة برامج بلغة البرمجة بايثون تقوم بعملية التشفير بشكل اتوماتيكي باستخدام هذه الخوارزميات بالإضافة إلى كتابة برامج تقوم بفك هذه الشيفرات hacking cipher.

خوارزميات التشفير التي سنتحدث عندها في هذه السلسة من المقالات هي الشيفرة العكسية وشيفرة قيصر وشيفرة التحويل وشيفرة الاستبدال وشيفرة RSA الشهيرة.

 

ما هو التشفير Cryptography:

سوف نعطي نظرة بسيطة عن التشفير , أنظر إلى النص التالي :

first_crypto

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

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

علم التشفير cryptography: هو علم استخدام الأكواد السرية secret code.

خبير التشفير cryptographer: هو الشخص الذي يستخدم و يدرس الأكواد السرية.

وبإذن الله هذه المقالات سوف تعلمك كل ما تحتاجه لتصبح خبير تشفير cryptographer

محلل الشيفرة cryptanalyst: هو الشخص الذي يستطيع كسر أو فك الشيفرة السرية ويتمكن من قراءة الرسائل المشفرة وهذا الشخص يسمى أيضاً هاكر “hacker” أو “code breaker” الجواسيس والجنود والهاكرز والقراصنة وحقوق الملكية والتجار والحكام المستبدين والناشطين السياسيين والتسوق عبر الانترنت وأي شخص أخر بحاجة لمشاركة أسراره مع أصدقاء موثوقين، كلهم يعتمدون على علم التشفير cryptography ليتأكدوا من ان معلوماتهم السرية ستبقى سرية إذا كان لديك رسالة طويلة جداً وتريد تشفيرها (كتاب مثلاً) فسوف تحتاج لأيام أو حتى أسابيع من أجل إتمام عملية التشفير بشكل يدوي وهنا البرمجة يمكن أن تساعدك للقيام بهذه المهمة.

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

لغة البايثون Python هي أفضل وأسهل لغة برمجة للمبتدئين فهي لغة بسيطة وسهلة القراءة وقوية وتستخدم من قبل مطوري البرامج المحترفين وهي اللغة المفضلة لدى مختبري الاختراق.

يمكنك تحميل Python software من الموقع الرسمي http://python.org وهي يعمل على أنظمة تشغيل لينكيس وأنظمة تشغيل ويندوز.

 

الشيفرة العكسية Reverse Cipher:

الشيفرة العكسية هي أبسط خوارزمية تشفير وسوف نبدأ بها لسهولة فهمها وسهولة استخدامها والشيفرة العكسية تقوم بتشفير الرسالة من خلال طباعة أحرف الرسالة بشكل عكسي.

مثلاً الرسالة “Hello world!” يتم تشفيرها بالشكل التالي “!dlrow olleH” من أجل فك التشفير يمكن عكس الرسالة المشفرة من أجل الحصول على الرسالة الأصلية.

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

الكود البرمجي لبرنامج الشيفرة العكسية:

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

Crypto_code

Crypto_code2

وعند تنفيذ البرنامج سوف تكون النتيجة كالتالي :

من أجل فك تشفير هذه الرسالة ‘daed era meht fo owt fi ,terces a peek nac eerhT‘ قم بنسخ النص المشفر ولصقه في السطر الرابع ليتم حفظه في المتغير message وتأكد من وجود علامات التنصيص في بداية ونهاية هذا النص :

Crypto_Code3

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

Crypto_Code4

شرح الكود البرمجي:

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

السطر الرابع يقوم بتخزين السلسلة النصية التي نريد تشفيرها في متغير باسم message :

crypto_code5

في كل مرة نريد فك تشفير أو تشفير أي سلسلة نصية جديدة فقط نقوم بكتابة هذه السلسلة بشكل مباشر في السطر الرابع في الكود البرمجي (في هذا البرنامج لم نستخدم التابع input() وبدل ذلك يجب على المستخدم كتابة الرسالة التي يريد تشفيرها أو فك تشفيرها بشكل مباشر في الكود البرمجي) وفي كل مرة يجب تغير الكود البرمجي من أجل تشفير أو فك تشفير رسالة جديدة.

السطر الخامس قمنا بتعريف متغير جديد باسم translated وهو يحوي حالياً على سلسلة نصية فارغة :

Crypto_code6

(تذكر أن تعريف السلسلة النصية الفارغة يتم باستخدام زوج من علامات التنصيص المفردة وليس علامات التنصيص المزدوجة)

التابع len():

crypto_code7

السطر السادس هو سطر فارغ وبايثون سوف يتجاوزه، في السطر التالي من الكود قمنا بإسناد قيمة للمتغير i القيمة المسندة هي العبارة الجبرية len(message) – 1 أول جزء من العبارة الجبرية هو len(message) وهو استدعاء للتابع len().

هذا التابع يقبل القيم النصية كمدخلات تمرر له أثناء عملية الاستدعاء ثم يقوم بإعادة قيمة عددية (عدد صحيح) تخبرنا بعدد الأحرف الموجودة في السلسة النصية الممررة لهذا التابع (طول السلسلة النصية). في البرنامج السابق قمنا بتمرير المتغير message إلى التابع len() len(massage) سوف يخبرنا بعدد أحرف السلسلة النصية المخزنة في المتغير message.

السطر السابع في البرنامج يقوم بإيجاد عدد أحرف السلسة النصية المخزنة في المتغير message ويطرح منها العدد واحد ثم يقوم بتخزين العدد الناتج في المتغير i العدد المخزن في المتغير iيستخدم كفهرسة من أجل الإشارة للحرف الأخير في السلسلة النصية المخزنة في المتغير message.

الحلقة while:

crypto_while

الحلقة while مكونة من أربعة أجزاء:

1. الكلمة while.

2. عبارة جبرية وتسمى الشرط والتي تحسب قيمة منطقية (قيمة بوليانية) True or False.

3. النقطتان ” : “.

4. كتلة من التعليمات (كما في السطرين 10 و 9).

Crypto_Code8

تعليمات الحلقة while:

crypto_while2

التعليمة while في السطر الثامن تخبر البياثون أن يقوم أولاً بفحص الشرط i >= 0 ) ) إذا كانت نتيجة هذا الشرط هي True (الشرط محقق) فإن البرنامج سوف يقوم بتنفيذ التعليمات الموجودة داخل الكتلة التي تلي تعليمة while (الكتلة هي السطرين 10 و 9).

أما إذا كتنت نتيجة تنفيذ الشرط هي False (الشرط غير محقق) فإن البرنامج سوف يتجاوز الكود الموجود في الكتلة التالية ويقفز لتنفيذ أول سطر من الكود الذي يلي الكتلة (السطر 12).

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

العبارة while i >= 0 تعني: طالما أن قيمة المتغير i هي أكبر أو تساوي الصفر، استمر في تنفيذ التعليمات الموجودة في الكتلة التالية.

 

ازدياد السلسلة:

تذكر أنه في السطر السابع قد تم تعين القيمة الأولية للمتغير i وهي طول السلسلة النصية المخزنة في المتغير message منقوص منها واحد وأن الحلقة while في السطر الثامن تستمر في تنفيذ التعليمات الموجودة داخل الكتلة التي تليها إلى أن يصبح الشرط i >= 0 غير محقق False.

Crypto_Code9

كتلة التعليمات التي تلي while تحوي على السطرين 10 و 9 السطر 9 يقوم بإسناد قيمة جديدة للمتغير translated ، هذه القيمة تزداد في كل مرة بالحرف ذو قيمة الفهرسة i من السلسلة النصية المخزنة في المتغير message وبهذه الطريقة فإن قيمة السلسلة المخزنة في المتغير translated تزداد إلى أن تصبح السلسلة النصية الكاملة المشفرة.

في السطر العاشر يتم اسناد قيمة جديدة للمتغير i وهذه القيمة هي القيمة الحالية لهذا المتغير منقوصاً منها واحد.

السطر 12 لا يحوي على مسافة بدائية وهذا يخبر بايثون بأن كتلة التعليمات التي تلي while قد انتهت وبدلاً من أن يقوم البرنامج بتنفيذ السطر 12 فهو يعود إلى السطر 8 ليقوم بفحص حالة الشرط مرة ثانية، إذا كان الشرط محقق فسوف يقوم بتنفيذ التعليمات الموجودة داخل الكتلة مرة ثانية (السطرين 9 and 10) ويستمر بتنفيذهما إلى أن يصبح الشرط غير محقق False (عندما تصبح قيمة i أصغر من الصفر) وفي هذه الحالة فإن البرنامج سوف يقوم بتنفيذ أول سطر بعد الكتلة وهو السطر 12 المتغير i يبدأ بقيمة الفهرسة لآخر حرف في السلسلة النصية المخزنة في المتغير message.

المتغير translated يبدأ بقيمة سلسلة فارغة ثم (في داخل الحلقة) يأخذ هذا المتغير قيمة message[i] (والتي هي الحرف الأخير من السلسة النصية الموجودة في المتغير message) حيث أن المتغير i يحوي على قيمة الفهرسة الخاصة بآخر حرف في السلسلة.

ثم يتم أنقاص قيمة المتغير i بمقدار واحد وهذا يعني أن message[i] أصبحت تشير إلى الحرف ما قبل الأخير في السلسلة النصية ويتم إضافته إلى قيمة المتغير translated.

قيمة المتغير i تستمر بالتناقص إلى أن يصبح message[i] هو أول حرف في السلسلة ويتم إضافته كآخر حرف في السلسلة المخزنة في المتغير translated.

وهذا يجعل القيمة المخزنة في المتغير translated هي عكس القيمة الموجودة في المتغير message وعندها تصبح قيمة المتغير i = -1 وعندها يصبح الشرط غير محقق وسوف يقفز البرامج لتنفيذ السطر 12.

Crypto_code10

في نهاية البرنامج (السطر 12) قمنا بطباعة محتوى المتغير translated وهي السلسلة النصية (‘.daed era meht fo owt fi ,terces a peek nac eerhT’).

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