هذا نص مترجم آليًا وقد يحتوي على أخطاء!
Om kryptografioppgavene
هذه المهام منظمة بشكل مختلف قليلاً عن المهام الأخرى على Piggy، أتساءل ما الذي تفضلونه! 😎
سيكون هناك الكثير من المعلومات في البداية حول الموضوعات، ثم ستأتي بعض المهام بعد ذلك!
“المستويات” في هذه المهمة ليست تمامًا مثل المستويات السابقة، هنا الأمور مقسمة بشكل أكبر إلى موضوعات.
ما هو “Cipher”؟
هل رغبت يومًا في كتابة رسالة سرية إلى صديق، بحيث لا يستطيع أي شخص آخر فهمها؟ إذن أنت بحاجة إلى Cipher، أو شفرة باللغة النرويجية! الشفرة هي ببساطة طريقة تحول النص العادي إلى “رمز” عن طريق استبدال الأحرف (غالبًا الأحرف) بأحرف أخرى. يبدو الناتج هراءً لأولئك الذين لا يعرفون كيف تعمل الشفرة. الفكرة هي أن أولئك الذين يعرفون المفتاح (القاعدة لاستبدال الأحرف) فقط هم من يمكنهم جعل الشفرة مفهومة مرة أخرى. بمعنى آخر: الشفرات تجعل الرسائل السرية ممكنة، سواء كانت لعبة طفولة مع لغة سرية أو جواسيس حقيقيون يرسلون رسائل مشفرة. 😄
Visste du?
الكلمة “chiffer” مشتقة في الواقع من كلمة عربية: كلمة صفر، والتي تعني “صفر”. ربما لأن الشفرة السرية بدت وكأنها لا شيء (لا معنى!) عندما لا يستطيع الناس حلها!
هناك أنواع عديدة من الشفرات – بعضها يستخدم الأرقام، وبعضها يستخدم الرموز، وتستخدم التشفير الحديث للبيانات خوارزميات معقدة للغاية. تتطلب هذه الخوارزميات المعقدة رياضيات معقدة للغاية، لذلك يمكننا النظر في بعض الخوارزميات الأبسط أولاً!
Monoalfabetiske Chiffer
دعنا الآن ننظر إلى بعض من أبسط (وأقدم) طرق التشفير الموجودة: الشفرات أحادية الأبجدية.
قد يبدو أحادي الأبجدية كلمة صعبة، ولكن يمكننا تقسيمها: mono تعني “واحد”، و alphabetic تتعلق بالأبجدية.
إذًا، الشفرات أحادية الأبجدية هي رموز تستخدم “أبجدية تشفير” واحدة للرسالة بأكملها. بمعنى أن كل حرف في النص الأصلي يتم استبداله دائمًا بنفس الحرف طوال الرسالة المشفرة.
على سبيل المثال، إذا قررت أن 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 - تشفير قيصر
الآن سنكتب بعض التعليمات البرمجية فعليًا! سنبدأ ببساطة بإنشاء التشفير، بناءً على النظرية، يجب أن يكون الأمر بسيطًا للغاية.
قم بتنفيذ التشفير باستخدام تشفير قيصر باستخدام دالة تأخذ النص ورقمًا هو “المفتاح”، أي مقدار دوران الأبجدية به.
Tips til framgangsmåte.
- قم بإنشاء دالة باسم
caesarتأخذ النص المراد تشفيره و “إزاحة”، أي عدد الأماكن في الأبجدية التي سيتم فيها إزاحة النص. - قم بالمرور على الحرف تلو الآخر في النص.
- لا نريد “إزاحة” الأحرف الأخرى غير الحروف: اكتشف كيفية التحقق مما إذا كان الحرف في النص هو حرف.
- يجب علينا “تدوير” الحرف n مكانًا، أي يجب علينا إضافة الدوران: اكتشف كيفية تحويل النص إلى أرقام حتى تتمكن من إضافة الإزاحة. تلميح: دالة
ord(). - تذكر! ستحصل على قيم مختلفة بناءً على ما إذا كانت لديك أحرف صغيرة أو كبيرة. راجع جدول ASCII.
- بعد حصولك على قيمة، الأمر بسيط مثل إضافة قيمة n. ولكن ماذا يحدث إذا كنت في نهاية الأبجدية؟ سنحصل فقط على هراء بعد الحرف Z. كيف يتم إصلاح هذا؟ هذا يتطلب بعض التفكير.
Fikse enkrypteringen.
For å fikse krypteringen helt krever litt tenking.
- Det første steget å tenke på er bruk av modulus operatoren,
%. - Siden alfabetetet (på engelsk) består av 26 bokstaver, kan vi ta modulus med
26. - Men dette fungerer ikke helt, ser du grunnen?
- Prøv å
printut verdien til en karakter medord(), hva får du? - For
afår du 97. Hvis du tar modulus 26 med dette, får du 19. Husk at modulus vil alltid gi et svar mellom 0 og tallet. - Dette kan fikses ved å lagre startverdien til store og små bokstaver, trekke denne fra bokstaven, og deretter ta modulus. Da blir det:
(ord(bokstav) - ord('a')) % 26 - For å få tilbake den rette bokstaven legger du bare til startverdien igjen.
- بعد كل هذا، يمكنك أخيرًا تحويل الرقم إلى حرف مرة أخرى. هنا يمكنك استخدام دالة
chr(). - الآن يمكنك أخيرًا إضافة الحرف إلى النتيجة وإرجاع النص المشفر!
Løsning:
def caesar_cipher(text, shift):
result = ""
for char in text:
if char.isalpha():
# finn ut startpunktet basert på store og små bokstaver
start = ord('A') if char.isupper() else ord('a')
# Den vanskelige shifte-utregningen
result += chr((ord(char) - start + shift) % 26 + start)
else:
result += char
return result
> الحل:
def caesar_cipher(text, shift):
result = ""
for char in text:
if char.isalpha():
# finn ut startpunktet basert på store og små bokstaver
start = ord('A') if char.isupper() else ord('a')
# Den vanskelige shifte-utregningen
result += chr((ord(char) - start + shift) % 26 + start)
else:
result += char
return result
المهمة 1.2 - فك تشفير شيفرة قيصر
فك التشفير هو مجرد إجراء العملية الحسابية العكسية للتشفير. أنت تطرح الإزاحة بدلاً من إضافتها.
Tips til framgangsmåte.
استخدم الدالة التي أنشأتها في المهمة 1 لهذا الغرض. فقط خذ نفس الدالة، ولكن بالعكس. يمكنك القيام بذلك عن طريق تغيير الإزاحة إلى 26 - shift.
Løsning:
def caesar_decrypt(text, shift):
return caesar_cipher(text, 26 - shift)
الحل:
def caesar_decrypt(text, shift):
return caesar_cipher(text, 26 - shift)
Andre Monoalfabetiske Chiffer/Ciphers (ex. 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 وماذا يجب أن تصبح. يمكن أن يكون هذا حلاً جيدًا إذا أردتم إنشاء نوع آخر من التشفير.
Lookup-table implementasjon.
letters = {
'a': 'z'
'b': 'y'
'c': 'x'
'd': 'w'
# ... legg til resten av bokstavene nedover
}
تطبيق جدول البحث.
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.
إذا قمنا بتحويل هذا النص باستخدام تشفير قيصر (وأزلنا الفواصل والمسافات والأحرف الخاصة الأخرى)، فسنحصل على النص المشفر التالي:
xcrgneipcpanhxhugtfjtcrnpcpanhxhxhiwthijsnduiwtugtfjtcrnduatiitghdgvgdjehduatiitghxcprxewtgitmiiwtbtiwdsxhjhtsphpcpxsidqgtpzxcvraphhxrparxewtghugtfjtcrnpcpanhxhxhqphtsdciwtupriiwpixcpcnvxktchigtirwdulgxiitcapcvjpvtrtgipxcatiitghpcsrdbqxcpixdchduatiitghdrrjglxiwkpgnxcvugtfjtcrxthbdgtdktgiwtgtxhprwpgpritgxhixrsxhigxqjixdcduatiitghiwpixhgdjvwaniwthpbtudgpabdhipaahpbeathduiwpiapcvjpvtudgxchipcrtvxktcphtrixdcdutcvaxhwapcvjpvttippcsdpgtiwtbdhirdbbdclwxatofmpcsypgtgpgtaxztlxhtiwtgdcpcspcpgtiwtbdhirdbbdcepxghduatiitghitgbtsqxvgpbhdgsxvgpewhpcshhttiipcsuupgtiwtbdhirdbbdcgtetpihiwtcdchtchtewgphttipdxchwgsajgtegthtcihiwtbdhiugtfjtciatiitghxcinexrpatcvaxhwapcvjpvtitmixchdbtrxewtghhjrwegdetgixthduiwtcpijgpaapcvjpvteapxcitmipgtegthtgktsxciwtrxewtgitmipcsiwthtepiitgchwpktiwteditcixpaidqttmeadxitsxcprxewtgitmidcanpiiprz
يبدو هذا النص مستحيلاً “كسره”، ولكن بمساعدة “تحليل التردد” ليس من الممكن فحسب، بل من السهل القيام بذلك.
هذا شكل يوضح توزيع الأحرف في اللغة الإنجليزية. يمكننا أن نرى أن الحرف E هو الحرف الأكثر شيوعًا، يليه T و A و O.
يمكن تحويل هذا إلى جدول ثم استخدامه لعد وتحليل نص مشفر معين ثم “كسره”. في المهام أدناه، يجب عليك إنشاء برنامج يمكنه “كسر” تشفير قيصر بنفسه. صحيح أن تشفير قيصر بسيط جدًا بحيث يمكنك التحقق من جميع الاحتمالات الـ 26 يدويًا، ولكن هنا سنكتشف الحل تلقائيًا.
مهمة 2.1 - إنشاء جدول تكرار
في ملف بايثون، قم بإنشاء جدول تكرار لأحرف اللغة الإنجليزية. يمكنك محاولة العثور عليها بنفسك، ولكن إذا لم تكن ترغب في ذلك، فإننا نتفهم ذلك!
إذا كنت ترغب بالتأكيد في العثور عليها بنفسك، يمكنك فعل ما فعلته في المهمة 2.2، ولكن على نص كبير جدًا.
English Letter Frequency (Svaret)
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 - عد تكرار الحروف في النص
الآن سنقوم بإنشاء خوارزمية للعثور على تكرار الحروف في نص معين.
Tips til framgangsmåte
- ابدأ بدالة تأخذ نصًا كمدخل (يمكن أن يكون أي شيء).
- في الدالة، قم بإنشاء “قاموس” (Python Dictionaries)، مع إدخالات لكل حرف في الأبجدية، مضبوطة على
0. ({'A' = 0, 'B' = 0, 'C' = 0, ..., 'Z' = 0}) - قم بالمرور عبر النص بأكمله وعد كل حرف (زيادة بمقدار 1 في الإدخال المقابل في القاموس). يجب عليك تجاهل الأحرف التي ليست أحرفًا، وتذكر الأحرف الكبيرة والصغيرة.
- تتبع عدد الأحرف التي تم عدها إجمالاً.
- عندما تنتهي من العد، اقسم
/كل قيمة في الجدول على طول النص ثم اضرب في 100، سيعطيك هذا ترددًا بالنسبة المئوية. (يمكنك بالطبع ترك جدولك أعلاه بين 0 و 1). - الآن يجب أن يكون لديك جدول تردد للنص.
المهمة 2.3 - مقارنة تردد نص بتردد حقيقي
بمجرد العثور على تردد جميع الأحرف في النص، يمكنك إنشاء دالة تجد “المسافة”. ماذا يعني ذلك؟!
يمكنك تخيل أن تردد، على سبيل المثال، E في النص سيكون رقمًا. يمكنك إيجاد “المسافة” بين هذا والتردد الفعلي، وهو 12.70. مثال: التردد هو 9.63، ما هي المسافة؟ ستكون المسافة القيمة المطلقة (الأرقام السالبة تصبح موجبة) بين هاتين القيمتين: \(12.70 - 9.63 = 3.07\).
قم بإنشاء دالة تمر عبر كل حرف وتجد المسافة. ثم اجمع كل المسافات معًا للحصول على “إجمالي” المسافة.
دالة رياضية؟
إذا كنت تتساءل عن كيفية عمل الدالة الرياضية لهذه، فهي تبدو كالتالي:
\(\sum_{n=0}^{N} \lvert a - b\rvert\)
Tips til framgangsmåte
- استخدم حلقة
forللمرور على جدول التردد بأكمله. - لكل حرف في جدول التردد، ابحث عن القيمة المطلقة مقارنة بالتردد الفعلي. استخدم دالة
abs()في بايثون لهذا الغرض. - اجمع كل القيم، وستحصل على نتيجة نهائية.
مهمة 2.4 - “كسر” شيفرة قيصر
الآن سنجمع كل ما فعلناه حتى الآن! الآن سنقوم “بكسر” شيفرة قيصر.
قم بإنشاء برنامج “يكسر” شيفرة قيصر! بدون تدخل المستخدم، يجب أن تكون قادرًا على إدخال نص مشفر واستخراج النص المفكك بدون الحاجة إلى مفتاح.
Test data
هنا بعض البيانات الاختبارية التي يمكنكم استخدامها، ماذا تقولون عن هذه؟
| Test-data |
|---|
cqrbvnbbjpnrbjenahbnlancxwnqxynoduuhhxdjanjkuncxmnlxmnrclxvyuncnuhjwmqnanjanbxvnfxamboaxvxdaojexarcnsnmrqnuuxcqnanrcbxenajwjtrwrqjencqnqrpqpaxdwmhxdfnanarpqccqnwnpxcrjcrxwbfnanbqxac |
lsaizivxlmwqiwwekimwuymxiwlsvxwsmxqmklxrsxasvoewibtigxihlsaizivmjmxhsiwksshnsf |
bmtxymjwjsfdfsxbjwrjxyfsifsizsktqidtzwxjqkqtslqnajymjpnslgfwsfwitmjdtzhtrjrtxyhfwjkzqqdzutsdtzwmtzwynxstbxywzhpybjqajljyymjjytgjikwfshnxhtktwymnxwjqnjkrzhmymfspxynxgnyyjwhtqifsinfrxnhpfymjfwymfajdtzmfivznjylzfwistyfrtzxjxynwwnslbjqqlttisnlmynkdtzitrjjymtwfyntfsirfwhjqqzxymjwnafqxtkrdbfyhmgniymjrrfpjmfxyj |
zwkyvivrivrepzuzfkjzekyviffdnzcckyvpgcvrjvjkreulgjrzukyvjritrjkztkvrtyvirwkvircfexjzcvetvfevwivjydreifjvkfyzjwvvkefnkyvedzjkvinypufpfltfejzuvipflijvcwrezuzfkzehlzivukyvkvrtyvinzkyrjevvinvccrtklrccpzufekjrzukyvjkluvekslkzyrkvkfjvvpfljkreuzexlgkyvivrccsppflijvcw |
uwwilxchaniuffehiqhfuqmizupcuncihnbylycmhiqusuvyymbiofxvyuvfynizfscnmqchamulyniimguffniayncnmzunfcnnfyvixsizznbyaliohxnbyvyyizwiolmyzfcymuhsqusvywuomyvyymxihnwulyqbunboguhmnbchecmcgjimmcvfysyffiqvfuwesyffiqvfuwesyffiqvfuwesyffiqvfuweiibvfuweuhxsyffiqfynmmbueycnojufcnnfyvullsvlyuezumncmlyuxswigcha |
Tips til framgangsmåte
- ابدأ بإنشاء دالة تأخذ نصًا كمدخل.
- استخدم دالة فك التشفير لشفرة قيصر مع دوران N على النص، حيث يبدأ N من 0.
- قم بإنشاء جدول تكرار للنتيجة.
- اكتشف المسافة بين النتيجة وجدول التكرار الفعلي.
- إما: أ) تتبع المسافة في قائمة، أو ب) تتبع القيمة الأصغر والدوران (هذا سيكون المفتاح).
- زد الدوران بمقدار 1 وكرر الخطوات من 2 إلى 6 حتى يصل N إلى 26 (دوران كامل).
- أرجع النص المفكك، أي أن أقل مسافة هي المفتاح الصحيح.

