هذا نص مترجم آليًا وقد يحتوي على أخطاء!
حول مهام التشفير
هذه المهام مهيكلة بشكل مختلف قليلاً عن المهام الأخرى في Piggy، وأتساءل قليلاً عما تفضلونه! 😎
سيكون هناك في البداية قدر من المعلومات حول المواضيع، وبعد ذلك ستأتي بعض المهام!
“المستويات” في هذه المهمة ليست تماماً مثل المستويات السابقة، فإليك الأمور مقسمة بشكل أكبر إلى مواضيع.
ما هو “Cipher”؟
هل رغبت يومًا في كتابة رسالة سرية إلى صديق، بحيث لا يستطيع أي شخص آخر فهمها؟ إذن أنت بحاجة إلى Cipher، أو شفرة باللغة النرويجية! الشفرة هي ببساطة طريقة تحول النص العادي إلى “رمز” عن طريق استبدال الأحرف (غالبًا الأحرف) بأحرف أخرى. يبدو الناتج هراءً لأولئك الذين لا يعرفون كيف تعمل الشفرة. الفكرة هي أن أولئك الذين يعرفون المفتاح (القاعدة لاستبدال الأحرف) فقط هم من يمكنهم جعل الشفرة مفهومة مرة أخرى. بمعنى آخر: الشفرات تجعل الرسائل السرية ممكنة، سواء كانت لعبة طفولة مع لغة سرية أو جواسيس حقيقيون يرسلون رسائل مشفرة. 😄
هل كنت تعلم؟
كلمة “chiffer” (تشفير) مشتقة في الواقع من كلمة عربية: كلمة “صفر”، والتي تعني “null”. ربما لأن الشفرة السرية كانت تبدو وكأنها لا شيء (بلا معنى!) عندما لم يتمكن الناس من حلها!
هناك العديد من أنواع الشفرات – بعضها يستخدم الأرقام، وبعضها يستخدم الرموز، وتستخدم تشفير البيانات الحديثة خوارزميات معقدة للغاية. تتطلب هذه الخوارزميات المعقدة رياضيات معقدة للغاية، لذا يمكننا النظر في بعض الخوارزميات الأبسط أولاً!
الشفرات أحادية الأبجدية
دعونا نلقي نظرة أولاً على بعض أبسط (وأقدم) طرق التشفير الموجودة: الشفرات أحادية الأبجدية.
قد تبدو كلمة “أحادية الأبجدية” (monoalfabetisk) كلمة صعبة، ولكن يمكننا تقسيمها: “mono” تعني “واحد”، و”alfabetisk” تتعلق بالأبجدية.
أي أن الشفرات أحادية الأبجدية هي رموز يتم فيها استخدام “أبجدية تشفير” واحدة لكل الرسالة. وهذا يعني أن كل حرف في النص الأصلي يتم استبداله دائماً بنفس الحرف طوال الرسالة المشفرة.
على سبيل المثال، إذا قررت أن حرف A سيتم استبداله بحرف X، فسيتم تحويل جميع أحرف A في النص إلى X.
شفرة قيصر
المثال الكلاسيكي على الشفرة الأبجدية الأحادية هو شفرة قيصر (المسماة على اسم يوليوس قيصر). هذا هو بشكل أساسي قاعدة “إزاحة” جميع الأحرف بعدد معين من الأماكن في الأبجدية. يُزعم أن قيصر نفسه استخدم إزاحة 3 أحرف في رسائله السرية. إنه يعمل بحيث تصبح A إلى D، و B إلى E، و C إلى F، وهكذا عبر الأبجدية. (عندما تتجاوز Z، تبدأ من A مرة أخرى.) ستصبح الرسالة التي هي ABC إلى DEF إذا استخدمنا طريقة قيصر.
كيف يعمل شيفرة قيصر عمليًا:
- اختر مفتاحًا: حدد رقمًا سريًا (مثل 3) يحدد عدد الأماكن التي ستُزيح بها كل حرف.
- استبدل كل حرف: لكل حرف في الرسالة الأصلية، ابحث عن الحرف الذي يقع بعده بعدد الأماكن المحدد (بالنسبة للمفتاح 3، يصبح A إلى D، و B إلى E، إلخ - تذكر العودة إلى A مرة أخرى بعد Z إذا لزم الأمر). يمكنك أيضًا تضمين Æ، Ø و Å، ولكن هذا يصبح أكثر تعقيدًا بعض الشيء.
- رسالة مشفرة: استبدل الأحرف واكتب الرسالة الجديدة بالأحرف “المنزاحة”. هكذا - لديك نص غير مقروء وسري لا يمكن إلا لأولئك الذين لديهم المفتاح فهمه!
- لفك التشفير (أي إعادته إلى نص مقروء)، قم ببساطة بإجراء الإزاحة العكسية. إذا كنت تعرف المفتاح (مثل 3)، فمن السهل بنفس القدر قراءة الرسالة عن طريق تحريك الأحرف 3 خطوات إلى الوراء في الأبجدية.
Sikkerhet?
هذه الرموز ليست آمنة على المدى الطويل. نظرًا لأن النمط (الاستبدال) ثابت، يمكن لشخص لديه ما يكفي من الصبر أو بعض الحيل الذكية كشف السر بسهولة. على سبيل المثال، هناك عدد قليل فقط من التحولات المحتملة في شيفرة قيصر، بعدد حروف الأبجدية، لذلك يمكن لأي شخص تجربة كل منها حتى تصبح الرسالة منطقية - أو استخدام ترددات الحروف للتخمين. بمعنى آخر، ربما لا تستخدم شيفرة قيصر للملاحظات السرية للغاية في دفتر يومياتك أو للأسرار الحكومية 😉.
تعتبر الشيفرات الأحادية الأبجدية طريقة رائعة لتعلم مبدأ التشفير. إنها بسيطة وتوضح كيف يمكننا استخدام قاعدة بسيطة (مفتاح) لتحويل نص مفهوم إلى شيء غامض وغير مفهوم - والعودة مرة أخرى. لذا في المرة القادمة التي تريد فيها إرسال رسالة سرية إلى صديق، يمكنك استخدام شيفرة قيصر! ربما يمكنكما إنشاء نسختكما الخاصة من الأبجدية السرية لقيصر؟ 🔐✨
المهام
لغات البرمجة؟
كما هو الحال من قبل، لا تتردد في استخدام أي لغة برمجة تريدها! ستكون الأمثلة هنا بلغة بايثون.
المهمة 1.1 - تشفير قيصر
الآن سنكتب بعض التعليمات البرمجية فعليًا! سنبدأ ببساطة بإنشاء التشفير، بناءً على النظرية، يجب أن يكون الأمر بسيطًا للغاية.
قم بتنفيذ التشفير باستخدام تشفير قيصر باستخدام دالة تأخذ النص ورقمًا هو “المفتاح”، أي مقدار دوران الأبجدية به.
نصائح حول منهجية الحل.
- أنشئ دالة تسمى
caesarتأخذ النص المراد تشفيره وقيمة “الإزاحة” (shift)، أي عدد المرات التي سيتم فيها تحريك الأحرف في الأبجدية. - مر على الحروف واحدة تلو الأخرى داخل النص.
- لن نقوم بإجراء الإزاحة إلا للأحرف فقط: اكتشف كيفية التحقق مما إذا كان الرمز الموجود في النص حرفاً أم لا.
- نريد تدوير الحرف بمقدار n من المواضع، بمعنى أننا بحاجة إلى إضافة قيمة التدوير: ابحث عن طريقة لتحويل النص إلى أرقام حتى تتمكن من إضافة قيمته المزاحَة. تلميح: استخدم الدالة
ord(). - لا تنسَ! ستحصل على نتائج مختلفة اعتمادًا على ما إذا كانت الأحرف صغيرة أو كبيرة. راجع جدول ASCII.
- بعد الحصول على القيمة الرقمية، يصبح الأمر بسيطاً ويتمثل في جمع الرقم n. ولكن ماذا يحدث عندما تصل إلى نهاية الأبجدية؟ سنحصل على رموز عشوائية بدلاً من أحرف صحيحة بعد ‘Z’. كيف يمكن حل هذه المشكلة؟ هذا يتطلب بعض التفكير.
إصلاح عملية التشفير.
لإصلاح مشكلة تشفير الأحجام بشكل كامل يلزم إجراء حسابات دقيقة.
- الخطوة الأولى هي استخدام عامل العمليات المعروفة بـ القسمة المتبقية (modulo)، أي
%. - بما أن الأبجدية الإنجليزية تتكون من 26 حرفاً، يمكننا أخذ الباقي عند القسمة على
26. - لكن ذلك لا يعمل تماماً؛ هل أدرك السبب؟
- حاول طباعة قيمة الرمز باستخدام دالة
print()مع استدعاءord()، فما النتيجة التي تحصل عليها؟ - بالنسبة للحرف
aتكون قيمته 97. وإذا أخذت باقي قسيمتها على العدد 26 ستحصل على الناتج 19. تذكر دائماً بأن العامل modulo سيعطي ناتجاَ بين الصفر والعدد الذي تم قسمته عليه مباشرةً دون احتسابه نفسه في النطاق المفتوح النهائي. - يتم تصحيح الأمر عن طريق تخزين القيم الأولية للأحرف الكبيرة والصغيرة وطرحها من الحرف الحالي ثم تطبيق العملية الحسابية الباقِيَة:
(ord(الحرف) – ord('a')) % 26) - للحصول مرة أخرى على الحرف الصحيح أضف القيمة الابتدائية مجدداً إلى الرقم المحسوب حديثًا .
- بعد كل ما سبق يمكنك أخيراً تحويل هذا الرقم المعالج ليصبح حروفاً مرّة ثانية هنا يمكن استخدام الدالة
chr(). - الآن بإمكانك أخيراُ إضافة تلك الأحروف المُعالجة ضمن جملة النص النهائية وإرجاع نص المشفرة ككلٍ واحد!
الحل:
def caesar_cipher(text, shift):
result = ""
for char in text:
if char.isalpha():
# تحديد نقطة البداية بناءً على الأحرف الكبيرة والصغيرة
start = ord('A') if char.isupper() else ord('a')
# عملية حساب الإزاحة الصعبة
result += chr((ord(char) - start + shift) % 26 + start)
else:
result += char
return result
المهمة 1.2 - فك تشفير شيفرة قيصر
فك التشفير هو مجرد إجراء العملية الحسابية العكسية للتشفير. أنت تطرح الإزاحة بدلاً من إضافتها.
نصائح لخطوات العمل.
استخدم الوظيفة التي أنشأتها في المهمة 1 لهذا الغرض. فقط خذ نفس الوظيفة، ولكن بشكل عكسي. يمكنك القيام بذلك عن طريق تغيير الإزاحة عند 26 - shift.
الحل:
def caesar_decrypt(text, shift):
return caesar_cipher(text, 26 - shift)
شفرات أحادية الأبجدية أخرى (مثل: Atbash)
توجد شفرات أحادية الأبجدية أخرى أيضًا! إحدى أبسطها هي ما تسمى بشفرة “Atbash”.
كيف يعمل Atbash؟
هذا بسيط للغاية، بدلاً من الدوران، يتم تعيين الأحرف إلى الأبجدية المعاكسة. فيما يلي جدول يوضح التعيين:
| 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| z | y | x | w | v | u | t | s | r | q | p | o | n | m | l | k | j | i | h | g | f | e | d | c | b | a |
المهمة 1.3 - تشفير وفك تشفير Atbash
الجميل في Atbash هو أنه نظرًا لأن التشفير هو تحويل واحد لواحد، فإنه يعمل مباشرة في الاتجاه المعاكس. بمعنى آخر، إذا قمت بإنشاء التشفير، فقد قمت تلقائيًا بإنشاء فك التشفير أيضًا.
كيف يمكن القيام بذلك عمليًا؟
يمكنك إما طرح قيمة الحرف بالنسبة لـ Z، أو إنشاء جدول “بحث”. بمعنى آخر، جدول أو قاموس يحتوي على جميع الأحرف من a إلى z وماذا يجب أن تصبح. يمكن أن يكون هذا حلاً جيدًا إذا أردتم إنشاء نوع آخر من التشفير.
تنفيذ جدول البحث.
letters = {
'a': 'z'
'b': 'y'
'c': 'x'
'd': 'w'
# ... أضف بقية الحروف أدناه
}
باستخدام هذا الجدول، يمكنك المرور حرفًا حرفًا، ثم استخراج القيمة لكل حرف من جدول البحث، ثم طباعتها. ماذا يجب أن تفعل للأحرف الكبيرة والصغيرة؟
الجزء الثاني - تحليل التشفير الأبجدي الأحادي
في هذا الجزء، ستحاولون إنشاء خوارزمية “لكسر” شيفرة قيصر، أي أخذ نص مشفر، ثم استخراج النص الأصلي دون معرفة المفتاح.
يمكن القيام بذلك يدويًا إلى حد ما، أو يمكنك محاولة استخدام “تحليل التشفير” البسيط. هذا مفهوم سنتعمق فيه لاحقًا، ولكن الآن سننظر فقط في إحدى أبسط الطرق: تحليل التردد (frequency analysis). يمكنك قراءة المزيد حول هذا المفهوم هنا: Frequency Analysis أو هنا Wikipedia - frequency analysis.
يمكن استخدام هذه الطريقة في أكثر من مجرد شيفرة قيصر، ويمكن استخدامها في خوارزميات أكثر تعقيدًا أيضًا، ولكن شيفرة قيصر بسيطة جدًا بحيث يكون تحليل التردد سهلاً للغاية.
كيف يعمل تحليل التردد؟
تحليل التردد هو، كما يوحي الاسم، طريقة للتحقق من تكرار الحروف في نص ما. لماذا قد يكون هذا مفيداً؟ تخيل أن لديك نصاً طويلاً، لنفترض أنه نص إنجليزي، مأخوذ من Wikipedia - frequency analysis:
In cryptanalysis, frequency analysis is the study of the frequency of letters or groups of letters in a ciphertext. The method is used as an aid to breaking classical ciphers.
Frequency analysis is based on the fact that, in any given stretch of written language, certain letters and combinations of letters occur with varying frequencies. Moreover, there is a characteristic distribution of letters that is roughly the same for almost all samples of that language. For instance, given a section of English language, E, T, A and O are the most common, while Z, Q, X and J are rare. Likewise, TH, ER, ON, and AN are the most common pairs of letters termed bigrams or digraphs), and SS, EE, TT, and FF are the most common repeats. The nonsense phrase ETAOIN SHRDLU represents the 12 most frequent letters in typical English language text.
In some ciphers, such properties of the natural language plaintext are preserved in the ciphertext, and these patterns have the potential to be exploited in a ciphertext-only attack.
إذا قمنا بتحويل هذا النص باستخدام شفرة قيصر (مع إزالة الفواصل، المسافات، وغيرها من الرموز الخاصة أيضاً)، سنحصل على النص المشفر التالي:
xcrgneipcpanhxhugtfjtcrnpcpanhxhxhiwthijsnduiwtugtfjtcrnduatiitghdgvgdjehduatiitghxcprxewtgitmiiwtbtiwdsxhjhtsphpcpxsidqgtpzxcvraphhxrparxewtghugtfjtcrnpcpanhxhxhqphtsdciwtupriiwpixcpcnvxktchigtirwdulgxiitcapcvjpvtrtgipxcatiitghpcsrdbqxcpixdchduatiitghdrrjglxiwkpgnxcvugtfjtcrxthbdgtdktgiwtgtxhprwpgpritgxhixrsxhigxqjertdcduatiitghiwpixhgdjvwaniwthpbtudgpabdhipaahpbeathduiwpiapcvjpvtudgxchipcrtvxktcphtrixdcdutcvaxhwapcvjpvttippcsdpgtiwtbdhirdbbdclwxatofmpcsypgtgpgtaxztlxhtiwtgdcpcspcpgtiwtbdhirdbbdcepxghduatiitghitgbtsqxvgpbhdgsxvgpewhpcshhttiipcsuupgtiwtbdhirdbbdcgtetpihiwtcdchtchtewgphttipdxchwgsajgtegthtcihiwtbdhiugtfjtciatiitghxcinexrpatcvaxhwapcvjpvtitmixchdbtrxewtghhjrwegdetgixthduiwtcpijgpaapcvjpvteapxcitmipgtegthtgktsxciwtrxewtgitmipcsiwthtepiitgchwpktiwteditcixpaidqttmeadxitsxcprxewtgitmidcanpiiprz
يبدو هذا النص مستحيلاً لفك تشفيره، ولكن بمساعدة “تحليل التردد”، الأمر ليس ممكناً فحسب، بل بسيط أيضاً.
هذا شكل يوضح توزيع الحروف في اللغة الإنجليزية. ما يمكننا رؤيته هو أن الحرف E هو الحرف الأكثر تكراراً، يليه T و A و O.
يمكن تحويل هذا إلى جدول واستخدامه لعد و تحليل نص مشفر معين ومن ثم “فك تشفيره”. في المهام أدناه، ستطلب منك إنشاء برنامج يمكنه “فك تشفير” شفرة قيصر ذاتياً. صحيح أن شفرة قيصر بسيطة للغاية لدرجة أنه يمكنك فقط التحقق من جميع الاحتمالات الـ 26 يدوياً، ولكننا هنا سنكتشف الحل بشكل آلي تماماً.
مهمة 2.1 - إنشاء جدول تكرار
في ملف بايثون، قم بإنشاء جدول تكرار لأحرف اللغة الإنجليزية. يمكنك محاولة العثور عليها بنفسك، ولكن إذا لم تكن ترغب في ذلك، فإننا نتفهم ذلك!
إذا كنت ترغب بالتأكيد في العثور عليها بنفسك، يمكنك فعل ما فعلته في المهمة 2.2، ولكن على نص كبير جدًا.
تكرار الحروف الإنجليزية (الإجابة)
english_letter_frequency = {
'E': 12.70,
'T': 9.06,
'A': 8.17,
'O': 7.51,
'I': 6.97,
'N': 6.75,
'S': 6.33,
'H': 6.09,
'R': 5.99,
'D': 4.25,
'L': 4.03,
'C': 2.78,
'U': 2.76,
'M': 2.41,
'W': 2.36,
'F': 2.23,
'G': 2.02,
'Y': 1.97,
'P': 1.93,
'B': 1.29,
'V': 0.98,
'K': 0.77,
'J': 0.15,
'X': 0.15,
'Q': 0.10,
'Z': 0.07
}
المهمة 2.2 - عد تكرار الحروف في النص
الآن سنقوم بإنشاء خوارزمية للعثور على تكرار الحروف في نص معين.
نصائح لخطوات العمل
- ابدأ بدالة تستقبل نصاً (يمكن أن يكون أي شيء).
- في الدالة، أنشئ “dictionary” (Python Dictionaries)، مع مدخلات لكل حرف في الأبجدية، مضبوطة على
0. ({'A' = 0, 'B' = 0, 'C' = 0, ..., 'Z' = 0}) - قم بالمرور عبر النص بالكامل وعد كل حرف (زد بمقدار 1 في المدخل المقابل في الـ dictionary). هنا يجب عليك تجاهل الرموز التي ليست حروفاً، وتذكر أيضاً الحروف الكبيرة والصغيرة.
- تتبع إجمالي عدد الحروف التي تم عدها.
- عندما تنتهي من العد، اقسم
/كل قيمة في الجدول على طول النص ثم اضرب في 100، سيعطيك هذا تكراراً مئوياً. (يمكنك بالطبع ترك قيم الجدول بين 0 و 1). - الآن يجب أن يكون لديك جدول تكرار للنص.
المهمة 2.3 - مقارنة تردد نص بتردد حقيقي
بمجرد العثور على تردد جميع الأحرف في النص، يمكنك إنشاء دالة تجد “المسافة”. ماذا يعني ذلك؟!
يمكنك تخيل أن تردد، على سبيل المثال، E في النص سيكون رقمًا. يمكنك إيجاد “المسافة” بين هذا والتردد الفعلي، وهو 12.70. مثال: التردد هو 9.63، ما هي المسافة؟ ستكون المسافة القيمة المطلقة (الأرقام السالبة تصبح موجبة) بين هاتين القيمتين: \(12.70 - 9.63 = 3.07\).
قم بإنشاء دالة تمر عبر كل حرف وتجد المسافة. ثم اجمع كل المسافات معًا للحصول على “إجمالي” المسافة.
دالة رياضية؟
إذا كنت تتساءل عن كيفية عمل الدالة الرياضية لهذه، فهي تبدو كالتالي:
\(\sum_{n=0}^{N} \lvert a - b\rvert\)
نصائح حول طريقة العمل
- استخدم حلقة
forللمرور عبر جدول التردد بالكامل. - لكل حرف في جدول التردد، ابحث عن القيمة المطلقة مقارنة بالتردد الفعلي. استخدم دالة
abs()في Python لهذا الغرض. - اجمع كل القيم، وبذلك ستحصل على النتيجة النهائية.
مهمة 2.4 - “كسر” شيفرة قيصر
الآن سنجمع كل ما فعلناه حتى الآن! الآن سنقوم “بكسر” شيفرة قيصر.
قم بإنشاء برنامج “يكسر” شيفرة قيصر! بدون تدخل المستخدم، يجب أن تكون قادرًا على إدخال نص مشفر واستخراج النص المفكك بدون الحاجة إلى مفتاح.
Test data
إليكم بعض البيانات التجريبية التي يمكنك استخدامها، ماذا تقول هذه البيانات؟
| Test-data |
|---|
cqrbvnbbjpnrbjenahbnlancxwnqxynoduuhhxdjanjkuncxmnlxmnrclxvyuncnuhjwmqnanjanbxvnfxamboaxvxdaojexarcnsnmrqnuuxcqnanrcbxenajwjtrwrqjencqnqrpqpaxdwmhxdfnanarpqccqnwnpxcrjcrxwbfnanbqxac |
lsaizivxlmwqiwwekimwuymxiwlsvxwsmqklxrsxasvoewibtigxihlsaizivmjmxhsiwksshnsf |
bmtxymjwjsfdfsxbjwrjxyfsifsizsktqidtzwxjqkqtslqnajymjpnslgfwsfwitmjdtzhtrjrtxyhfwjkzqqdzutsdtzwmtzwynxstbxywzhpybjqajljyymjjytgjikwfshnxhtktwymnxwjqnjkrzhmymfspxynxgnyyjwhtqifsinfrxnhpfymjfwymfajdtzmfivznjylzfwistyfrtzxjxynwwnslbjqqlttisnlmynkdtzitrjjymtwfyntfsirfwhjqqzxymjwnafqxtkrdbfyhmgniymjrrfpjmfxyj |
zwkyvivrivrepzuzfkjzekyviffdnzcckyvpgcvrjvjkreulgjrzukyvjritrjkztkvrtyvirwkvircfexjzcvetvfevwivjydreifjvkfyzjwvvkefnkyvedzjkvinypufpfltfejzuvipflijvcwrezuzfkzehlzivukyvkvrtyvinzkyrjevvinvccrtklrccpzufekjrzukyvjkluvekslkzyrklvfjvvpfljkreuzexlgkyvivrccsppflijvcw |
uwwilxchaniuffehiqhfuqmizupcuncihnbylycmhiqusuvyymbiofxvyuvfynizfscnmqchamulyniimguffniayncnmzunfcnnfyvixsizznbyaliohxnbyvyyizwiolmyzfcymuhsqusvywuomyvyymxihnwulyqbunboguhmnbchecmcgjimmcvfysyffiqvfuwesyffiqvfuwesyffiqvfuwesyffiqvfuweiibvfuweuhxsyffiqfynmmbueycnojufcnnfyvullsvlyuezumncmlyuxswigcha |
نصائح لمنهجية العمل
- ابدأ بإنشاء دالة تستقبل نصاً.
- استخدم دالة فك التشفير الخاصة بشفرة قيصر مع تدوير N على النص، حيث يبدأ N من 0.
- أنشئ جدول ترددات للنتيجة.
- احسب المسافة بين النتيجة وجدول الترددات الفعلي.
- إما: أ) تتبع المسافة في قائمة، أو ب) تتبع أصغر قيمة والتدوير (هذا سيكون المفتاح).
- زد التدوير بمقدار 1 وكرر الخطوات من 2 إلى 6 حتى يصل N إلى 26 (تدوير كامل).
- أرجع النص المفكوك تشفيره، أي أن أصغر مسافة هي المفتاح الصحيح.

