أنشئ تطبيقًا لـشيفرة فيجينير. شيفرة فيجينير شيفرة استبدالية بسيطة.
الشيفرة خوارزمية تُستخدم لتشفير سلسلة نصية أو ترميزها. تُسمّى السلسلة النصية غير المشفّرة النص الأصلي، وتُسمّى السلسلة النصية المشفّرة النص المشفّر. يُسمّى تحويل النص الأصلي إلى النص المشفّر ترميزًا، بينما يُسمّى العكس فك الترميز.
في الشيفرة الاستبدالية، يُستبدل كل حرف من النص الأصلي بحرف من النص المشفّر يُحسب بمساعدة مفتاح. (لاحظ أنه من الممكن أن يكون الحرف البديل مماثلًا للحرف الأصلي.)
في هذه الشيفرة، المفتاح سلسلة من الحروف الصغيرة، مثل "abcd".
يُزاح كل حرف من النص الأصلي أو يُدار بمقدار يعتمد على الحرف المقابل له في المفتاح.
الحرف "a" في المفتاح يعني إزاحة مقدارها 0 (أي دون إزاحة).
الحرف "b" في المفتاح يعني إزاحة مقدارها 1.
الحرف "c" في المفتاح يعني إزاحة مقدارها 2، وهكذا.
يستخدم الحرف الأول من النص الأصلي الحرف الأول من المفتاح، ويستخدم الحرف الثاني من النص الأصلي الحرف الثاني من المفتاح، وهكذا. إذا نفدت حروف المفتاح قبل أن تنفد حروف النص الأصلي، فابدأ من بداية المفتاح مرة أخرى.
إذا كان المفتاح يحتوي على حرف واحد فقط، مثل "dddddd"، فإن جميع حروف النص الأصلي تُزاح بالمقدار نفسه (ثلاثة في هذا المثال)، ما يجعلها مماثلة لشيفرة التدوير أو شيفرة الإزاحة (وتُسمّى أحيانًا شيفرة قيصر).
على سبيل المثال، سيصبح النص الأصلي "iamapandabear" هو "ldpdsdqgdehdu".
إذا كان المفتاح يحتوي على الحرف "a" فقط (مرة واحدة أو أكثر)، فإن مسافة الإزاحة تساوي صفرًا، ويكون النص المشفّر مماثلًا للنص الأصلي.
مع ذلك، عادةً ما يكون المفتاح أكثر تعقيدًا من ذلك!
إذا كان المفتاح "abcd"، فستُزاح حروف النص الأصلي بمسافات مقدارها 0 و1 و2 و3.
إذا كان النص الأصلي "hello"، فإننا نحتاج إلى 5 إزاحات، لذا سيلتف المفتاح حول نفسه، ما يعطي مسافات إزاحة مقدارها 0 و1 و2 و3 و0.
وبتطبيق تلك الإزاحات على حروف "hello" نحصل على "hfnoo".
إذا لم يُقدَّم أي مفتاح، فأنشئ مفتاحًا يتكون من 100 حرف صغير عشوائي على الأقل من الأبجدية اللاتينية.
random أم secrets هنا؟بدءًا من Python 3.6، أصبحت هناك وحدتان مختلفتان لإنتاج الأرقام "العشوائية":
الوحدة المسماة random هي شبه عشوائية، أي أنها لا تولّد عشوائية حقيقية، بل تتبع خوارزمية تحاكي العشوائية. وبما أن هذه "الأرقام العشوائية" تُولَّد عبر خوارزمية معروفة، فهي ليست عشوائية حقًا. ونتيجة لذلك، لا تصلح وحدة random للتشفير ولا ينبغي استخدامها، وذلك تحديدًا لأنها شبه عشوائية.
الوحدة المسماة secrets تولّد أرقامًا "عشوائية" قوية تشفيريًا، توفّر الأمان الأكبر الذي يتطلبه التشفير. وهي لا تزال شبه عشوائية بالمعنى الأدق، لكنها تضمن أن الأرقام التي تنتجها غير قابلة للتنبؤ على الإطلاق.
وبما أن هذا مجرد تمرين تدريبي، فلا بأس من استخدام وحدة random، لكن انتبه إلى أنه سيكون غير آمن للغاية إذا استُخدم فعليًا في التشفير.
سجّل في Exercism لتتعلّم وتتقن Python عبر 17 مفهومًا146 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.