سمكة منتفخة (شفرة)
| عام | |
|---|---|
| المصممين | بروس شناير [1] |
| نُشرت لأول مرة | 1993 [1] |
| خلفاء | تو فيش |
| تفاصيل الشفرة | |
| أحجام المفاتيح | 32–448 بت |
| أحجام الكتل | 64 بت |
| بناء | شبكة فيستيل |
| جولات | 16 |
| أفضل تحليل تشفير عام | |
| أربع جولات من Blowfish عرضة لهجوم تفاضلي من الدرجة الثانية (Rijmen، 1997)؛ [2] بالنسبة لفئة المفاتيح الضعيفة ، يمكن تمييز 14 جولة من Blowfish عن الترتيب العشوائي الزائف (Vaudenay، 1996). | |
Blowfish هو تشفير كتلة متماثل المفتاح ، صممه بروس شناير في عام 1993 وتم تضمينه في العديد من مجموعات التشفير ومنتجات التشفير. يوفر Blowfish معدل تشفير جيد في البرامج، ولم يتم العثور على تحليل تشفير فعال له حتى الآن للملفات الأصغر حجمًا. يوصى بعدم استخدام Blowfish لتشفير الملفات التي يزيد حجمها عن 4 جيجابايت، ويجب استخدام Twofish بدلاً من ذلك. [3]
يبلغ حجم كتلة Blowfish 64 بت، وبالتالي قد يكون عرضة لهجمات عيد ميلاد Sweet32. [4]
صمم شناير خوارزمية Blowfish كخوارزمية عامة الغرض، ومقصود بها أن تكون بديلاً لخوارزمية DES القديمة وخالية من المشاكل والقيود المرتبطة بالخوارزميات الأخرى. في وقت إصدار Blowfish، كانت العديد من التصميمات الأخرى مملوكة، أو مثقلة ببراءات الاختراع ، أو كانت أسرارًا تجارية أو حكومية. صرح شناير أن "Blowfish غير حاصلة على براءة اختراع، وستظل كذلك في جميع البلدان. بموجب هذا، يتم وضع الخوارزمية في المجال العام ، ويمكن لأي شخص استخدامها بحرية." [5]
تتضمن الميزات البارزة للتصميم صناديق S المعتمدة على المفتاح وجدول مفاتيح معقد للغاية .
الخوارزمية
تحتوي شفرة Blowfish على حجم كتلة 64 بت وطول مفتاح متغير من 32 بت إلى 448 بت. [5] وهي عبارة عن شفرة Feistel مكونة من 16 جولة وتستخدم صناديق S كبيرة تعتمد على المفتاح . في البنية تشبه شفرة CAST-128 ، والتي تستخدم صناديق S ثابتة.

يوضح الرسم التخطيطي المجاور روتين تشفير Blowfish. يمثل كل سطر 32 بتًا. هناك خمس مجموعات فرعية من المفاتيح: مجموعة P مكونة من 18 إدخالاً (يشار إليها بـ K في الرسم التخطيطي لتجنب الخلط مع النص العادي) وأربعة صناديق S مكونة من 256 إدخالاً (S0 وS1 وS2 وS3).
تتكون كل جولة r من 4 إجراءات:
| الإجراء 1 | XOR النصف الأيسر (L) من البيانات مع إدخال المصفوفة P رقم r |
| العمل 2 | استخدم بيانات XORed كمدخلات لدالة F في Blowfish |
| الإجراء 3 | XOR إخراج الدالة F مع النصف الأيمن (R) من البيانات |
| الإجراء رقم 4 | تبديل L و R |
تقسم الدالة F المدخلات ذات 32 بت إلى أربعة أرباع مكونة من 8 بتات وتستخدم الأرباع كمدخلات لصناديق S. تقبل صناديق S المدخلات ذات 8 بتات وتنتج مخرجات ذات 32 بت. تتم إضافة المخرجات modulo 2 32 ويتم إجراء عملية XOR لإنتاج المخرجات النهائية ذات 32 بت (انظر الصورة في الزاوية اليمنى العليا). [6]
بعد الجولة السادسة عشر، قم بالتراجع عن التبديل الأخير، وقم بإجراء XOR L مع K18 وR مع K17 (تبييض الإخراج).
فك التشفير هو نفس التشفير تمامًا، باستثناء أن P1 وP2 و... وP18 تُستخدم بالترتيب العكسي. وهذا ليس واضحًا جدًا لأن xor تبادلية وترابطية. هناك اعتقاد خاطئ شائع وهو استخدام الترتيب العكسي للتشفير كخوارزمية فك تشفير (أي أولاً XORing P17 وP18 إلى كتلة النص المشفر، ثم استخدام إدخالات P بالترتيب العكسي).
يبدأ جدول مفاتيح Blowfish بتهيئة مجموعة P وصناديق S بقيم مستمدة من الأرقام السداسية عشرية لـ pi ، والتي لا تحتوي على نمط واضح ( لا أرى أي شيء مخفي في رقمي ). ثم يتم تدوير المفتاح السري، بايتًا تلو الآخر، إذا لزم الأمر، مع إجراء عملية XOR مع جميع إدخالات P بالترتيب. ثم يتم تشفير كتلة صفرية كاملة مكونة من 64 بت باستخدام الخوارزمية كما هي. يحل النص المشفر الناتج محل P 1 وP 2. ثم يتم تشفير نفس النص المشفر مرة أخرى باستخدام المفاتيح الفرعية الجديدة، ويحل النص المشفر الجديد محل P 3 وP 4. يستمر هذا، ويحل محل مجموعة P بأكملها وجميع إدخالات S. في المجموع، سيتم تشغيل خوارزمية تشفير Blowfish 521 مرة لتوليد جميع المفاتيح الفرعية - تتم معالجة حوالي 4 كيلوبايت من البيانات.
نظرًا لأن مجموعة P يبلغ طولها 576 بتًا، ويتم إجراء عملية XOR على بايتات المفتاح عبر كل هذه البتات الـ 576 أثناء التهيئة، فإن العديد من التطبيقات تدعم أحجام مفاتيح تصل إلى 576 بتًا. والسبب في ذلك هو التناقض بين وصف Blowfish الأصلي، الذي يستخدم مفاتيح بطول 448 بتًا، وتطبيقه المرجعي، الذي يستخدم مفاتيح بطول 576 بتًا. كما تم إنتاج متجهات الاختبار للتحقق من تطبيقات الطرف الثالث بمفاتيح بطول 576 بتًا. وعندما سُئل عن إصدار Blowfish الصحيح، أجاب بروس شناير: "يجب استخدام متجهات الاختبار لتحديد إصدار Blowfish الصحيح الوحيد".
هناك رأي آخر مفاده أن حد 448 بت موجود لضمان اعتماد كل بت من كل مفتاح فرعي على كل بت من المفتاح، [5] حيث لا تؤثر القيم الأربع الأخيرة من مجموعة P على كل بت من النص المشفر. يجب أخذ هذه النقطة في الاعتبار للتطبيقات ذات عدد مختلف من الجولات، لأنه على الرغم من أنها تزيد من الأمان ضد الهجوم الشامل، إلا أنها تضعف الأمان الذي تضمنه الخوارزمية. ونظرًا للتهيئة البطيئة للتشفير مع كل تغيير للمفتاح، فإنه يُمنح حماية طبيعية ضد هجمات القوة الغاشمة، وهو ما لا يبرر حقًا أحجام المفاتيح الأطول من 448 بت.
سمكة منتفخة في الكود الزائف
P[18] // مصفوفة P مكونة من 18 عنصرًا
S[4][256] // صناديق S: 4 مصفوفات مكونة من 256 عنصرًا
الدالة f(x):
// تحسب دالة f على مدخل x مكون من 32 بت، باستخدام صناديق S ومعالجة البتات
high_byte := ( تم تحويل x إلى اليمين بمقدار 24 بت )
second_byte := ( تم تحويل x إلى اليمين بمقدار 16 بت ) و 0xff
third_byte := ( تم تحويل x إلى اليمين بمقدار 8 بتات ) و 0xff
low_byte := x و 0xff
h := S[0][البايت_العالي] + S[1][البايت_الثاني]
العودة (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) قيم مبادلة R لـ L
وR
قيم مبادلة L وR
R := R XOR P[16]
ل := ل XOR P[17]
الإجراء blowfish_decrypt(L, R):
// فك تشفير نصفين L وR مكونين من 32 بت باستخدام مجموعة P والدالة f على مدار 16 جولة في الاتجاه المعاكس
للجولة := 17 حتى 2:
L := L XOR P[الجولة]
R := f(L) قيم مبادلة R لـ L وR قيم مبادلة
L وR
R := R XOR P[1]
ل := ل XOR P[0]
// تهيئة مجموعة P وصناديق S باستخدام المفتاح المقدم، متبوعًا بتوسيع المفتاح
// تهيئة مجموعة 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)
س[ي][ج] := ل
س[ي][ج + 1] := ر
سمكة النفخ في الممارسة العملية
Blowfish عبارة عن تشفير كتلي سريع ، باستثناء عند تغيير المفاتيح. يتطلب كل مفتاح جديد ما يعادل معالجة مسبقة لتشفير حوالي 4 كيلوبايت من النص، وهو أمر بطيء للغاية مقارنة بتشفير الكتل الأخرى. يمنع هذا استخدامه في تطبيقات معينة، لكنه لا يمثل مشكلة في تطبيقات أخرى.
يجب تهيئة Blowfish باستخدام مفتاح. من الأفضل أن يتم تجزئة هذا المفتاح باستخدام Hash_function قبل الاستخدام.
في أحد التطبيقات، يعد تغيير المفتاح البطيء في Blowfish مفيدًا بالفعل: تستخدم طريقة التجزئة لكلمة المرور (crypt $2، أي bcrypt) المستخدمة في OpenBSD خوارزمية مستمدة من Blowfish تستخدم جدول المفتاح البطيء؛ والفكرة هي أن الجهد الحسابي الإضافي المطلوب يوفر الحماية ضد هجمات القاموس . انظر تمديد المفتاح .
تبلغ مساحة ذاكرة Blowfish أكثر من 4 كيلوبايت من ذاكرة الوصول العشوائي (RAM) . ولا يشكل هذا القيد مشكلة حتى بالنسبة لأجهزة الكمبيوتر المكتبية وأجهزة الكمبيوتر المحمولة القديمة ، على الرغم من أنه يمنع الاستخدام في أصغر الأنظمة المضمنة مثل البطاقات الذكية المبكرة .
كانت Blowfish واحدة من أولى أنظمة التشفير الكتلي الآمنة التي لا تخضع لأي براءات اختراع وبالتالي فهي متاحة مجانًا لأي شخص لاستخدامها. وقد ساهمت هذه الميزة في شعبيتها في برامج التشفير.
bcrypt هي وظيفة تجزئة كلمة المرور والتي، عند دمجها مع عدد متغير من التكرارات ("تكلفة" العمل)، تستغل مرحلة إعداد المفتاح المكلفة في Blowfish لزيادة عبء العمل ومدة حسابات التجزئة، مما يقلل بشكل أكبر من التهديدات الناجمة عن هجمات القوة الغاشمة.
bcrypt هو أيضًا اسم أداة تشفير ملفات متعددة الأنظمة تم تطويرها في عام 2002 والتي تنفذ Blowfish. [7] [8] [9] [10]
الضعف والخلفاء
إن استخدام Blowfish لحجم كتلة 64 بت (على عكس حجم كتلة AES 128 بت على سبيل المثال) يجعله عرضة لهجمات أعياد الميلاد ، وخاصة في سياقات مثل HTTPS . في عام 2016، أظهر هجوم SWEET32 كيفية الاستفادة من هجمات أعياد الميلاد لإجراء استرداد للنص العادي (أي فك تشفير النص المشفر) ضد التشفير بحجم كتلة 64 بت. [11] يوصي مشروع GnuPG بعدم استخدام Blowfish لتشفير الملفات التي يزيد حجمها عن 4 جيجابايت [3] بسبب حجم كتلتها الصغير. [4]
من المعروف أن أحد المتغيرات ذات الجولة المخفضة من Blowfish عرضة لهجمات النص العادي المعروفة على المفاتيح الضعيفة العاكسة. تستخدم تطبيقات Blowfish 16 جولة من التشفير، وهي ليست عرضة لهذا الهجوم. [12] [13]
أوصى بروس شناير بالانتقال إلى خليفته في Blowfish، Twofish . [14]
تم إصدار Blowfish2 في عام 2005، وتم تطويره بواسطة أشخاص آخرين غير Bruce Schneier. يتمتع بنفس التصميم تمامًا ولكنه يحتوي على ضعف عدد جداول S ويستخدم أعدادًا صحيحة 64 بت بدلاً من الأعداد الصحيحة 32 بت. لم يعد يعمل على كتل 64 بت ولكن على كتل 128 بت مثل AES. يتم استخدام Blowfish2 على سبيل المثال في FreePascal. [15] [16]
انظر أيضا
مراجع
- ^ ab R. Shirey (أغسطس 2007). Internet Security Glossary, Version 2. Network Working Group. doi : 10.17487/RFC4949 . RFC 4949. إعلامية.
- ^ فينسنت ريجمن (1997). "تحليل الشفرات وتصميم التشفير الكتلي المتكرر" ( PostScript ) . أطروحة دكتوراه . مؤرشف من الأصل في 2013-05-08.
- ^ ab "GnuPG Frequently Asked Questions". مؤرشف من الأصل في 2017-12-21 . تم الاسترجاع في 2018-01-26 .
لا ينبغي استخدام Blowfish لتشفير الملفات التي يزيد حجمها عن 4 جيجابايت، ولكن لا توجد مثل هذه القيود في Twofish.
- ^ ab "GnuPG Frequently Asked Questions". مؤرشف من الأصل في 2017-12-21 . تم الاسترجاع في 2018-01-27 .
بالنسبة للتشفير الذي يحتوي على كتلة بحجم ثمانية بايتات، فمن المحتمل أن تكرر الكتلة بعد حوالي 32 جيجابايت من البيانات. وهذا يعني أنه إذا قمت بتشفير رسالة واحدة أكبر من 32 جيجابايت، فهذا يعني تقريبًا أنه سيكون لديك كتلة مكررة. وهذا أمر سيئ. لهذا السبب، نوصيك بعدم استخدام التشفير مع كتل بيانات بحجم ثمانية بايتات إذا كنت ستقوم بتشفير مجمع. من غير المرجح أن تواجه أي مشاكل إذا أبقيت رسائلك بحجم أقل من 4 جيجابايت.
- ^ abc 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. مؤرشف من الأصل في 2014-01-26.
- ^ "التشفير: وصف مفتاح جديد بطول متغير، تشفير بلوك 64 بت (Blowfish)". Schneier on Security . مؤرشف من الأصل في 2016-03-04 . تم الاسترجاع في 2015-12-31 .
- ^ "Bcrypt - Blowfish File Encryption" Archived 2015-08-29 at the Wayback Machine الصفحة الرئيسية لبرنامج تشفير الملفات bcrypt (bcrypt.sourceforge.net)
- ^ "تحميل برنامج bcrypt مجانا - whodunnit.tools.bcrypt". bcrypt463065.android.informer.com . مؤرشف من الأصل في 4 مارس 2016 . تم الاسترجاع 7 مايو 2018 .
- ^ "حزمة T2 - trunk - bcrypt - أداة لتشفير الملفات". www.t2-project.org . مؤرشف من الأصل في 21 أبريل 2017 . تم استرجاعه في 7 مايو 2018 .
- ^ “Oracle GoldenGate の ラ イ セ ン ス”. docs.Oracle.com . أرشفة من الأصلي في 27 أكتوبر 2017 . تم الاسترجاع في 7 مايو 2018 .
- ^ Karthikeyan Bhargavan; Gaëtan Leurent (August 2016). "حول الأمان العملي (أو غير العملي) لتشفير الكتل 64 بت — هجمات التصادم على HTTP عبر TLS وOpenVPN". ACM CCS 2016. مؤرشف من الأصل في 2016-10-09.
- ^ توم جونزاليس (يناير 2007). "هجوم تأملي على Blowfish" (PDF) . مجلة ملفات فئة LATEX. مؤرشف من الأصل (PDF) في 2015-11-18 . تم الاسترجاع في 2015-11-17 .
- ^ Orhun Kara & Cevat Manap (مارس 2007). "فئة جديدة من المفاتيح الضعيفة للأسماك المنتفخة" (PDF) . FSE 2007. مؤرشف من الأصل (PDF) في 2016-10-05.
- ^ Dahna, McConnachie (2007-12-27). "Bruce Almighty: Schneier preaches security to Linux faithful". Computerworld . ص. 3. مؤرشف من الأصل في 2016-12-02 . تم الاسترجاع في 2018-01-26 .
في هذه المرحلة، مع ذلك، أنا مندهش من أنه لا يزال قيد الاستخدام. إذا سأل الناس، أوصي بـ Twofish بدلاً من ذلك.
- ^ "Blowfish2 متضمن في Feepascal". Gitlab .
- ^ "Blowfish2 على Github". Github .
روابط خارجية
- بروس شناير. "خوارزمية تشفير السمكة المنتفخة".
- بروس شناير. "المنتجات التي تستخدم سمكة البلوفيش".
- "تسمية خوارزمية التشفير القياسية: Blowfish".
