يفشل فك تشفير DES برسالة "bad decrypt" أو خطأ حشو — ماذا أفحص؟
يتطلب فك التشفير تطابق كل معامل مع الطرف الذي شفّر: بايتات المفتاح، وطول المفتاح (8/16/24)، والوضع (ECB/CBC)، وقيمة IV، والحشو، وهل النص المشفر بصيغة hex أم Base64. الفخّان الأكثر شيوعًا: عدم تطابق طول المفتاح («مفتاح DES» من 32 حرفًا سداسيًا هو 16 بايت — أي 3DES بمفتاحين، وليس DES أحادي) والالتباس في اسم الحشو (PKCS5Padding في Java هو فعليًا PKCS#7 لـ DES — لا تختر None). اللوحة القابلة للطي في اليمين تعرض أمر OpenSSL مكافئًا للإعدادات الحالية؛ وإرساله إلى الطرف الآخر أسرع طريقة لمعرفة مكان الاختلاف.
كم طول مفتاح DES؟ و3DES؟
DES الأحادي: 64 بت اسمية (8 بايت، منها 56 بت فعالة — بت واحد في كل بايت بت باريتي). و3DES يأتي بصيغتين: مفتاحان (16 بايت، K1‖K2 حيث K3=K1) وثلاثة مفاتيح (24 بايت، K1‖K2‖K3). المادة الاسمية للمفاتيح 112/168 بت، لكن القوة الأمنية الفعلية وفق NIST (SP 800-57 Part 1 Rev.5، الجدول 2) هي نحو 80 و112 بت فقط — بل إن صيغة المفاتيح الثلاثة أُهملت أيضًا. تكتشف هذه الأداة الصيغة من عدد البايتات؛ وأي شيء غير 8/16/24 يرفض خطأً — بينما يقطع CryptoJS وopenssl enc -K صامتًا أو يكمل بأصفار، وهو السبب الأول لفشل التوافق البيني.
ما هي قيمة IV وكم طولها في DES؟
قيمة IV هي قيمة 8 بايت يخلطها CBC في الكتلة الأولى؛ وECB لا يستخدمها. ويجب أن تكون 8 بايت تمامًا (16 رقمًا سداسيًا أو 8 أحرف ASCII). لاحظ أن IV في DES طوله 8 بايت بينما في AES 16 — نسخ طول IV من AES يفشل فورًا. ولا تُعِد استخدام قيمة IV بالمفتاح نفسه أبدًا.
إلى ماذا يقابل DES/ECB/PKCS5Padding في Java في هذه الأداة؟
وضع ECB + حشو PKCS#7. في JCE، ينفّذ "PKCS5Padding" لـ DES خوارزمية PKCS#7 العامة — فقد عرّف PKCS#5 الحشو لكتل 8 بايت فقط، وهي كتلة DES بالصدفة. وناتج Cipher.getInstance("DES/ECB/PKCS5Padding") في Java يُفك تشفيره هنا بـ ECB + PKCS#7 ومفتاح DES أحادي بطول 8 بايت. ⚠️ 3DES في Java (DESede) لا يقبل سوى مفاتيح 24 بايت — ولصيغة المفتاحين عليك توسيع K1‖K2 إلى K1‖K2‖K1 بنفسك.
كيف تقابل أسماء الخوارزميات des-ede3 في PHP؟
يستعير PHP أسماء OpenSSL: des-ede3-cbc هي 3DES بثلاثة مفاتيح + CBC، وdes-ede3-ecb هي ثلاثة مفاتيح + ECB؛ وdes-ede-cbc هي صيغة المفتاحين. مفتاح 24 بايت يحدد ثلاثة مفاتيح، و16 بايت يحدد مفتاحين.
ما هي بتات الباريتي في مفتاح DES؟ وهل تُفحص؟
البُت الأدنى في كل بايت من المفتاح معرّف كبت باريتي، فالمفتاح الحقيقي 56 بت يجلس داخل 64 بت. لا يطلب FIPS 46-3 فحصها — OpenSSL وJava وهذه الأداة كلها تتجاهلها؛ وأي 8 بايت تعمل، وتغيير بتات الباريتي لا يغيّر النص المشفر. و.NET هو الاستثناء: يطبّع الباريتي أولًا ثم يفحص جدول المفاتيح الضعيفة، فتُرفض المفاتيح الأصفار والمفاتيح الضعيفة الأخرى في .NET بينما تشفّرها كل المكتبات الأخرى بلا مشكلة — فخّ لا ينطلق إلا عند ترحيل مفاتيح اختبار من Java/OpenSSL إلى .NET.
ماذا يحدث في 3DES عندما K1 = K2؟
في 3DES بمفتاحين، تساوي K3 قيمة K1 دائمًا؛ وإذا كان K1 = K2 أيضًا، انهارت سلسلة EDE كلها إلى DES أحادي: E_K(D_K(E_K(P))) = E_K(P). ويحدث نفس الشيء عندما تكون مكونات 8 بايت الثلاثة لمفتاح 24 بايت متطابقة. لا تزال هذه الأداة تشفّر (التوافق أولًا)، لكن القوة الحقيقية تصبح DES أحادي بـ 56 بت، لا 3DES.
هل ما زال DES آمنًا؟
لا — ليس إلا للتوافق مع الأنظمة القديمة. سحب NIST الشيفرة DES الأحادية في 2005-05-19 (المفاتيح 56 بت قابلة للكسر بالقوة الغاشمة؛ وقد نجح Deep Crack من EFF في 56 ساعة عام 1998، وفي 22 ساعة في العام التالي مع distributed.net). ويسرد SP 800-131A Rev.2 تشفير TDEA بمفتاحين ضمن Disallowed، والتشفير بثلاثة مفاتيح ضمن Disallowed بعد 2023-12-31 (يبقى فك التشفير "Legacy use" لقراءة البيانات التاريخية فقط)؛ وسُحب SP 800-67 نفسه في 2024-01-01. وتحمل الكتلة الصغيرة 64 بت حد عيد الميلاد من فئة Sweet32 (CVE-2016-2183) — يحدد NIST سقف حزمة المفتاح الواحدة بـ 2²⁰ كتلة (نحو 8 MB) من النص الصريح. استخدم AES-256 لأي شيء جديد. وجود هذه الأداة سببه أن المقاصات المصرفية وبوابات الدفع وأنظمة Java/.NET القديمة ما زالت تشغّل رسائل من عصر DES — وإصلاحها يبدأ من القدرة على قراءتها.
لماذا تختلف نتيجة 3DES لدي عن Java/PHP؟
افحص بترتيب نسبة الاحتمال: ① طول المفتاح — «مفتاح DES من 32 رقمًا سداسيًا» لدى الطرف الآخر هو 16 بايت (3DES بمفتاحين)، وأنت فككت التشفير بوصفه DES أحادي؛ ② الوضع — "DES" المجردة في Java افتراضيها ECB، الأسماء بلا لاحقة وضع في OpenSSL مثل des-ede3 وdes-ede هي ECB (والاسم البديل لـ CBC هو -des3)؛ وopenssl_encrypt في PHP تتطلب كتابة اسم الخوارزمية صراحةً — والمربك أنها تُخرج افتراضيًا نصًا بترميز Base64 لا بايتات خامًا؛ ③ الحشو — كان mcrypt القديم في PHP يستخدم حشو الأصفار غالبًا، بينما تستخدم JCE حشو PKCS#5/PKCS#7؛ ④ الترميز — hex أم Base64، وحالة الأحرف؛ ⑤ فخ كلمة السر في CryptoJS — تمرير سلسلة نصية بوصفها "مفتاحًا" يشغّل اشتقاق المفاتيح (MD5 + ملح عشوائي، ومخرجات بادئتها Salted__، مختلفة في كل مرة)، وهو باتفاق ليس المفتاح الخام أصلًا — السبب الأول لـ «الكود نفسه ونتيجة مختلفة كل تشغيل». تتيح لك هذه الأداة تبديل كل بند؛ ويمكن إرسال أمر OpenSSL المكافئ في اليمين إلى الطرف الآخر لإعادة الإنتاج.
ECB أم CBC — أيهما أستخدم؟
ما يتطلبه النظام الذي تخاطبه — فالتوافق القديم لا يملك صوتًا. وإذا كان بإمكانك الاختيار، فدائمًا CBC بقيمة IV عشوائية: يشفّر ECB الكتل الصريحة المتطابقة إلى كتل مشفرة متطابقة، وتجعل الكتل الصغيرة 8 بايت في DES تسرّب الأنماط أوضح منه في AES-ECB. بروتوكولات المصارف بزمن DES تستخدم كليهما؛ افحص وثيقة البروتوكول أولًا.
هل يعمل هذا دون اتصال؟ هل تُرفع بياناتي؟
كل الحساب يحدث في متصفحك (TypeScript خالص، بلا اعتماديات، بلا طلبات شبكة)؛ المفاتيح والنص الصريح لا يغادران الجهاز أبدًا. وبعد تحميل الصفحة يمكنك قطع الاتصال والاستمرار في العمل. هذا هو الشكل الوحيد المقبول لأداة تتعامل مع المفاتيح.
مفتاحان أم ثلاثة مفاتيح في 3DES — أيهما أكثر شيوعًا في الأنظمة القديمة؟
المفتاحان (16 بايت) أكثر شيوعًا: نشرت المصارف وصناعة الدفع عتادًا بمفاتيح 16 بايت لأسباب التوافق، وأبقى SP 800-67 له تاريخ إهمال منفصلًا (أسبق). لذا فـ «مفتاح 3DES» من 32 رقمًا سداسيًا هو على الأرجح صيغة المفتاحين. تكتشف هذه الأداة الصيغة من عدد البايتات تلقائيًا.