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

شيفرة قيصر Caesar Cipher:

سميت بهذا الاسم نسبة  إلى الإمبراطور Julius Caesar وهو تشفير بسيط وسهل التعلم وهذا يسمح لمحلل الشيفرة cryptanalyst بكسره بسهولة

سوف نتعلم هذا التشفير لسهولة تطبيقه وسهولة فهمه يمكن القيام بتشفير قيصر باستخدام الورقة والقلم فقط قم بكتابة الأحرف من A إلى Z مع الأرقام من 0 إلى 25 بحيث يكون الرقم 0 تحت الحرف A والرقم 25 تحت الحرف Z كما في الشكل التالي:

Caesar1

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

مثلاً نريد تشفير الرسالة “? Hello How are you” باستخدام مفتاح التشفير 13 أولاً نقوم بإيجاد الرقم الموجود تحت الحرف H والذي هو الرقم 7 ثم نقوم بجمع هذا الرقم مع قيمة مفتاح التشفير 7+13=20 الرقم 20 موجود تحت الحرف U إذا الحرف U هو الحرف المشفر للحرف H من أجل تشفير الحرف E نقوم بجمع الرقم الموجود تحت الحرف E وهو الرقم 4 مع قيمة مفتاح التشفير 13 4+13=17 الرقم 17 يقع تحت الحرف R إذا الحرف R هو تشفير للحرف E وهكذا هذه الطريقة تعمل بشكل جيد إلى أن نصل إلى الحرف O الرقم تحت الحرف O هو 14 ولكن عندما نقوم بجمع هذا الرقم مع قيمة مفتاح التشفير 14+13=27 ولكن الأرقام التي لدينا هي فقط حتى 25 , إذا كان ناتج مجموع الرقم تحت الحرف مع قيمة مفتاح التشفير أكبر من 26 فيجب أن نطرح منه 26 أي 27-26=1 والحرف الموجود فوق الرقم 1 هو B إذا الحرف B هو الحرف المشفر للحرف O وذلك عند استخدام مفتاح التشفير 13 باستخدام نفس الطريقة على كل أحرف الرسالة “? Hello How are you” نحصل على الرسالة المشفرة “Uryyb Ubj ner Ibh?”

خطوات تشفير الرسالة هي: 

1- اختيار مفتاح سري للتشفير من 1 إلى 25.

2- إيجاد الرقم تحت الحرف بالنص الصريح.

3- جمع قيمة هذا الرقم مع قيمة مفتاح التشفير.

4- إذا كان الرقم الناتج عن عملية الجمع أكبر من 26 نقوم بطرح 26 منه.

5- إيجاد الحرف الموجود فوق الرقم الناتج، هذا الحرف هو الحرف المشفر.

6- تكرار الخطوات من 2 إلى 5 من أجل كل حرف في الرسالة.

الجدول التالي يظهر كيف تتم هذه العملية من أجل تشفير الرسالة “?Hello How are you” باستخدام مفتاح التشفير 13.

Ceasar2

من أجل عملية فك التشفير decrypt نقوم بعملية طرح قيمة مفتاح التشفير بدل من عملية الجمع.

من أجل الحرف المشفر B الرقم الموجود تحت هذا الحرف هو 1 نقوم بطرح قيمة مفتاح التشفير من هذا الرقم 1-13=-12 عندما يكون الناتج أقل من 0 (عدد سالب) نقوم بإضافة العدد 26 -12 +26=14 الحرف الموجود فوق الرقم 14 هو O وبالتالي عند فك تشفير الحرف B نحصل على الحرف O الجدول التالي يظهر خطوات عملية فك التشفير:

Ceesar3

الشيفرة العكسية دائماً تقوم بالتشفير بنفس الطريقة ولكن تشفير قيصر يستخدم المفاتيح keys حيث يتم تشفير الرسالة بطرق مختلفة بالاعتماد على قيمة المفتاح المستخدم.

المفتاح في شيفرة قيصر هو عدد صحيح ضمن المجال 0 إلى 25.

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

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

قم بكتابة الكود التالي في محرر النصوص واحفظه باسم caesarCipher.py واضغط F5 من أجل تنفيذ البرنامج يجب أن تقوم أولاً بتحميل الوحدة pyperclip.py module ووضع هذا الملف في نفس المجلد الموجود فيه الملف caesarCipher.py.

يمكنك تحميل هذا الموديول من http://invpy.com/pypreclip.py (عملية التحميل هي عبارة عن نسخ الكود الموجود في هذه صفحة الويب السابقة ولصقه وحفظه في محرر النصوص باسم pyperclip.py).

CeasarCipher1 CeasarCipher2

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

python_result_cipher

تم تشفير السلسة النصية ‘This is my secret message.’ بشيفرة قيصر باستخدام المفتاح 13 هذا البرنامج عندما يعمل يقوم بشكل أتوماتيكي بنسخ النص المشفر ويمكنك لصقه في ملف نصي أو في رسالة ايميل.

بهذه الطريقة يمكنك بسهولة أخذ النص المشفر إلى خارج البرنامج وإرساله إلى شخص أخر من أجل فك التشفير قم بلصق النص المشفر في السطر 7 ليتم اسنادها إلى المتغير message ثم قم بتغيير السطر 13 ليصبح mode = ‘decrypt’.

Ceasar4

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

Ceasar5

إذا حصلت على رسالة الخطأ التالية:

python_error_cipher

هذا يعني أنك لم تقم بوضع الملف pyperclip.py في المجلد الصحيح (نفس المجلد الذي قمت بحفظ البرنامج بداخله) إذا استمر هذا الخطأ ولم تتمكن من إصلاحه فقط قم بحذف السطرين 4 و 52 من الكود هذا سوف يخلص الكود من التعليمات التي تعتمد على pyperclip module الغاية من pyperclip module هو نسخ النص المشفر بشكل أتوماتيكي بعد تنفيذ البرنامج.

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

سنقوم بشرح كل سطر من كود هذا البرنامج: السطر الأول والثاني عبارة عن تعليقات لا يقوم البايثون بتنفيذها وهي فقط اسم البرنامج وعنوان الموقع الذي يحوي على هذا البرنامج استيراد الموديولات باستخدام التعليمة import :

Ceasar_IMPORT

في السطر الرابع استخدمنا التعليمة import البايثون يحوي على العديد من التوابع المبنية في داخله، بعض التوابع موجودة في برامج منفصلة تسمى الموديول (الوحدة) Module وهي عبارة عن برنامج بايثون يحوي على توابع إضافية والتي يمكنك أن تستخدمها في برامجك.

في هذا البرنامج قمنا باستيراد الوحدة (الموديول) pyperclip من أجل أن نستطيع استدعاء التابع pyperclip.copy() تعليمة الاستيراد import مكونة من الكلمة import وتليها اسم الوحدة المراد استيرادها. في السطر الرابع قمنا باستيراد pyperclip module والذي يحوي على عدد من التوابع المتعلقة بنسخ ولصق النصوص من وإلى الذاكرة.

python_varible_cipher

في السطور السابقة قمنا بإعداد ثلاث متغيرات: المتغير message يحوي على السلسلة النصية التي سيتم تشفيرها أو فك تشفيرها. المتغير key يحوي على عدد صحيح وهو مفتاح التشفير encryption key المتغير mode يحوي على إحدى القيمتين ‘encrypt’ (والتي تخبر البرنامج بالقيام بتشفير الرسالة) أو ‘decrypt’ ( والتي تخبر البرنامج بالقيام بفك تشفير الرسالة).

الثوابت:

python_static_cipher

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

الطريقة upper :

Ceasar_upper

في السطر 19 يتم حفظ سلسلة نصية فارغة في المتغير translated بشكل مشابه لبرنامج الشيفرة العكسية، وعند نهاية تنفيذ البرنامج فإن المتغير translated سوف يحوي على كامل السلسلة النصية المشفرة أو الغير مشفرة ولكن الآن يبدأ بسلسلة نصية فارغة.

في السطر 22 قمنا بإسناد قيمة للمتغير message ، هذه القيمة هي ناتج تطبيق الطريقة upper() على القيمة المحفوظة في المتغير message. الطريقة method هي مثل التابع function (باستثناء أنها تلحق بقيم غير محتواه في الوحدات non-module value كما في السطر 22 حيث أن المتغير يحوي على قيمة) اسم الطريقة هو upper() ويتم استدعائها وتطبيقها على القيمة النصية المحفوظة في المتغير message.

التابع function ليس طريقة method لأنه موجود في الموديول module

كما سوف نرى في السطر 52 الذي يتم فيه استدعاء pyperclio.copy() ولكن pyperclip هي وحدة module والتي تم استيرادها في السطر الرابع، لذلك فإن copy() هو ليس طريقة method وهو تابع لأنه موجود داخل pyperclip module إذا كان هذا الأمر مربك لك فيمكنك دائماً تسمية الطرق والتوابع باسم تابع.

معظم أنواع البيانات (مثل السلاسل النصية) لها طرق methods.

السلاسل النصية تملك طرق upper() and lower() والتي تقوم بتحويل أحرف السلسلة النصية إلى أحرف صغيرة أو كبيرة.

حلقة for:

Ceasar_for

حلقة for تستخدم من أجل تكرار أو الدوران عبر قائمة أو سلسلة نصية وبشكل مختلف عن حلقة while التي تحوي على شرط فإن حلقة for تحوي على 6 أجزاء وهي:

1. الكلمة for.

2. اسم المتغير.

3. الكلمة in.

4. القيمة النصية أو المتغير الذي يحوي على قيمة نصية.

5. النقطتان :

6. كتلة من التعليمات.

for_python_Ceasar

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

 

 

 

 

if_python_Ceasar

إذا كان الحرف الموجود في المتغير symbol (المتغير symbol الذي تستخدمه حلقة for) موجودة في السلسلة النصية المحفوظة في المتغير LETTERS (أي إذا كان هذا الحرف هو حرف كبير) فإن نتيجة العبارة symbol in LETTERS ستكون True (الشرط محقق) تذكر أننا في السطر 22 قمنا بتحويل أحرف الرسالة إلى أحرف كبيرة باستخدام التعليمة :

()message = message.upper

لذلك فإن القيمة symbol لا يمكن أن تكون حرف صغير الحالة الوحيدة التي يكون فيها هذا الشرط غير محقق False هي عندما تكون قيمة symbol هي علامة ترقيم أو حرف مثل ‘?’ or ‘4’ نريد أن نفحص قيمة symbol إذا كانت حرف كبير لأن برنامجنا سوف يقوم بتشفير أو فك تشفير الأحرف الكبيرة فقط، وأي أحرف أو رموز أخرى سوف تضاف إلى القيمة النصية المحفوظة في المتغير translator بدون تشفير أو فك تشفير.

كتلة تعليمات جديدة تبدأ بعد تعليمة if في السطر 26 وإذا نظرت إلى باقي البرنامج سوف تلاحظ أن كتلة التعليمة هذه تستمر إلى السطر 42 حيث توجد التعليمة else والتي هي جزء من التعليمة if الموجودة في السطر 26 :

if_mode

الآن وبعد أن عرفنا رقم الحرف الموجود في المتغير num يمكننا تشفيره أو فك تشفيره من خلال إضافة أو طرح قيمة مفتاح التشفير من رقم هذا الحرف.

في شيفرة قيصر يتم إضافة قيمة مفتاح التشفير إلى رقم الحرف من أجل التشفير ويتم إنقاص قيمة مفتاح التشفير من رقم الحرف من أجل عملية فك التشفير.

المتغير mode يحوي على سلسلة نصية تخبر البرنامج أن يقوم بعملية التشفير أو فك التشفير إذا كانت قيمة هذا المتغير هي ‘encrypt’ فإن الشرط في السطر 29 سيكون محقق وسوف يقوم البرنامج بتنفيذ السطر 30 (وسوف يتجاوز كتلة التعليمات الخاصة بالتعليمة elif) أما إذا كانت قيمة هذا المتغير هي أي قيمة أخرى غير ‘encrypt’ فسوف يكون الشرط في السطر 29 غير محقق False وعندها سوف يقوم البرنامج بتجاوز السطر 30 ويقوم بفحص حالة السطر الخاص بتعليمه elif في السطر 31 في هذه الطريقة يعرف البرنامج فيما إذا كان يجب عليه أن يقوم بعملية التشفير (إضافة قيمة مفتاح التشفير) أو أن يقوم بعملية فك التشفير (طرح قيمة مفتاح التشفير)

if_in_python

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

إذا كانت قيمة num أكبر أو تساوي 26 فإن الشرط في السطر 36 سيكون محقق True وسوف يتم تنفيذ السطر 37 (ويتم تجاوز التعليمة elif في السطر 38) ومن ناحية أخرى فإن بايثون يقوم بفحص إذا كانت قيمة num أصغر من 0 فإذا كان هذا الشرط محقق فسوف يتم تنفيذ السطر 39 في شيفرة قيصر يتم إضافة أو طرح القيمة 26 لأن عدد الأحرف في اللغة الإنكليزية هو 25 حرف. لاحظ أنه بدلاً من استخدام القيمة 26 بشكل مباشر قمنا باستدعاء التابع len(LETTERS) والذي سوف يقوم بإعادة القيمة 26 يمكننا تعديل القيمة المحفوظة في المتغير LETTERS من أجل تشفير أوفك تشفير أحرف غير كبيرة وهذا ما سيتم شرحه في نهاية هذا المقال.

translated

الآن وبعد أن تم تعديل قيمة العدد الموجود في المتغير num وأصبح قيمة الفهرسة أو دليل الحرف المراد تشفيره أو فك تشفيره، نريد إضافة الأحرف المشفرة أو غير مشفرة إلى نهاية السلسلة النصية المحفوظة في المتغير translated :

translated2

في السطر 44 التعليمة else تبعد مسافة بدائية مقدارها أربعة فراغات وهذا يدل على أنها استمرار للتعليمة if الموجودة في السطر 26 إذا كانت الشرط الخاص بتعليمه if في السطر 26 غير محقق فإن كتلة التعليمات السابقة سوف يتم تجاوزها والانتقال إلى تنفيذ التعليمة الخاصة ب else في السطر 46 (السطر 45 يتم تجاوزه لأنه عبارة عن تعليق) كتلة التعليمات الخاصة ب else هي عبارة عن سطر واحد حيث يتم إضافة القيمة المحفوظة في المتغير symbol إلى القيمة الموجودة في المتغير translated الرموز أو القيم الغير حرفية مثل الفراغ ‘ ‘ أو النقطة ‘ . ‘ يتم إضافتها إلى translated بدون أي تشفير أو فك تشفير.

عرض ونسخ النص المشفر أو الغير مشفر:

print_translated

السطر 49 لا يحوي على مسافة بدائية وهذا يعني أن كتلة التعليمات السابقة قد انتهت في السطر 49 تم استدعاء التابع print() من أجل أن يقوم بطباعة قيمة المتغير translated في السطر 52 تم استدعاء التابع الموجود في الوحدة pyperclip module والمسمى copy() وحيث يتم تمرير قيمه له ليتم نسخها إلى الذاكرة لنتمكن من لصقها في مستند نصي أو في أي مكان أخر. إذا قمت باستدعاء التابع بالشكل التالي copy(translated) بدلاُ من الشكل pyperclip.copy(translated) فسوف تظهر رسالة خطأ :

error_print

وفي حال نسيت استدعاء الوحدة import pyperclip فلن تتمكن من استدعاء التابع pyperclip.copy() وسوف تحصل على رسالة خطأ.

تشفير القيم الغير حرفية:

برنامج شيفرة قيصر الذي قمنا بكتابته لا يستطيع تشفير القيم الغير حرفية.

إذا كنت تريد تشفير السلسلة النصية التالية ‘The password is 31337’ باستخدام مفتاح التشفير 20 فسوف تتم عملية التشفير وسوف نحصل على السلسلة المشفرة التالية ‘Dro zkccgybn sc 31337’ هذه الرسالة المشفرة لا تحافظ على سرية الرسالة ويمكننا تعديل البرنامج السابق من أجل تشفير القيم الغير حرفية.

إذا قمت بتغير السلسلة النصية المحفوظة في المتغير LETTERS لتحوي على قيم غير الأحرف الكبيرة وذلك لأن السطر 26 يحوي على الشرط symbol in LETTERS والذي يجب أن يكون محقق.

بعد تعديل الكود سوف تعرف السبب من استخدام len(LETTERS) بدلاً من كتابة 26 بشكل مباشر. تعديل الكود يتم من خلال تعديل السطر 16 ليصبح يحوي على رموز وأرقام وجعل السطر 22 عبارة عن تعليق عن طريق إضافة الرمز # في بداية هذا السطر.

كما سنقوم بالتعديل على البرنامج لتتمكن من ادخال النص وقيمة المفتاح ونوع العملية اثناء تنفيذ البرنامج وذلك من خلال تعديل الأسطر التالية لتصبح كالتالي:

points

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

final_Ceasar.png

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