المعلوماتية > اتصالات وشبكات
أنماط تشفير الكتلة Block Cipher Mode
يُعدّ تشفير الكتلة (Block cipher) أحد الدعائم الأساسية لأنظمة التشفير، إذ يشفّر الكتلَ ذات الحجم الثابت فقط، أي يشفّر النص العادي بحجم 128 بت ويُنشِئ نصًّا مشفّرًا بحجم 128 بت، لأن الجيل الحالي يحتوي على حجم كتلة (Block size) يبلغ 128 بت (16 بايت).
ولكن؛ ماذا إذا أردنا تشفيرَ محتوى لا يتجاوز طوله كتلةً واحدة؟ هنا يجب علينا استخدام أحد أنماط تشفير الكتلة التي تسمى (Block Cipher Modes)، والتي سنتحدث عنها في هذا المقال وعن كيفية الاختيار بينها (1).
Block Cipher Mode: هي طريقة لتحويل النص العادي (PlainText) إلى نص مُشفَّر (CipherText)، ولكن هنا يكون طول النص العادي والنص المُشفَّر عشوائيًّا. تتطلب معظم الأنماط (Modes) أن يكون طول النص العادي من مضاعفات حجم الكتلة، وهذا يتطلب التغليف أو ما يسمى (padding).
هناك العديد من الطرائق لتغليف النص العادي، ولكنّ القاعدة الاساسية هي أنّ التغليف يجب أن يكون قابلًا للعكس؛ أي يجب أن يكون بالإمكان تحديد الرسالة الأصلية من الرسالة المغلفة على نحو دقيق (1).
نمط كتابة الكود الإلكتروني
Electronic Code Book (ECB) mode
يُعرَف بأنه أبسط طريقة لتحويل النص العادي إلى نص مشفّر، إذ يشفّر ECB كلَّ رسالة على حدة، ولكن المشكلة الجوهرية أنه إذا كان هناك نصان عاديان متماثلان، فسيكون نص التشفير متطابقًا! وهذا يعني أنه إذا كان لدينا نص طويل مُشفر فيمكننا تحليل الجمل المكررة، وبمجرد فك شيفرة جملة واحدة فقد فُكَّ تشفير النصوص المشفرة المماثلة جميعها، وهذا ما يجعل ECB بسيط للغاية (3-1).
يُعرّف ECB على النحو الآتي:
تشفير: Cj= CIPHk (Pj) for j = 1 . . . n
فك التشفير: Pj = CIPH-1k(Cj) for j = 1 . . . n
شكل 1
(3-1)
نمط تشفير الكتلة المتسلسل
Cipher Block Chaining (CBC) mode
أحدُ أكثرِ أساليب التشفير استخدامًا، يتميّز بجمع كتل النص العادي مع كتل النص المشفرة مسبقًا، وهذا يتطلب وجود متجه التهيئة (initialization vector: وهو كتلة من البتات تستخدم بواسطة عدة أنماط لجعل التشفير عشوائيًّا وإنتاج نصوص مشفرة مميزة حتى لو شُفِّر النص نفسه).
يستخدم IV مع أول نص عادي ويجب أن تكون غير متوقعة، ولكن ليس بالضرورة أن تكون سرًّا. يتيح لنا هذا تجنُّبَ مشكلةِ ECB بواسطة تطبيق XOR على كل نص عادي مع النص المشفر مسبقًا، وبهذه الطريقة تعتمد كل كتلةِ نصٍّ مشفّرٍ على كتل النص العادي جميعها التي عولِجَت (3-1).
يُعرّف CBC على النحو الآتي:
تشفير:
شكل 2
(3-1)
نمط التغذية الراجعة للخرج
Output Feedback (OFB) mode
في OFB لا يُستخدم النص العادي أبدًا مدخلًا في تشفير الكتلة (انظر الشكل 3). بدلًا من ذلك، يستخدم تشفير الكتلة لإنشاء تدفق شبه عشوائي (pseudo-random stream)، يسمى التدفق الرئيسي (key stream)، والذي ينطبق XOR على النص العادي لتوليد النص المشفر.
ويسمى مخطط التشفير الذي يولد التدفق الشبه العشوائي للمفاتيح بالتشفير التدفقي (Stream cipher)، والسلبية الوحيدة لاستخدام stream cipher هي أنه إذا استخدمت نفس IV لرسالتين مختلفتين، فسوف تُشفران بنفس key stream، أي يمكن للمهاجم حساب الفرق بين النصين العاديين. لنفترض أن المهاجم يعرف بالفعل أحد النصوص العادية (هذا يحدث كثيرًا في الحياة الواقعية)، فهذا يعني أنه قادر على حساب النص العادي الآخر.
من ناحية أخرى، توجد ميزتان في OFB:
- الميزة الأولى: فك التشفير هو بالضبط عملية التشفير نفسها، وهذا ما يوفر جهد التنفيذ، ولا سيما أنك تحتاج إلى استخدام دالة تشفير في كتلة التشفير فقط، لذلك لا يتعين عليك تنفيذ دالة فك التشفير.
- الميزة الثانية: هي أنك لست بحاجة إلى أي padding، وهذا ما يقلل الحمل وهو أمر مهم جدًّا مع الرسائل الصغيرة -أي في OFB يمكنك استخدام عدد البايتات بحجم طول رسالتك- وهذا يعني أنه إذا كانت آخر كتلة نص عادي ليست ممتلئة تمامًا، فإنك ترسل فقط بايتات النص المشفر التي تتوافق مع بايتات النص العادي (3-1).
يعرّف OFB على النحو الآتي:
تشفير:
فك التشفير:
شكل 3
(3-1)
نمط التغذية الراجعة للتشفير
Cipher Feedback (CFB) mode
يعمل بطريقة مشابهة لأسلوب OFB، فبدلًا من تشفير كتل النص العادي، يستخدم التشفير الكتلي لإنتاج كتل التشفير التي تشفر تسلسليًّا باستخدام XOR. يعاد إدخال الكتل المشفرة من النصوص العادية إلى دالة التشفير الكتلي لإعادة تشفيرها مرة أخرى وإنتاج كتل التشفير التالية (3,2).
يعرّف CFB على النحو الآتي:
تشفير:
فك التشفير:
شكل 4
(3,2)
نمط العداد Counter (CTR) mode
يشبه أسلوب عمل OFB وCBC، إذ يشفر كتل النص العادي تسلسيًّا، وتنتج الخوارزمية كتلةً باستخدام العداد (ومن هنا جاءت التسمية)، ثم تطبق XOR على كل كتلة مع مقابلها من كتل النص العادي لإنتاج الكتل المشفرة. كذلك يجب توفير رمز nonce فريد (nonce: رمز ثنائي (بت) يستخدم مرةً واحدة فقط). يربط nonce بقيمة العداد ويشفرها لتشكيل كتلة واحدة من key stream.
ولكن، كيف نحدد القيمة الابتدائية للعداد؟
ما يهمنا هو منع استخدام القيمة نفسها مرتين، لأنه لو استطاع المهاجم معرفة النص العادي المقابل للقيمتين، فسيستطيع معرفة كتلة مفتاح التشفير المستخدمة، ولتجنب ذلك يستخدم IV بحيث تعطي قيمة صفر عند بداية كل عملية تشفير (3-1).
يعرّف CTR على النحو الآتي:
تشفير:
فك التشفير:
شكل 5
(3-1)
والسؤال: أي أسلوب يجب أن أستخدمه؟
كما ذكرنا فإن ECB تشفير بسيط للغاية وغير آمن وهذا ما يجعله غير مرغوب.
لدينا أسلوب OFB جيد جدًّا وفي الوقت نفسه CTR أفضل في بعض النواحي.
لذلك نجد أنه لا يوجد سوى CBC وCTR يمكننا التفكير في استخدامهما.
هل نختار CBC أو CTR؟
في السابق، كانت الكفة تميل إلى CTR ولكن ينصح الآن باستخدام CBC مع IV عشوائي.
لماذا؟
يوجد عدد كبير جدًّا من التطبيقات غير آمنة، لأنها لا تُنشىء nonce على نحو صحيح.
ويعد CTR أسلوبًا جيدًا جدًّا، ولكن فقط إذا كان بإمكان التطبيق ضمان عدم تكرار nonce.
وقد تبين أنه حتى عندما يكون النظام تحت الهجوم، تكون nonce مصدر رئيس للمشكلات ونقاط الضعف الأمنية. تحتوي CBC مع IV عشوائي على بعض العيوب (النص المشفر أكبر، والنص العادي يحتاج إلى تغليف، ويحتاج النظام إلى مولد أرقام عشوائي)، لكنه قوي ويتحمل جيدًا سوء الاستخدام. ولما كان إنشاء nonce يمثل مشكلةً صعبةً حقًّا في العديد من الأنظمة، فإنه لا يوصى بتعريض مطوري التطبيقات لأي وضع يستخدم الرموز nonces.
وهذا ينطبق حتى على CBC مع IV غير المولدة (nonce-generated IV).
لذلك إذا كنت تطور تطبيقًا وتحتاج إلى استخدام أسلوب التشفير، شغّله بأمان واستخدم أسلوب CBC مع IV عشوائي (1).
المصادر:
2- Dworkin M. Computer Security - Recommendation for Block Cipher Modes of Operation Methods and Techniques. US.: National Institute of Standards and Technology. Special Publication 800-38A; 2001. pp.9 - 15. Available from: هنا
3- Knudsen LR, Robshaw MJB. The Block Cipher Companion - Information Security and Cryptography. Berlin, Heidelberg: Springer; 2011. Available from: هنا