نفّذ شفرة إزاحة بسيطة مثل شفرة قيصر، وشفرة استبدال أكثر أمانًا.
"إذا كان لديه ما يقوله في سرية، كتبه بالشفرة، أي بأن غيّر ترتيب حروف الأبجدية بحيث لا يمكن فهم كلمة واحدة. وإذا أراد أحد فك هذه الرسائل ومعرفة معناها، فعليه أن يستبدل الحرف الرابع من الأبجدية، أي D، بحرف A، وهكذا مع بقية الحروف." (سويتونيوس، حياة يوليوس قيصر)
الشفرة خوارزمية بسيطة جدًا تتيح لنا جعل النص أقل قابلية للقراءة مع السماح بفكّه بسهولة. وهي عرضة للعديد من أشكال تحليل الشفرات، لكن حالف قيصر الحظ لأن أعداءه لم يكونوا من محلّلي الشفرات.
استُخدمت شفرة قيصر في بعض الرسائل التي أرسلها يوليوس قيصر إلى الميدان. وكان قيصر يعلم أن الشفرة ليست جيدة جدًا، لكن كان له حليف واحد في هذا الجانب: لم يكن أحد تقريبًا يقرأ جيدًا. لذلك كان يكفي أن يكون النص بعيدًا بحرفين أو نحو ذلك حتى لا يتعرّف الناس على الكلمات القليلة التي يعرفونها.
مهمتك هي إنشاء شفرة إزاحة بسيطة مثل شفرة قيصر. هذه الصورة مثال رائع على شفرة قيصر:
![]()
على سبيل المثال:
عند إدخال "iamapandabear" إلى دالة الترميز، تُرجع الشفرة "ldpdsdqgdehdu". غامضة بما يكفي لإبقاء رسالتنا سرية أثناء انتقالها.
وعند إدخال "ldpdsdqgdehdu" في دالة فك الترميز، تُرجع الرسالة الأصلية "iamapandabear"، مما يتيح لصديقك قراءة رسالتك الأصلية.
سرعان ما تفقد شفرات الإزاحة فائدتها عندما يكتشفها قائد الخصم. لذا لنجرّب بدلًا من ذلك استخدام شفرة استبدال. جرّب تعديل الكود ليسمح لنا بتحديد مفتاح واستخدامه كمسافة الإزاحة.
إليك مثالًا:
بالنظر إلى المفتاح "aaaaaaaaaaaaaaaaaa"، فإن ترميز السلسلة النصية "iamapandabear" سيُرجع النص الأصلي "iamapandabear".
وبالنظر إلى المفتاح "ddddddddddddddddd"، فإن ترميز السلسلة النصية "iamapandabear" سيُرجع النص المبهم "ldpdsdqgdehdu"
في المثال أعلاه، وضعنا a = 0 كقيمة للمفتاح. لذلك عندما يُضاف النص الصريح إلى المفتاح، نحصل على الرسالة نفسها. لذا فإن "aaaa" ليست مفتاحًا مثاليًا. لكن لو وضعنا المفتاح "dddd"، لحصلنا على النتيجة نفسها التي تعطيها شفرة قيصر.
أضعف حلقة في أي شفرة هو الإنسان. لنجعل شفرة الاستبدال لديك أكثر تسامحًا مع الأخطاء قليلًا عبر توفير مصدر للعشوائية والتأكد من أن المفتاح لا يحتوي إلا على حروف صغيرة.
إذا لم يُرسل أحدهم مفتاحًا على الإطلاق، فولّد مفتاحًا عشوائيًا حقًا بطول 100 حرف صغير على الأقل.
تعمل شفرات الإزاحة على جعل النص غريبًا قليلًا، لكنها عرضة لتحليل التكرار. وتخفف شفرات الاستبدال من ذلك، لكنها تبقى عرضة بشدة عندما يكون المفتاح قصيرًا أو إذا حُفظت المسافات. لاحقًا سترى أحد الحلول لهذه المشكلة في تمرين "crypto-square".
إذا أردت أن تتقدّم أكثر في هذا المجال، تبدأ الأسئلة تدور حول كيفية تبادل المفاتيح بطريقة آمنة. ألقِ نظرة على Diffie-Hellman على ويكيبيديا لواحدة من أوائل تطبيقات هذا المخطط.
جرّب استخدام عمليات حسابية مثل باقي القسمة لجعل الفهارس تعود إلى البداية عند تجاوز الحد. كما أن الصنفين Character وString صديقان لك أيضًا.
سجّل في Exercism لتتعلّم وتتقن Pharo عبر 50 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.