تحديات كريبتوبالز › المجموعة 1 1 / 8 التالي

المجموعة 1

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

هذه المجموعة سهلة نسبيًا. باستثناء واحد، ينبغي ألا يستغرق معظم هذه التمارين سوى بضع دقائق. لكن لا تقسُ على نفسك إن استغرق وقتًا أطول من ذلك. استغرق أليكس أسبوعين لإتمام المجموعة!

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

1. تحويل الست عشري (hex) إلى base64

النص:

49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d

ينبغي أن ينتج:

SSdtIGtpbGxpbmcgeW91ciBicmFpbiBsaWtlIGEgcG9pc29ub3VzIG11c2hyb29t

فامضِ قدمًا وحقّق ذلك. ستحتاج إلى استخدام هذه الشيفرة في بقية التمارين.

قاعدة Cryptopals

اعمل دائمًا على البايتات (bytes) الخام، لا على السلاسل المُرمَّزة. استخدم الست عشري وbase64 للعرض فقط.

2. XOR الثابت

اكتب دالة تأخذ مخزنَي بايتات متساويين في الطول وتنتج ناتج دمجهما بعملية XOR.

إذا عملت دالتك بشكل صحيح، فعندما تُمرّر إليها النص:

1c0111001f010100061a024b53535009181c

... بعد فك ترميز الست عشري، وعند دمجه بـ XOR مع:

686974207468652062756c6c277320657965

... ينبغي أن ينتج:

746865206b696420646f6e277420706c6179

3. شيفرة XOR أحادية البايت

النص المُرمَّز بالست عشري:

1b37373331363f78151b7f2b783431333d78397828372d363c78373e783a393b3736

... خُضع لعملية XOR مع محرف واحد. اعثر على المفتاح (key)، ثم فك تشفير الرسالة.

يمكنك فعل ذلك يدويًا. لكن لا تفعل: اكتب شيفرة تفعلها نيابة عنك.

كيف؟ ابتكر طريقة «لتنقيط» (score) النص الصريح (plaintext) الإنجليزي. تكرار المحارف (frequency) مقياس جيد. قيّم كل ناتج واختر ذاك الذي يحصل على أفضل تنقيط.

إنجاز مفتوح

أصبح لديك الآن إذننا لإطلاق نكات «ETAOIN SHRDLU» على تويتر.

4. كشف (detect) XOR أحادي المحرف

إحدى السلاسل المكوّنة من 60 محرفًا في هذا الملف شُفّرت بـ XOR أحادي المحرف.

اعثر عليها.

(شيفرتك من التمرين رقم 3 ينبغي أن تساعدك.)

5. تنفيذ XOR متكرر المفتاح

إليك المقطع الافتتاحي من عمل مهم في اللغة الإنجليزية:

Burning 'em, if you ain't quick and nimble
I go crazy when I hear a cymbal

شفّره بمفتاح "ICE" باستخدام XOR متكرر المفتاح.

في XOR متكرر المفتاح، ستطبّق كل بايت من المفتاح بالتتابع؛ أول بايت من النص الصريح سيُدمج بـ XOR مع I، ثم C، ثم E، ثم I مجددًا للبايت الرابع، وهكذا.

ينبغي أن يخرج بهذا الشكل:

0b3637272a2b2e63622c2e69692a23693a2a3c6324202d623d63343c2a26226324272765272
a282b2f20430a652e2c652a3124333a653e2b2027630c692b20283165286326302e27282f

شفّر مجموعة من الأشياء باستخدام دالة XOR متكرر المفتاح. شفّر بريدك. شفّر ملف كلمات مرورك. ملف .sig الخاص بك. تدرّب على ذلك. أعدك أننا لا نضيّع وقتك بهذا.

6. كسر (break) XOR متكرر المفتاح

li { padding-top: 1em; }

الأمر أصبح رسميًا الآن.

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

هناك ملف هنا. حُوّل إلى base64 بعد تشفيره بـ XOR متكرر المفتاح.

فك تشفيره.

إليك الطريقة:

اجعل KEYSIZE هو الطول المُخمَّن للمفتاح؛ جرّب قيمًا من 2 إلى (لنقل) 40. اكتب دالة لحساب مسافة التحرير/مسافة هامنغ بين سلسلتين. مسافة هامنغ هي ببساطة عدد البتّات (bits) المختلفة. المسافة بين:

this is a test

و:

wokka wokka!!!

هي 37. تأكد من أن شيفرتك تتفق مع ذلك قبل أن تمضي. لكل KEYSIZE، خذ أول KEYSIZE من البايتات، وثاني KEYSIZE من البايتات، واحسب مسافة التحرير بينهما. طبّع النتيجة بقسمتها على KEYSIZE. القيمة KEYSIZE ذات أصغر مسافة تحرير مطبَّعة هي على الأرجح المفتاح. يمكنك المضي ربما بأصغر قيمتين إلى ثلاث لقيم KEYSIZE. أو خذ 4 كتل KEYSIZE بدلًا من 2 واحسب متوسط المسافات. الآن بعد أن عرفت على الأرجح KEYSIZE: قسّم النص المشفَّر إلى كتل بطول KEYSIZE. ثم بدّل مواضع الكتل: كوّن كتلة من البايت الأول من كل كتلة، وكتلة من البايت الثاني من كل كتلة، وهكذا. حُلّ كل كتلة كما لو كانت XOR أحادي المحرف. لديك بالفعل شيفرة تفعل ذلك. لكل كتلة، يكون مفتاح XOR أحادي البايت الذي ينتج أفضل مدرّج تكراري هو بايت مفتاح XOR متكرر المفتاح لتلك الكتلة. اجمعها معًا ويصبح لديك المفتاح.

ستكون هذه الشيفرة مفيدة بشكل مفاجئ لاحقًا. كسر XOR متكرر المفتاح («Vigenere») إحصائيًا هو بوضوح تمرين أكاديمي، من نوع «أساسيات التشفير». لكن عدد من «يعرفون كيف» يكسرونه أكبر من عدد من يكسرونه فعلًا، وثمة تقنية مشابهة تكسر شيئًا أكثر أهمية بكثير.

لا، هذا ليس خطأً.

نتلقى بشأن هذا التحدي أسئلة دعم فني أكثر من أي تحدٍّ آخر. نعدك، لا توجد أخطاء فاضحة في هذا النص. على وجه الخصوص: مسافة التحرير لـ "wokka wokka!!!" هي فعلًا 37.

7. AES في وضع ECB

المحتوى المُرمَّز بـ Base64 في هذا الملف شُفّر عبر AES-128 في وضع ECB تحت المفتاح

"YELLOW SUBMARINE".

(حساس لحالة الأحرف، دون علامات الاقتباس؛ 16 محرفًا بالضبط؛ أحب "YELLOW SUBMARINE" لأنه بطول 16 بايت بالضبط، والآن أصبحت تحبّه أنت أيضًا).

فك تشفيره. فأنت تعرف المفتاح، بعد كل شيء.

أسهل طريقة: استخدم OpenSSL::Cipher ومرّره AES-128-ECB كشيفرة (cipher).

افعل هذا بالشيفرة.

يمكنك بوضوح فك تشفير هذا باستخدام أداة سطر أوامر OpenSSL، لكننا نجعلك تشغّل ECB في الشيفرة لسبب. ستحتاجه كثيرًا لاحقًا، وليس لمهاجمة ECB فقط.

8. كشف AES في وضع ECB

في هذا الملف مجموعة من النصوص المشفَّرة (ciphertexts) المُرمَّزة بالست عشري.

أحدها شُفّر بـ ECB.

اكشفه.

تذكّر أن مشكلة ECB أنه عديم الحالة وحتمي؛ كتلة النص الصريح نفسها بطول 16 بايت سترتّج دائمًا كتلة النص المشفَّر نفسها بطول 16 بايت.