الدرس 9 من 9
فكّ تشفير XOR
- 15 دقيقة
- 5 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
فكّ XOR وتجريب المفاتيح كلّها
الشرح
العملية XOR تقارن بتّين فتعطي 1 إن اختلفا و0 إن تساويا، ولها خاصّية جعلتها أشهر أداة إخفاء في البرامج: إذا طبّقتها بالمفتاح نفسه مرّتين عادت القيمة كما كانت، أي أن a ^ k ^ k == a. فالتشفير والفكّ عملية واحدة.
وأبسط صورها مفتاح من بايت واحد يُطبَّق على كل بايت، بالتعبير bytes(b ^ key for b in data). وأقوى منه قليلًا المفتاح المتكرّر (repeating key)، وهو عدّة بايتات تدور على البيانات، فالبايت رقم i يُطبَّق عليه بايت المفتاح رقم i % len(key).
ومفتاح البايت الواحد ضعيف جدًّا لأن احتمالاته 256 فقط، فتجرّبها كلّها. لكن كيف تعرف المفتاح الصحيح؟ إذا كان الأصل جملة إنجليزية فأغلب المفاتيح الخاطئة تعطي بايتات غير مطبوعة فتُستبعد. وتبقى بعدها مفاتيح غير قليلة تعطي محارف مطبوعة، ففي هذا المثال يبقى 56 مفتاحًا من 256، ونواتجها كلّها رموز بلا معنى إلا ناتج المفتاح الصحيح. فتختار من الباقي ما يعطي أكبر عدد من الحروف والمسافات:
xor(c, 0x00) b"qddqs{0qd0tqg~" 10
xor(c, 0x1d) b"lyylnf-ly-ilzc" 12
xor(c, 0x10) b"attack at dawn" 14
والرقم في آخر كل سطر عدد الحروف والمسافات في الناتج. فأوّل مفتاح يعطي ناتجًا مطبوعًا ليس بالضرورة المفتاح الصحيح، وهذه الدرجة هي التي تحسم.
المطلوب
اكتب الدالة xor(data, key) بمفتاح بايت واحد، والدالة xor_repeat(data, key_bytes) بمفتاح متكرّر، وكلتاهما تُرجع bytes. ثم اكتب الدالة recover(data) لتجرّب المفاتيح من 0 إلى 255، وتستبعد كل مفتاح يعطي بايتًا غير مطبوع، وتُرجع من الباقي المفتاح الذي يعطي أكبر عدد من الحروف والمسافات.
الفحوص
5 فحوص- العملية xor تعكس نفسها
- المفتاح المتكرّر يدور على البايتات
- الدالة recover تسترجع مفتاحًا مخفيًّا
- الدالة recover تسترجع مفاتيح أخرى
- النصّ بعد الاسترجاع مطبوع كلّه