الدرس 2 من 6
عكس مولّد المفتاح
- 20 دقيقة
- 5 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
عكس خطوات التحويل خطوة خطوة لاسترجاع المفتاح
الشرح
هذا أهمّ ما في كسر التحدّيات: تقرأ كيف يحوّل البرنامج المفتاح إلى هدف، ثم تعكس خطواته بالترتيب المعكوس لتستخرج المفتاح. وجدت في برنامج مولّد مفتاح (keygen) يأخذ المفتاح نصًّا، ولكل حرف منه ثابت في القائمة konst، ويحسب بايت الهدف بثلاث خطوات مرتّبة:
t = ord(key[i]) ^ konst[i] # أوّلًا XOR بثابت الموضع t = ((t << 3) | (t >> 5)) & 0xFF # ثم تدوير يسار ثلاثة بتات target[i] = (t + i) & 0xFF # ثم جمع رقم الموضع
والمفتاح هنا طويل، من اثني عشر إلى ستة عشر محرفًا مطبوعًا، فلا يمكن تجريب كل المفاتيح الممكنة لأن عددها هائل. لكن كل خطوة من الثلاث تُعكس وحدها: الجمع يُعكس بالطرح، والتدوير يسارًا يُعكس تدويرًا يمينًا بالمقدار نفسه، وXOR يُعكس بـ XOR بالثابت نفسه. فتعكس الخطوات من آخرها إلى أوّلها لتستعيد كل حرف.
المطلوب
اكتب الدالة recover(target, konst) التي تستقبل قائمة بايتات الهدف وقائمة الثوابت، وتُرجع المفتاح نصًّا. والفحص يبني أهدافًا من مفاتيح وثوابت مخفيّة، فلا ينفع أن تنسخ مفتاحًا جاهزًا.
الفحوص
5 فحوص- يسترجع مفتاح الكود
- يسترجع مفتاحًا أطول بثوابت أخرى
- يعكس التدوير لا الطرح وحده
- يسترجع مفتاحًا فيه أرقام ورموز
- يفكّ الموضع فيحلّ الحرف المكرّر