المسارات
/
D
D
/
التمارين
/
الشفرة الأفينية
الشفرة الأفينية

الشفرة الأفينية

متوسط

التعليمات

أنشئ تطبيقًا للشفرة الأفينية، وهو نظام تشفير قديم نشأ في الشرق الأوسط.

الشفرة الأفينية نوع من شفرات الاستبدال أحادية الأبجدية. يُقابل كل حرف بمكافئه الرقمي، ثم يُشفَّر باستخدام دالة رياضية، ثم يُحوَّل إلى الحرف المرتبط بقيمته الرقمية الجديدة. وعلى الرغم من أن جميع الشفرات أحادية الأبجدية ضعيفة، فإن الشفرة الأفينية أقوى بكثير من شفرة Atbash، لأن عدد مفاتيحها أكبر بكثير.

التشفير

دالة التشفير هي:

E(x) = (ai + b) mod m

حيث:

  • i هو فهرس الحرف من 0 إلى طول الأبجدية ناقص 1.
  • m هو طول الأبجدية. بالنسبة للأبجدية اللاتينية فإن m يساوي 26.
  • a و b عددان صحيحان يشكّلان مفتاح التشفير.

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

لأغراض هذا التمرين، تُعدّ الأرقام مدخلات صالحة لكنها لا تُشفَّر. وتُستبعد المسافات وعلامات الترقيم. ويُكتب النص المشفَّر في مجموعات ذات طول ثابت تفصل بينها مسافة، وحجم المجموعة التقليدي هو 5 أحرف. والغرض من ذلك هو جعل تخمين النص المشفَّر بناءً على حدود الكلمات أصعب.

فك التشفير

دالة فك التشفير هي:

D(y) = (a^-1)(y - b) mod m

حيث:

  • y هي القيمة الرقمية لحرف مشفَّر، أي y = E(x)
  • من المهم ملاحظة أن a^-1 هو المعكوس الضربي النمطي (MMI) للعدد a mod m
  • المعكوس الضربي النمطي لا يوجد إلا إذا كانت a و m أوليتين فيما بينهما.

المعكوس الضربي النمطي (MMI) للعدد a هو x بحيث يكون الباقي بعد قسمة ax على m يساوي 1:

ax mod m = 1

يمكن العثور على مزيد من المعلومات حول كيفية إيجاد المعكوس الضربي النمطي وما يعنيه في مقالة ويكيبيديا ذات الصلة.

أمثلة عامة

  • تشفير "test" يعطي "ybty" باستخدام المفتاح a = 5، b = 7
  • فك تشفير "ybty" يعطي "test" باستخدام المفتاح a = 5، b = 7
  • فك تشفير "ybty" يعطي "lqul" باستخدام المفتاح الخاطئ a = 11، b = 7
  • فك تشفير "kqlfd jzvgy tpaet icdhm rtwly kqlon ubstx" يعطي "thequickbrownfoxjumpsoverthelazydog" باستخدام المفتاح a = 19، b = 13
  • تشفير "test" باستخدام المفتاح a = 18، b = 13 خطأ لأن 18 و 26 ليستا أوليتين فيما بينهما

مثال على إيجاد المعكوس الضربي النمطي (MMI)

إيجاد المعكوس الضربي النمطي (MMI) للعدد a = 15:

  • (15 * x) mod 26 = 1
  • (15 * 7) mod 26 = 1، أي: 105 mod 26 = 1
  • 7 هو المعكوس الضربي النمطي (MMI) للعدد 15 mod 26

المصدر

ويكيبيديايفتح الرابط في نافذة أو علامة تبويب جديدة
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
D Exercism

مستعد لبدء الشفرة الأفينية؟

سجّل في Exercism لتتعلّم وتتقن D عبر 92 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.