خوارزمية بلوفيش (خوارزمية تشفير)

خوارزمية بلوفيش هو خوارزمية تشفير كتلة بمفتاح متماثل ، صممها بروس شناير عام 1993 وأُدرجت في العديد من حزم وبرامج التشفير. تتميز بلوفيش بسرعة تشفير جيدة في التطبيقات البرمجية، ولم يُكتشف حتى الآن تحليل تشفير فعال ضدها للبيانات ذات الأحجام الصغيرة. ومع ذلك، يُوصى بتجنب استخدام بلوفيش لتشفير الملفات التي تتجاوز سعتها 4 جيجابايت، ويُفضل استخدام خوارزمية توفيش (Twofish) بدلاً منها. [1]

نظراً لأن حجم كتلة خوارزمية بلوفيش يبلغ 64 بت، فإنها قد تكون عرضة لهجمات أعياد الميلاد من نوع[2] Sweet32.

قام شناير بتصميم Blowfish كخوارزمية عامة الغرض، تهدف إلى أن تكون بديلاً لخوارزمية DES القديمة وخالية من المشاكل والقيود المرتبطة بالخوارزميات الأخرى. في الوقت الذي تم فيه إطلاق Blowfish، كانت العديد من التصميمات الأخرى مملوكة، أو مثقلة ببراءات الاختراع ، أو كانت أسرارًا تجارية أو حكومية.جرى الكشف عن تفاصيل الخوارزمية لاحقًا، بعد أن صرح شناير بأن "بلو فيش" لم تُسجل كبراءة اختراع ولن تُسجل في أي دولة. ونتيجة لذلك، أصبحت الخوارزمية مُتاحة للعموم، مما يتيح استخدامها بحرية من قبل أي فرد أو جهة." [3]

يتميز التصميم بشكل ملحوظ صناديق S التي تعتمد على المفتاح ووجدول مفاتيح بالغ التعقيد.من أبرز خصائص هذا التصميم استخدام صناديق S المستندة إلى المفتاح وجدول مفاتيح معقد للغاية.

.

الخوارزمية

تتميز خوارزمية "بلو فيش" حجم كتلة يبلغ 64 بتًا، بينما يتراوح طول المفتاح المتغير الخاص بها بين 32 بتًا و448 بت. [4]وتُصنف "بلو فيش" ضمن شفرات فيستل (Feistel cipher) وتتكون من 16 جولة. تعتمد الخوارزمية في عملها على صناديق استبدال كبيرة (S-boxes) تستمد قيمها من المفتاح المُستخدم. من الناحية الهيكلية، تُظهر "بلو فيش" تشابهًا مع خوارزمية CAST-128 ، التي تستخدم صناديق استبدال ثابتة.

هيكل فيستيل في بلوفيش

يُبين الشكل التوضيحي المجاور آلية عمل تشفير "بلو فيش". يُمثل كل خط في الشكل جزءًا بحجم 32 بتًا. تعتمد الخوارزمية على خمسة جداول للمفاتيح الفرعية: جدول P يحتوي على 18 مدخلًا (يُرمز له بـ K في الشكل لتجنب الالتباس مع النص الأصلي)، وأربعة صناديق استبدال (S-boxes) يتألف كل منها من 256 مدخلًا (يُشار إليها بـ S0، و S1، و S2، و S3).

تتكون كل جولة r من 4 إجراءات:

الإجراء 1 XOR النصف الأيسر (L) من البيانات مع إدخال مجموعة P رقم r
الإجراء 2 استخدم بيانات XORed كمدخلات لدالة F في Blowfish
الإجراء 3 XOR إخراج الدالة F مع النصف الأيمن (R) من البيانات
الإجراء 4 تبديل اليسار واليمين

تقوم الدالة F في خوارزمية "بلو فيش" بتقسيم المدخلات ذات الـ 32 بت إلى أربعة أجزاء متساوية، كل جزء بحجم 8 بت. تُستخدم هذه الأجزاء الأربعة كمدخلات لأربعة صناديق استبدال (S-boxes) مختلفة. كل صندوق استبدال من هذه الصناديق يقبل مدخلًا بحجم 8 بت وينتج مخرجًا بحجم 32 بت. يتم إضافة المخرجات modulo 2 32 ويتم إجراء XORed لإنتاج الناتج النهائي المكون من 32 بت (انظر الصورة في الزاوية اليمنى العليا). [5]

بعد الانتهاء من الجولة السادسة عشرة في عملية تشفير "بلو فيش"، يتم عكس عملية التبديل الأخيرة التي جرت بين نصفي الكتلة. ثم، تُجرى عملية XOR (حصري أو) بين النصف الأيسر (L) والقيمة K18، وبين النصف الأيمن (R) والقيمة K17. تُعرف هذه العملية الأخيرة باسم "تبييض الإخراج" (Output Whitening).

تتطابق عملية فك التشفير في خوارزمية "بلو فيش" جوهريًا مع عملية التشفير، مع وجود اختلاف أساسي واحد يكمن في ترتيب استخدام قيم جدول P. فبدلًا من استخدام القيم P1، P2، ...، P18 بالترتيب التصاعدي كما هو الحال في التشفير، يتم استخدامها بالترتيب التنازلي، أي P18، P17، ...، P1.

قد لا يبدو هذا الأمر واضحًا للوهلة الأولى نظرًا لطبيعة عملية XOR (التي تتمتع بخاصيتي التبادلية والتجميعية). ونتيجة لذلك، يسود مفهوم خاطئ شائع يقضي بأن عملية فك التشفير تتم ببساطة عن طريق عكس ترتيب خطوات التشفير بالكامل (أي البدء بعملية XOR بين P17 وP18 مع النص المشفر، ثم استخدام قيم P بترتيب عكسي). إلا أن هذا المفهوم غير صحيح.

يبدأ جدول المفاتيح الخاص بـ Blowfish بتهيئة مجموعة P وصناديق S بالقيم المشتقة من الأرقام السداسية عشرية لـ pi ، والتي لا تحتوي على نمط واضح (لا أرى أي شيء مخفي في رقمي ). يتم بعد ذلك تدوير المفتاح السري بايتًا تلو الآخر، إذا لزم الأمر، ويتم إجراء عملية XOR له مع جميع إدخالات P بالترتيب. لتوليد المفاتيح الفرعية في خوارزمية "بلو فيش"، تُستخدم كتلة بحجم 64 بت مليئة بالقيم غير الصفرية وتُشفر باستخدام الخوارزمية نفسها. يحل النص المشفر الناتج محل القيمتين P1 وP2 في جدول P. بعد ذلك، يُعاد تشفير نفس النص المشفر باستخدام المفاتيح الفرعية المُحدثة، ويحل النص المشفر الجديد محل القيمتين P3 وP4. تستمر هذه العملية لتحديث جميع قيم جدول P وجميع مدخلات صناديق الاستبدال (S-boxes). إجمالًا، يتم تشغيل خوارزمية تشفير "بلو فيش" 521 مرة لإنتاج جميع المفاتيح الفرعية اللازمة، وهو ما يعادل معالجة حوالي 4 كيلوبايت من البيانات..

نظرًا لأن طول جدول P يبلغ 576 بتًا، وتُجرى عملية XOR لبايتات المفتاح مع هذه البتات الـ 576 بالكامل أثناء عملية التهيئة، فإن العديد من التطبيقات تدعم أحجام مفاتيح تصل إلى 576 بتًا. يعود هذا التباين إلى وجود اختلاف بين الوصف الأصلي لخوارزمية "بلو فيش"، الذي حدد طول المفتاح بـ 448 بتًا، وتنفيذه المرجعي الذي استخدم مفاتيح بطول 576 بتًا. وقد أُنتجت أيضًا متجهات اختبار للتحقق من صحة تطبيقات الطرف الثالث التي تستخدم مفاتيح بطول 576 بتًا. وعندما سُئل بروس شناير عن الإصدار الصحيح من "بلو فيش"، أجاب قائلًا: "يجب استخدام متجهات الاختبار لتحديد الإصدار الحقيقي الوحيد من بلو فيش".

ثمة وجهة نظر أخرى تشير إلى أن الحد الأقصى لطول المفتاح المحدد بـ 448 بتًا يهدف إلى ضمان اعتماد كل بت في كل مفتاح فرعي على جميع بتات المفتاح الأصلي. ويُستند في هذا الرأي إلى أن القيم الأربعة الأخيرة في جدول P ليس لها تأثير مباشر على جميع بتات النص المشفر الناتج. تجدر الإشارة إلى أهمية هذه النقطة تحديدًا في التطبيقات التي تستخدم عددًا مختلفًا من الجولات. فعلى الرغم من أن زيادة عدد الجولات قد تعزز مستوى الأمان ضد هجمات القوة الغاشمة، إلا أنها قد تُضعف الضمانات الأمنية الأساسية التي توفرها الخوارزمية. وبالنظر إلى بطء عملية تهيئة التشفير عند كل تغيير للمفتاح، فإن ذلك يوفر حماية ضمنية ضد هجمات القوة الغاشمة، مما قد يجعل استخدام أحجام مفاتيح تتجاوز 448 بتًا أمرًا غير ضروري.

سمكة منتفخة في الكود الزائف

P[18] // مجموعة P مكونة من 18 عنصرًا
S[4][256] // صناديق S: 4 مصفوفات من 256 عنصرًا

الدالة f(x):
تقوم هذه الدالة بحساب قيمة f على مدخل x بحجم 32 بت. تعتمد في عملها على صناديق الاستبدال (S-boxes) وعمليات التلاعب بالبتات.
  high_byte := ( تم تحويل x إلى اليمين بمقدار 24 بت )
  second_byte := ( تم تحويل x إلى اليمين بمقدار 16 بت ) و 0xff
  third_byte := ( تم تحويل x إلى اليمين بمقدار 8 بت ) و 0xff
  low_byte := x AND 0xff

  h := S[0][high_byte] + S[1][second_byte]
  العودة (h XOR S[2][third_byte]) + S[3][low_byte]

الإجراء blowfish_encrypt(L, R):
  // يقوم بتشفير نصفين L وR مكونين من 32 بت باستخدام مجموعة P ووظيفة f على مدار 16 جولة
  للجولة := 0 إلى 15:
    L := L XOR P[الجولة]
    R := f(L) XOR R
    قيم المبادلة لـ L وR
  قيم المبادلة لـ L وR
  R := R XOR P[16]
  L := L XOR P[17]

الإجراء blowfish_decrypt(L, R):
  // تتم عملية فك التشفير في خوارزمية "بلو فيش" على نص مشفر مُقسم إلى نصفين، أحدهما أيمن (R) والآخر أيسر (L)، وكل منهما بحجم 32 بتًا. تعتمد عملية الفك على استخدام جدول P والدالة f على مدار 16 جولة، ولكن بترتيب عكسي لما هو مُتبع في عملية التشفير.
  للجولة := 17 إلى 2:
    L := L XOR P[الجولة]
    R := f(L) XOR R
    قيم المبادلة لـ L وR
  قيم المبادلة لـ L وR
  R := R XOR P[1]
  L := L XOR P[0]
 
// تهيئة جدول P وصناديق S: يتم ذلك باستخدام المفتاح المُدخل، ويتبع هذه الخطوة عملية تُعرف باسم "توسيع المفتاح".
//تهيئة جدول P بالقيم الأولية: في هذه الخطوة، تُملأ عناصر جدول P بقيم ثابتة محددة مسبقًا.


موضع المفتاح := 0
بالنسبة إلى i := 0 إلى 17:
  ك := 0
  بالنسبة إلى j := 0 إلى 3:
    k := ( تم تحويل k إلى اليسار بمقدار 8 بت ) أو key[key_position]
    موضع المفتاح := (موضع المفتاح + 1) تعديل طول المفتاح
  P[i] := P[i] XOR k

// توسيع مفتاح Blowfish (521 تكرارًا)
ل := 0، ر := 0
بالنسبة إلى i := 0 إلى 17 في 2:
  blowfish_encrypt(L, R)
  P[i] := L
  P[i + 1] := R

// املأ مربعات S عن طريق تشفير L و R
لأن i := 0 إلى 3:
  بالنسبة إلى j := 0 إلى 255 بواسطة 2:
    blowfish_encrypt(L, R)
    S[i][j] := L
    S[i][j + 1] := R

سمكة النفخ في الممارسة العملية

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

يتطلب استخدام خوارزمية "بلو فيش" تهيئتها بمفتاح سري. ويُستحسن قبل استخدام هذا المفتاح، إجراء عملية تجزئة له باستخدام دالة تجزئة آمنة.

في سياق أحد تطبيقات خوارزمية "بلو فيش"، يُعد بطء عملية تغيير المفاتيح ميزة إيجابية بالفعل. فخوارزمية تجزئة لكلمة المرور المستخدمة في نظام التشغيل OpenBSD(والتي تُعرف باسم crypt $2 أو bcrypt) تعتمد على خوارزمية مُشتقة من "بلو فيش" تستغل خاصية جدول المفاتيح البطيء. تكمن الفكرة الأساسية في أن الجهد الحسابي الإضافي المطلوب لإنشاء المفاتيح يوفر حماية فعالة ضد هجمات القاموس. يمكن الرجوع إلى مفهوم "تمديد المفتاح" (Key stretching) للحصول على مزيد من التفاصيل حول هذه التقنية..

تتطلب خوارزمية "بلو فيش" مساحة تقريبية قدرها 4 كيلوبايت من ذاكرة الوصول العشوائي (RAM) لتشغيلها. هذا المقدار من الذاكرة لا يمثل قيدًا كبيرًا حتى بالنسبة للأجهزة الكمبيوتر المكتبية والمحمولة القديمة. ومع ذلك، فإنه يحول دون استخدام الخوارزمية في الأنظمة المضمنة ذات الموارد المحدودة جدًا، مثل البطاقات الذكية المبكرة.

تُعد خوارزمية "بلو فيش" من أوائل خوارزميات تشفير الكتل الآمنة التي لم تكن خاضعة لأي قيود تتعلق ببراءات الاختراع، مما أتاح استخدامها مجانًا لأي فرد أو جهة. وقد ساهمت هذه الميزة بشكل كبير في انتشارها وشعبيتها في تطبيقات وبرامج التشفير المختلفة.

bcrypt هي وظيفة تجزئة كلمة المرور والتي، عند دمج خوارزمية "بلو فيش" مع عدد متغير من التكرارات (يُعرف باسم "تكلفة العمل")، يتم استغلال مرحلة إعداد المفتاح المكلفة فيها لزيادة العبء الحسابي والمدة الزمنية اللازمة لحسابات التجزئة. هذا الإجراء يساهم بشكل كبير في تقليل المخاطر الناجمة عن هجمات القوة الغاشمة.

في سياق أحد تطبيقات خوارزمية "بلو فيش"، يُعد بطء عملية تغيير المفاتيح ميزة إيجابية بالفعل. فخوارزمية تجزئة كلمات المرور المستخدمة في نظام التشغيل OpenBSD (والتي تُعرف باسم crypt $2 أو bcrypt) تعتمد على خوارزمية مُشتقة من "بلو فيش" تستغل خاصية جدول المفاتيح البطيء. [6]تكمن الفكرة الأساسية في أن الجهد الحسابي الإضافي المطلوب لإنشاء المفاتيح يوفر حماية فعالة ضد هجمات القاموس. [7]يمكن الرجوع إلى مفهوم "تمديد المفتاح" (Key stretching) للحصول على مزيد من التفاصيل حول هذه التقنية.[8]

الضعف والخلفاء

استخدام Blowfish لحجم كتلة 64 بت (على عكس AES مثلاً الذي يبلغ 128 بت) يجعله عرضة لهجمات أعياد الميلاد، خاصةً في سياقات مثل بروتوكول نقل النص الفائق الامن . في عام 2016، أظهر هجوم SWEET32 كيفية الاستفادة من هجمات أعياد الميلاد لاستعادة النص العادي (أي فك تشفير النص المشفر) من الشفرات ذات حجم كتلة 64 بت. [9]يوصي مشروع GnuPG بعدم استخدام Blowfish لتشفير الملفات التي يزيد حجمها عن 4 جيجابايت نظرًا لصغر حجم كتلته.[10]

يُعرف عن النسخ المختصرة من خوارزمية "بلو فيش" أنها عُرضة لهجمات النص العادي المعروف (Known-plaintext attacks) التي تستهدف المفاتيح الضعيفة العاكسة. ومع ذلك، فإن التنفيذات القياسية لخوارزمية "بلو فيش" تستخدم 16 جولة من التشفير، مما يجعلها محصنة ضد هذا النوع من الهجمات.. [11] [12]

أوصى بروس شناير بالانتقال إلى خليفته في[13] Blowfish، Twofish.

أُصدرت خوارزمية Blowfish2 في عام 2005، وقد طوّرها ألكسندر بوكال. 1 تحتفظ الخوارزمية بنفس تصميم Blowfish الأصلي، ولكنها تتميز بوجود ضعف عدد جداول الاستبدال (S-tables) وتستخدم أعدادًا صحيحة بحجم 64 بتًا بدلًا من 32 بتًا. 2 بالإضافة إلى ذلك، لم تعد تعمل على كتل بحجم 64 بتًا، بل على كتل بحجم 128 بتًا، مثل خوارزمية AES. تُستخدم Blowfish2 على سبيل المثال في بيئة تطوير FreePascal.  

انظر أيضا

  • سمكتان
  • ثلاث سمكات
  • ماكغوفين

مراجع

  1. "GnuPG Frequently Asked Questions". مؤرشف من الأصل في 2017-12-21. اطلع عليه بتاريخ 2018-01-26. Blowfish should not be used to encrypt files larger than 4Gb in size, but Twofish has no such restrictions.
  2. "GnuPG Frequently Asked Questions". مؤرشف من الأصل في 2017-12-21. اطلع عليه بتاريخ 2018-01-27. For a cipher with an eight-byte block size, you'll probably repeat a block after about 32 gigabytes of data. This means if you encrypt a single message larger than 32 gigabytes, it's pretty much a statistical guarantee you'll have a repeated block. That's bad. For this reason, we recommend you not use ciphers with eight-byte data blocks if you're going to be doing bulk encryption. It's very unlikely you'll have any problems if you keep your messages under 4 gigabytes in size.
  3. Bruce Schneier (1993). "Description of a New Variable-Length Key, 64-Bit Block Cipher (Blowfish)". Fast Software Encryption, Cambridge Security Workshop Proceedings. Springer-Verlag: 191–204. مؤرشف من الأصل في 2015-10-04.
  4. Bruce Schneier (1993). "Description of a New Variable-Length Key, 64-Bit Block Cipher (Blowfish)". Fast Software Encryption, Cambridge Security Workshop Proceedings. Springer-Verlag: 191–204. مؤرشف من الأصل في 2015-10-04.Bruce Schneier (1993).
  5. "Cryptography: Description of a New Variable-Length Key, 64-Bit Block Cipher (Blowfish)". Schneier on Security. مؤرشف من الأصل في 2016-03-04. اطلع عليه بتاريخ 2015-12-31.
  6. "T2 package - trunk - bcrypt - A utility to encrypt files". www.t2-project.org. مؤرشف من الأصل في 2017-04-21. اطلع عليه بتاريخ 2018-05-07.
  7. "bcrypt Free Download - whodunnit.tools.bcrypt". bcrypt463065.android.informer.com. مؤرشف من الأصل في 2016-03-04. اطلع عليه بتاريخ 2018-05-07.
  8. "Bcrypt - Blowfish File Encryption" نسخة محفوظة 2015-08-29 على موقع واي باك مشين. bcrypt file encryption program homepage (bcrypt.sourceforge.net)
  9. "GnuPG Frequently Asked Questions". مؤرشف من الأصل في 2017-12-21. اطلع عليه بتاريخ 2018-01-27. For a cipher with an eight-byte block size, you'll probably repeat a block after about 32 gigabytes of data. This means if you encrypt a single message larger than 32 gigabytes, it's pretty much a statistical guarantee you'll have a repeated block. That's bad. For this reason, we recommend you not use ciphers with eight-byte data blocks if you're going to be doing bulk encryption. It's very unlikely you'll have any problems if you keep your messages under 4 gigabytes in size.
  10. Karthikeyan Bhargavan؛ Gaëtan Leurent (أغسطس 2016). "On the Practical (In-)Security of 64-bit Block Ciphers — Collision Attacks on HTTP over TLS and OpenVPN". ACM CCS 2016. مؤرشف من الأصل في 2016-10-09.
  11. Tom Gonzalez (يناير 2007). "A Reflection Attack on Blowfish" (PDF). Journal of LATEX Class Files. مؤرشف من الأصل (PDF) في 2015-11-18. اطلع عليه بتاريخ 2015-11-17.
  12. Orhun Kara & Cevat Manap (مارس 2007). "A New Class of Weak Keys for Blowfish" (PDF). FSE 2007. مؤرشف (PDF) من الأصل في 2016-10-05.
  13. Dahna، McConnachie (27 ديسمبر 2007). "Bruce Almighty: Schneier preaches security to Linux faithful". Computerworld. ص. 3. مؤرشف من الأصل في 2016-12-02. اطلع عليه بتاريخ 2018-01-26. At this point, though, I'm amazed it's still being used. If people ask, I recommend Twofish instead.

روابط خارجية