شفرة قيصر

شفرة قيصر ، تسمى أيضا تشفير قيصر أو تشفير الإزاحة، هي طريقة من طرق التشفير التقليدي  لتشفير أو تعمية النصوص، هذه الشفرة شاع استخدامها قديما ويُعتقد أن يوليوس قيصر كان أول من استخدم هذه الوسيلة وكان ذلك بين 58 ق.م حتى 51 ق.م. تتميز هذه الشفرة بسهولة تطبيقها لذلك يتم اعتمادها غالبا كمدخل للتعرف على علم التعمية الكلاسيكي غير أنها ليست أقدم شفرة مسجلة تاريخيا، إذ تعود أول محاولة تاريخية مسجلة لممارسة فن التعمية إلى العام 1900 قبل الميلاد. فكرة الشفرة مشابهة لحد ما لشفرة أتباش وشفرات أخرى كانت منتشرة قديما، بحيث أنها تعتمد على مقابلة حروف الأبجدية بنسخة محوَّرة من نفس الحروف وذلك باعتماد تحوير بسيط غالبا ما يكون سريا ومتفق عليه. ويقوم مبدأ شفرة قيصر أو شفرة الإزاحة على مقابلة حروف الأبجدية بنسخة من نفس الأحرف تمت إزاحتها بموضع ثلاثة أحرف، فمثلا تشفير حرف «أ» يكون هو حرف «ث» وتشفير الكلمة «مرحبا» يكون بذلك هو «وشذجث». وكما جاء على لسان المؤرخ الروماني سويتونيوس في كتابه القياصرة الاثنى عشر، فإن أغسطس قيصر، و هو ابن أخ يوليوس قيصر، استخدم هو الآخر نفس المبدأ للتشفير، غير أنه كان يعتمد على إزاحة بمقدار موضع واحد فقط، مع تشفير آخر حرف في الأبجدية  بتكرار أول حرف من الأبجدية مرتين.

لا يمكن اعتبار شفرة قيصر كشفرة حقيقية حسب المعايير الحالية لأنها لا تحترم مبادئ كيرشوف وخصوصا مبدأ الإعتماد على سرية المفتاح وليس على سرية الخوارزمية. بذلك يكون تشفير قيصر كباقي العديد من الشفرات الكلاسيكية تشفير غير آمن البتة إذ أنه انطلاقا من النص المشفر يمكن استنباط النص الأصلي، وذلك لأن طبيعة توزيع الحروف في النص لا تتغير وبالتالي حسب طبيعة التوزيع الأصلي للغة الأصل يمكن استنباط النص الأصلي، هذا النوع من الهجمات يسمى: هجوم الإكتفاء بالنص المشفر أو هجوم النص المشفر فقط. رغم انعدام الحماية عند استخدام شفرة قيصر إلا أنها تجد استخدامات لها (في صيغتها العامة) في بعض الحالات التي لا تستدعي حماية بقد ما تستدعي إخفاء لحظي للنص كشفرة روت 13 التي تستخدم في العديد من المواضع كالمجلات وبعض الأجهزة الإلكترونية.

اصطلاحات 

قبل البدأ بتوصيف تشفير قيصر لا بد من توضيح بعض الاصطلاحات الأساسية:
 النص الواضح (يسمى أيضا النص المجرد) وهو النص الأصلي المراد تشفيره أو تعميته، سنرمز له بالحرف  وهو مركب من مجموعة من الحروف، كل حرف ينتمي لمجموعة تُسمى الأبجدية، نرمز لهذه الأبجدية بالحرف ، و نقول أن  هو نص مكون من  حرف. مثلا: كلمة «مرحبا» هي نص واضح ينتمي ل  مجموعة النصوص المكونة من خمسة حروف، بحيث  مجموعة حروف الأبجدية العربية.
 النص المشفر وهو نتيجة تطبيق خوارزمية التشفير على النص الواضح، سنرمز له بالحرف . نُنَوًه أنه في حالة تشفير قيصر أو تشفير الإزاحة إذا كان  فإن  أيضا، أي بعبارة أخرى  و  لهما نفس الطول.
 دالة التشفير أو خوارزمية التشفير، نرمز لها ب ، و هي الخوارزمية التي تربط النص الواضح بالنص المشفر كما يلي:  بحيث  هو مفتاح التشفير. في حالة تشفير قيصر فإننا لا نحتاج لمفتاح لأن التشفير تابث ويعتمد فقط على خوارزمية التشفير لذلك يمكننا صياغة هذه العلاقة في هذه الحالة ب .
 دالة فك التشفير أو خوارزمية فك التشفير، سنرمز لها ب ، وهي تقوم بعكس ما تقوم به خوارزمية التشفير ، أي أنها تربط النص المشفر بالنص الواضح كما يلي: . في حالة تشفير قيصر فإننا لا نحتاج لمفتاح لذلك يمكننا صياغة هذه العلاقة في هذه الحالة ب  وسيأتي تعريف هذه الدوال  بالتفصيل لاحقا.

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

تشفير قيصر 
سنبدأ أولا بتوصيف تشفير قيصر الأصلي أي كما كان مستخدم من طرف يوليوس قيصر، كما هو معلوم فخوارزمية التشفير هذه لا تعتمد على مفتاح سري لكنها تعتمد على سرية الخوارزمية ككل. تقوم الخوارزمية ببساطة بتعويض كل حرف بالحرف الثالث اللذي يليه في الترتيب الأبجدي، بعبارة أخرى، لنفترض أن مجموعة الحروف الأبجدية  مرقمة ترتيبيا وفق الجدول الآتي. ( سنستخدم  للدلالة على مجموعة الحروف ونظيرتها من مجموعة الأعداد بشكل متماثل في ما يلي):

عملية تشفير قيصر هي خوارزمية  معرفة كالآتي:

مثال 
لتشفير الكلمة  «مرحبا» فإننا سنقوم بتشفير كل حرف على حدة باستخدام الخوارزمية . لتشفير هذه الحروف يجب مقابلة كل حرف بالرقم المقابل له، مثلا حرف «م» يقابله العدد 23 في الجدول أعلاه، فيكون بذلك تشفير حرف «م» هو الحرف المقابل ل  أي هو الحرف «و».

نطبق نفس المبدأ لتشفير باقي الحروف فنحصل على الشفرة «وشذجث».

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

فك التشفير 
يمكن تصنيف شفرة قيصر ضمن خوارزميات التشفير المتماثل، وبذلك سنعتمد فقط على عكس خوارزمية التشفير لصياغة خوارزمية فك التشفير التي سنرمز لها ب . ويمكن تعريف  كالآتي:

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

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

نعيد تعريف خوارزمية التشفير في هذه الحالة العامة كالآتي:

ونعيد تعريف خوارزمية فك التشفير المقابلة لها كما يلي:

يمكننا التأكد من صحة الخوارزمية (بالإنجليزية: proof of correctness) ببساطة كما يلي:

مثال 
لنفترض أننا بصدد تشفير الرسالة التالية «ويكيبيديا» باستخدام مفتاح تشفير . نقوم بتطبيق الخوارزمية  باستخدام المفتاح المختار على كل حرف على حدة (راجع جدول المقابلات أعلاه):

بالتالي، يكون النص المشفر هو «سشخشضشقشص». لربما يمكنك للتو ملاحظة ضعف هذه الشفرة إنطلاقا من هذا المثال، سنتطرق في الفقرة التالية لتحليل أمن شفرة قيصر (شفرة الإزاحة)، وسنتطرق أيضا لبعض طرق كسر هذا التشفير.

كود برمجي 
نضع فيما يلي كود برمجي بلغة بايثون يوضح عمليتي التشفير و فك التشفير باعتماد مفتاح إزاحة معين. نعتبر أبجدية اللغة العربية المعرفة حسب كود الترميز الموحد كما يلي (تضم 29 حرف باعتبار التاء المروبوطة كحرف مستقل):alphabet = [*range(0x0627, 0x063B), *range(0x0641, 0x0649), 0x064A] # أبجدية عربية

كود التشفير 
def encrypt(key, message, alphabet):
    ciphertext = []
    for letter in message:
        try:
            i = alphabet.index(ord(letter))
        except:
            ciphertext.append(letter)
        else:
            ciphertext.append(chr(alphabet[(i + key) % len(alphabet)]))
            
    return "".join(ciphertext)

كود فك التشفير 
def decrypt(key, ciphertext, alphabet):
    plaintext = []
    for letter in ciphertext:
        try:
            i = alphabet.index(ord(letter))
        except:
            plaintext.append(letter)
        else:
            plaintext.append(chr(alphabet[(i - key) % len(alphabet)]))
            
    return "".join(plaintext)

مثال تطبيقي 
النص الواضح: مرحبا من ويكيبيديا الموسوعة الحرة

النص المشفر: كدثيو كل نهفهيهحهو وقكنرنطا وقثدا

تحليل أمن شفرة قيصر 

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

شفرة قيصر ليست آمنة الدلالة 
بالعودة إلى المثال الأول من الفقرة السابقة، يمكنك ملاحظة وجود تطابق نمطي بين النص الواضح والنص المشفر. بعبارة أخرى، يمكنك ملاحظة أن حرف الياء في النص «ويكيبيديا» دائما ما يتم تشفيره باستخدام حرف الشين في النص المشفر «سشخشضشقشص». وبالتالي يمكن لأي خصم التفريق بين شفرتين مختلفتين فقط بتحليل النصوص المشفرة. لتوضيح هذا الأمر سنفترض السيناريو التالي: نفترض أن هناك خصم متنصت على محادثة مشفرة بين طرفين، قام خلالها برصد الشفرة «نبن». نفترض أن المتنصت يعلم مسبقا أن هذه الشفرة هي جواب لسؤال معلوم يقبل فقط إجابتين هما: «فجر» أو «ليل». واضح من تحليل الشفرة فقط، ودون الحاجة لكسرها أو محاولة معرفة المفتاح، أن النص الواضح الموافق للنص المشفر «نبن» هو «ليل» وليس «فجر»، لأن هناك تطابق في أنماط الكلمتين «نبن» و«ليل» (كلاهما يبدءان بحرف وينتهيان بنفس الحرف) . نقول في هذه الحالة إن شفرة قيصر ليست آمنة دلاليا (بالإنجليزية: semantically secure).

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

هجوم الإكراه الأعمى 
قد يسمى أيضا هجوم القوة العمياء، (بالإنجليزية: Brute-force attack)، وهو ببساطة هجوم يقتضي تجريب كل المفاتيح الممكنة إلى غاية إيجاد المفتاح الصحيح. نُذَكِّر أن حقل المفاتيح الممكنة صغير جدا ، و بالتالي تجريب كل هذه المفاتيح لن يتطلب مجهود ووقت كبيرين قبل العثور على المفتاح المناسب. يمكن القيام بهجوم الإكراه الأغمى في حالتنا هذه سواء يدويا أو آليا.

هجوم التحليل الإحصائي 
هجوم التحليل الإحصائي أو تحليل التكرار (بالإنجليزية: frequency analysis)، هو طريقة من أبرز طرق تحليل الشفرات التقليدية وهو من اختراع وتطوير العرب. ولعل هذه كانت أول محاولة تاريخية لتطوير علم رياضي يهتم بكسر وتحليل الشفرات، وقد كان يسميه العرب حينها علم استخراج المعمَى. يقوم مبدأ هذا النوع من الهجمات على استخدام التحليل الإحصائي للغة الشفرة وللشفرة ذاتها ومحاولة مطابقة تردد حروف الشفرة مع تردد حروف اللغة الأصلي، وبذلك يتمكن المحلل من التوصل إلى تقابل بين أبجدية النص الواضح وأبجدية النص المشفر. يستطيع هذا النوع من الهجمات كسر كل شفرات الإبدال الأحادي بدون استثناء، والتي من ضمنها شفرة قيصر و شفرات الإزاحة وشفرات أخرى عديدة. مثلا، باعتبار اللغة العربية، نعلم انطلاقا من تحليل التكرار أن حرف الألف هو أكثر الأحرف تواترا في اللغة، يليه حرف اللام. انطلاقا من هذه المعلومة يمكننا موافقة حرف الألف بالحرف الأكثر تواترا في النص المشفر (مثلا ليكن هو حرف الصاد)، و هكذا نستطيع كشف مفتاح الإزاحة المعتمد في تشفير الإزاحة والذي يكون في هذه الحالة هو 13.

بصيغة أخرى مماثلة، يمكن أيضا الاعتماد على مؤشر التطابق (بالإنجليزية: index of coincidence)، و هو مؤشر مبني على التحليل الإحصائي للغة يتم استخدامه لتحليل وكسر عدد من الشفرات التقليدية. لكن يجب التنويه إلى أنه للقيام بهجوم تحليل التكرار يجب أن يكون بحوزة المهاجم كم كافي من النصوص المشفرة.

مصادر 

تعمية
نظرية الزمر
يوليوس قيصر