Skip to content

شفّر وفكّ شفرة SM4 أونلاين

شفّر وفك شفرة SM4 أونلاين. إذا فشل فك الشفرة تحدّد الأداة الخاطئ: الوضع أم الحشو أم IV أم الترميز، وتقترح الإصلاح. تعمل في متصفحك ولا يُرفع شيء. ECB وCBC وCTR وCFB وOFB؛ حشو PKCS#7 أو صفري أو بدون حشو.

بدون تتبّع يعمل في المتصفّح مجاني
تجري التعمية بالكامل داخل متصفحك — المفتاح والبيانات التي تدخلها لا تغادر هذا الجهاز أبدًا.
النص المشفّر
أمر OpenSSL المكافئ

يتطلّب OpenSSL 3. يتضمّن الأمر المفتاح الذي أدخلته.

متجهات اختبار SM4 من GB/T 32907-2016

حُسبت وقت بناء الصفحة بالمحرّك نفسه الذي تشغّله هذه الصفحة — تحقّق من تنفيذك الخاص لـSM4 مقابلها.
المفتاح 0123456789abcdeffedcba9876543210
النص الصريح 0123456789abcdeffedcba9876543210
النص المشفّر بعد تعمية واحدة 681edf34d206965e86b3e94f536e4246
النص المشفّر بعد 1,000,000 تعمية 595298c7c6fd271f0402f804c33d3f66
محرّك SM4 مُختبَر مقابل متجهَي الملحق A في GB/T 32907-2016، ومُتحقَّق منه بالمقارنة مع OpenSSL 3 في أوضاع ECB وCBC وCTR وCFB وOFB. وتم التحقّق من افتراضيات المكتبات بتشغيل OpenSSL وNode.js وsm-crypto وgm-crypt وgmssl ومكتبتين بلغة Go، وبقراءة الكود المصدري لـHutool وBouncyCastle. — فريق أمان Go-Tools · Sep 11, 2026

كتبه وراجعه مطوّرون يبنون أدوات تعمية. كل نص مشفّر وكل عدد بايتات مذكور في هذه الصفحة يحسبه محرّك الأداة وتتحقّق منه الاختبارات.

إجابات سريعة عن SM4

طول مفتاح SM4

16 بايت 128 بت بالضبط: 16 بايت، تُكتب على شكل 32 خانة Hex أو 16 حرف ASCII. لا توجد مفاتيح SM4 بطول 192 أو 256 بت.

متجه اختبار GB/T 32907

681edf34d206965e86b3e94f536e4246 عندما يكون المفتاح والنص الصريح 0123456789abcdeffedcba9876543210، يكون الناتج بعد تعمية واحدة 681edf34d206965e86b3e94f536e4246.

حجم كتلة SM4 وعدد جولاته

32 جولة كتل بطول 16 بايت (128 بت)، تُشفَّر في 32 جولة.

هل يسبّب IV الخاطئ خطأً دائمًا في CBC؟

أول 16 بايت لا. أول 16 بايت فقط تُفكّ بشكل خاطئ، ويظل الحشو في الكتلة الأخيرة يجتاز الفحص.

ما هو SM4؟

خوارزمية SM4 هي الشفرة الكتلية في معايير التعمية التجارية الصينية. صدرت أولًا باسم GM/T 0002-2012، ثم أصبحت المعيار الوطني GB/T 32907-2016 (النافذ منذ 1 مارس 2017)، وأُضيفت إلى المعيار الدولي ISO/IEC 18033-3 بتعديل صدر عام 2021. وهي شفرة متماثلة: المفتاح نفسه بطول 128 بت يشفّر ويفكّ الشفرة، وتعمل على كتل بطول 128 بت، أي 16 بايت في كل مرة — وهو حجم الكتلة نفسه في AES.

داخليًا، تُقسَم كل كتلة إلى أربع كلمات بطول 32 بت وتمرّ عبر 32 جولة. في كل جولة تُمزج ثلاث من الكلمات مع مفتاح الجولة، ويمرّ الناتج عبر صندوق استبدال (S-box) بطول 8 بتات ثم تحويل خطي، ثم يُدمج في الكلمة الرابعة. تُشتق مفاتيح الجولات الـ32 من المفتاح باستخدام مجموعتين ثابتتين من الثوابت، وفكّ الشفرة هو الحساب نفسه مع مفاتيح الجولات بترتيب معكوس.

لا تعالج الشفرة الكتلية وحدها إلا 16 بايت بالضبط، لذا تمرّ البيانات الحقيقية دائمًا عبر وضع تشغيل. تقدّم هذه الأداة الأوضاع الخمسة الكلاسيكية: ECB وCBC اللذين يعملان على كتل كاملة ويحتاجان إلى حشو، وCTR وCFB وOFB التي تحوّل SM4 إلى شفرة تدفّقية بلا أي حشو. ومعظم حالات فشل فكّ الشفرة لا علاقة لها بـSM4 نفسه — بل تنتج عن اختلاف الطرفين في الوضع أو الحشو أو IV أو ترميز النص أو طريقة تحويل سلسلة المفتاح إلى بايتات، بل إن المكتبات لا تتفق حتى على معنى «SM4» المجرّد.

واجهة Web Crypto API المدمجة في المتصفحات لا تتضمّن SM4، لذا تحمل هذه الصفحة تنفيذها الخاص وتشغّله محليًا. وهو مُختبَر مقابل متجهَي اختبار GB/T 32907، ومُتحقَّق منه بالمقارنة مع OpenSSL 3 في كل الأوضاع.

// SM4-CBC with PKCS#7 padding using Node.js and its bundled OpenSSL 3.
// Key and IV are both exactly 16 bytes (32 hex digits).
const crypto = require('node:crypto');

const key = Buffer.from('0123456789abcdeffedcba9876543210', 'hex');
const iv = Buffer.from('fedcba98765432100123456789abcdef', 'hex');

const cipher = crypto.createCipheriv('sm4-cbc', key, iv);
const ciphertext = Buffer.concat([cipher.update('hello', 'utf8'), cipher.final()]);
console.log(ciphertext.toString('base64')); // fUQPRg2HAXHGz5ZslzCpSQ==

const decipher = crypto.createDecipheriv('sm4-cbc', key, iv);
const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
console.log(plaintext.toString('utf8')); // hello

ميزات أداة SM4

يخبرك لماذا فشل فكّ الشفرة

عندما يفشل فكّ الشفرة، تعيد الصفحة المحاولة بترميز النص المشفّر وصيغة المفتاح والوضع وIV والحشو وترميز النص، وتعرض الإعدادات التي تُنتج نصًا مقروءًا.

إعدادات مسبقة لأكثر المكتبات استخدامًا

بنقرة واحدة تُضبط افتراضيات OpenSSL أو Hutool أو sm-crypto أو gm-crypt أو tjfoc/gmsm — وهي مكتبات لا تتفق حتى على أن «SM4» المجرّد يعني ECB أم CBC.

خمسة أوضاع وثلاثة أنواع حشو وUTF-8 أو GBK

ECB وCBC وCTR وCFB وOFB مع PKCS#7 أو الحشو الصفري أو بدون حشو. ويمكن أن يكون النص الصريح UTF-8 أو GBK، وهو الترميز الذي يُنتجه كود Java القديم على Windows الصيني. وضع GCM غير مدعوم.

مفتاح SM4 وIV: عشوائيان، أو بصيغة Hex أو نص أو Base64

ولّد مفتاحًا أو IV عشوائيًا بطول 16 بايت بنقرة واحدة، أو أدخله بالشكل الذي يكتبه به كودك. ويؤكّد عدّاد البايتات المباشر أن لديك 16 بايت بالضبط قبل أن تبدأ البحث عن أسباب أخرى.

متجهات اختبار GB/T 32907 في الصفحة

نتيجتا الملحق A مطبوعتان في جدول ويمكن تحميل الأولى بنقرة واحدة، فتستطيع التحقق من أي تنفيذ لـSM4 مقابل المعيار.

أمر OpenSSL المكافئ

تأتي كل نتيجة مع أمر openssl enc الذي يعيد إنتاجها، فتستطيع تأكيدها في الطرفية أو تسليمها لزميل.

تعمل بالكامل داخل متصفحك

يعمل محرّك SM4 محليًا. لا تغادر المفاتيح والبيانات الصفحة أبدًا، وتواصل الأداة العمل دون اتصال بالإنترنت.

افتراضيات SM4 في المكتبات الشائعة

OpenSSL 3 (openssl enc)

-sm4 = CBC

-sm4 اسم بديل لـ-sm4-cbc. يأخذ -K و-iv قيمًا بصيغة Hex، ويبقى PKCS#7 مفعّلًا ما لم تمرّر -nopad، والناتج بايتات خام ما لم تضف -base64 -A. وقيمة -K ذات الطول الخاطئ تُقصّ أو تُكمَل بالأصفار مع مجرد تحذير.

Java: Hutool SmUtil.sm4(key)

ECB · PKCS#7

تمرّر Hutool الاسم المجرّد SM4، فتشغّله BouncyCastle بوضع ECB مع PKCS#7 (وتسمّيه JCE باسم PKCS5Padding). دوال السلاسل تستخدم UTF-8، وencryptHex تطبع Hex بأحرف صغيرة. ولوضع CBC استخدم new SM4(Mode.CBC, Padding.PKCS5Padding, key, iv).

Java: BouncyCastle Cipher.getInstance("SM4")

ECB · PKCS#7

في وضع يحتاج إلى IV ولم يُمرَّر له، تولّد التعمية IV عشوائيًا بصمت، بينما يرمي فكّ الشفرة الخطأ no IV set when one expected — لذلك لا يمكن فكّ شفرة نص شُفِّر دون حفظ ذلك IV في أي مكان.

JavaScript: sm-crypto

ECB · مفتاح Hex

تعتمد sm4.encrypt(data, key) افتراضيًا ECB مع PKCS#7، وتتوقّع المفتاح سلسلة Hex من 32 خانة، وتعيد Hex بأحرف صغيرة. لا يغيّر الوضع إلا mode: 'cbc'؛ وأي قيمة أخرى تُبقي ECB بصمت. وتتصرّف sm-crypto-v2 بالطريقة نفسها، لكنها تستخدم IV كلّه أصفار عندما لا يُمرَّر iv إلى CBC.

JavaScript: gm-crypt

CBC · مفتاح نصي · Base64

تعتمد CBC افتراضيًا، وتأخذ المفتاح وIV سلسلتين بترميز UTF-8 من 16 حرفًا، وتعيد Base64. والمفتاح الذي لا تشكّل بايتاته UTF-8 صالحًا لا يمكن تمريره إليها أصلًا.

Python: gmssl CryptSM4

PKCS#7 · المفتاح يُقصّ إلى 16 بايت

تختار الوضع باستدعاء crypt_ecb أو crypt_cbc. لا تقرأ set_key إلا أول 16 بايت، فيُقصّ المفتاح الأطول بصمت، والمفتاح الخاطئ يعيد عادةً بايتات فارغة بدل أي خطأ.

Go: tjfoc/gmsm sm4

IV صفري افتراضيًا

تستخدم Sm4Cbc قيمة IV على مستوى الحزمة تبقى أصفارًا كلها حتى تُستدعى SetIV، وتحشو بـPKCS#7 حتى في CFB وOFB، وتتجاهل أخطاء إزالة الحشو — فالمفتاح الخاطئ يعيد nil دون أي خطأ.

أمثلة على شفرة SM4 وفكّها

متجه اختبار GB/T 32907 (وضع ECB، بدون حشو)

المفتاح 0123456789abcdeffedcba9876543210، النص الصريح (Hex) 0123456789abcdeffedcba9876543210
681edf34d206965e86b3e94f536e4246

هذا هو المثال 1 من الملحق A في GB/T 32907-2016: للمفتاح والنص الصريح القيمة نفسها بطول 128 بت، وإذا شُفِّر النص مرة واحدة كان الناتج 681edf34d206965e86b3e94f536e4246. وإذا شُفِّر ذلك الناتج مرة بعد مرة حتى مليون مرة إجمالًا، كان الناتج 595298c7c6fd271f0402f804c33d3f66. القيمتان مطبوعتان في جدول متجهات الاختبار في هذه الصفحة، وقد حسبهما المحرّك نفسه الذي تستخدمه الآن. زر متجه اختبار GB/T 32907 يحمّل القيمة الأولى.

وضع CBC مع PKCS#7: نص صريح في الإدخال وBase64 في الناتج

المفتاح 0123456789abcdeffedcba9876543210، IV fedcba98765432100123456789abcdef، النص الصريح: SM4 interop test: order 20260911-0042
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y

النص الصريح 37 بايت بترميز UTF-8. يحشوه PKCS#7 إلى 48 بايت، أي ثلاث كتل بطول 16 بايت، يكتبها Base64 في 64 حرفًا. زر تحميل مثال يملأ هذه القيم نفسها بالضبط، وتعرض لوحة OpenSSL أمرًا يعيد إنتاج سلسلة Base64 نفسها في الطرفية.

خطأ في IV مع CBC: تتلف أول 16 بايت فقط

النص المشفّر أعلاه، بعد فكّ شفرته بـ IV 00000000000000000000000000000000
16 بايت مشوّهة، ثم ": order 20260911-0042"

يمزج CBC قيمة IV في الكتلة الأولى وحدها، بينما يقع حشو PKCS#7 في الكتلة الأخيرة، لذلك يمرّ فحص الحشو ولا يُصدر OpenSSL أي خطأ. تلاحظ هذه الصفحة أن الكتلة الأولى غير مقروءة، فتخبرك بأن المفتاح والوضع صحيحان وأن المشكلة في IV — أو أن أول 16 بايت من النص المشفّر هي نفسها IV.

كيف تشفّر وتفكّ شفرة SM4 بهذه الأداة

  1. 1

    اختر إعدادًا مسبقًا لمكتبة، أو الوضع والحشو

    إذا كنت تعرف المكتبة في الطرف الآخر، فاخترها من «مطابقة افتراضيات مكتبة». وإلا فاختر «شفّر» أو «فكّ الشفرة» وطابِق الوضع والحشو. الأوضاع التدفّقية (CTR وCFB وOFB) بلا حشو، لذلك يُعطَّل مُحدِّد الحشو معها.

  2. 2

    أدخل المفتاح وIV

    طول كلٍّ منهما 16 بايت بالضبط. اختر الصيغة المكتوبة بها السلسلة — Hex أو نص أو Base64 — وراقب عدّاد البايتات حتى يصبح أخضر. أزرار «عشوائي» تولّد قيمًا جديدة.

  3. 3

    الصق الإدخال

    في اتجاه «شفّر» اكتب نصًا (UTF-8 أو GBK) أو الصق بايتات Hex. وفي اتجاه «فكّ الشفرة» الصق النص المشفّر وحدّد هل هو Base64 أم Hex. تتحدّث النتيجة أثناء الكتابة.

  4. 4

    انسخ النتيجة أو تحقّق من الدورة الكاملة

    انسخ الناتج، أو انقر «فكّ شفرة هذا النص» لنقله إلى تبويب فكّ الشفرة بالمفتاح وIV نفسيهما. وتعرض لوحة OpenSSL أمرًا يعيد إنتاج النتيجة.

  5. 5

    إذا فشل فكّ الشفرة، فاقرأ التشخيص

    يسرد التشخيص الإعدادات التي تُفكّ بها مدخلاتك إلى نص مقروء. طبّق أحدها بنقرة، أو اقرأ الملاحظة إذا فشلت أول 16 بايت فقط — فهذا يشير إلى IV.

لماذا يفشل فكّ شفرة SM4

قراءة مفتاح Hex على أنه نص

سلسلة Hex من 32 حرفًا لا تساوي 16 بايت إلا إذا فُكّ ترميزها كـHex. أما إذا قُرئت كنص فهي 32 بايت يرفضها SM4 — أو، في كود يقصّ المفاتيح أو يكملها بصمت، مفتاح مختلف تمامًا.

✗ خطأ
المفتاح (نص): 0123456789abcdeffedcba9876543210  -> 32 بايت، مرفوض
✓ صحيح
المفتاح (Hex): 0123456789abcdeffedcba9876543210  -> 16 بايت

فكّ شفرة نص مشفّر بـCBC على أنه ECB

يجب أن يستخدم الطرفان الوضع نفسه. النص المشفّر بـCBC إذا فُكّت شفرته بـECB أعطى رموزًا مشوّهة في كل كتلة، وغالبًا ما يفشل في فحص الحشو في النهاية.

✗ خطأ
encrypt: SM4/CBC/PKCS5Padding
decrypt: SM4/ECB/PKCS5Padding  -> bad decrypt
✓ صحيح
encrypt: SM4/CBC/PKCS5Padding
decrypt: SM4/CBC/PKCS5Padding, same IV

استخدام IV مختلف

في CBC لا يُصدر IV الخاطئ أي خطأ: تخرج أول 16 بايت مشوّهة ويُفكّ الباقي بشكل طبيعي. إذا كانت بداية النص الصريح وحدها تالفة، فقارن قيمتي IV لدى الطرفين.

✗ خطأ
decrypt IV 00000000000000000000000000000000
-> 16 بايت مشوّهة + ": order 20260911-0042"
✓ صحيح
decrypt IV fedcba98765432100123456789abcdef
-> "SM4 interop test: order 20260911-0042"

معاملة نص مشفّر بـBase64 على أنه Hex

Base64 وHex طريقتان لكتابة البايتات نفسها. وقراءة إحداهما على أنها الأخرى تعطي الشفرة إدخالًا خاطئًا من البداية.

✗ خطأ
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y  read as hex -> invalid
✓ صحيح
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y  read as Base64 -> 48 bytes

الحشو الصفري يحذف أصفارًا حقيقية في النهاية

لا يستطيع الحشو الصفري التمييز بين الحشو والبيانات، فالنص الصريح الذي ينتهي فعلًا ببايتات 0x00 يفقدها. استخدم PKCS#7 لكل ما ليس نصًا عاديًا.

✗ خطأ
zero padding: 61 62 00  -> decrypts to 61 62
✓ صحيح
PKCS#7:       61 62 00  -> decrypts to 61 62 00

افتراض أن «SM4» يعني الوضع نفسه في كل مكان

يعامل OpenSSL الخيار sm4 على أنه CBC. أما BouncyCastle — ومن ثَمّ SmUtil.sm4(key) في Hutool — فيعامل SM4 على أنه ECB مع PKCS#7. فقد يختلف نظامان «يستخدمان SM4 فحسب» في الوضع.

✗ خطأ
Java:    Cipher.getInstance("SM4")  -> ECB + PKCS#7
OpenSSL: openssl enc -sm4           -> CBC
✓ صحيح
Java:    Cipher.getInstance("SM4/CBC/PKCS5Padding")
OpenSSL: openssl enc -sm4-cbc

بايتات GBK تُشفَّر في طرف وUTF-8 في الطرف الآخر

تستخدم getBytes() في Java دون تحديد مجموعة محارف الترميزَ الافتراضي للمنصة، وهو GBK على Windows الصيني مع JDK 17 أو أقدم. فيُشفَّر النص الصيني نفسه إلى نص مشفّر مختلف، ويفكّه الطرف الآخر إلى رموز مشوّهة.

✗ خطأ
"国密SM4 test".getBytes()  // GBK on a Chinese Windows JDK <= 17
-> ECB ciphertext 3188d06cf28db70092f8753cbd5ee518
✓ صحيح
"国密SM4 test".getBytes(StandardCharsets.UTF_8)
-> ECB ciphertext d830308b0ae4fa7b9a2b5d59f7f65ca5

متى تحتاج إلى شفرة SM4 أونلاين

طابِق ناتج SM4 بين الواجهة الخلفية والواجهة الأمامية
خدمة Java لديك وعميل الويب يُنتجان نصًا مشفّرًا مختلفًا للنص نفسه. أعد إنتاج كل طرف هنا بالإعداد المسبق لمكتبته، وانظر أيّ معامل يختلف.
صحّح فشل فكّ شفرة قادمة من نظام شريك
يرسل شريك نصًا مشفّرًا بـSM4 لا يُفكّ. الصقه مع المفتاح وIV المتفق عليهما، ودع التشخيص يجد الوضع أو الحشو أو الترميز الذي استخدمه فعلًا.
تحقّق من تنفيذ لـSM4
شغّل كودك على متجهات GB/T 32907 في هذه الصفحة، ثم شفّر نصًا بوضع CBC وفكّ شفرته وقارن النتيجة، قبل أن يقترب التنفيذ من بيانات الإنتاج.
جهّز بيانات اختبار للانتقال إلى SM4
عندما ينتقل نظام من AES إلى SM4، ولّد هنا ثلاثيات معروفة من المفتاح وIV والنص المشفّر لتستخدمها بيانات مرجعية في الاختبارات الجديدة.
شاهد كيف تتصرّف أوضاع الشفرة الكتلية
شفّر كتلتين متطابقتين بوضعَي ECB وCBC، أو فكّ الشفرة بـIV خاطئ، وراقب ما يتغيّر في النص المشفّر وفي الناتج.

كيف يعمل SM4 وأوضاع تشغيله

حجم الكتلة وحجم المفتاح والجولات
يشفّر SM4 كتلًا بطول 128 بت بمفتاح طوله 128 بت في 32 جولة. تطبّق كل جولة صندوق استبدال (S-box) بطول 8 بتات على كلمة بطول 32 بت، ثم تحويلًا خطيًا يجري عملية XOR بين الكلمة وأربعة تدويرات لها. ويُجري فكّ الشفرة الجولات الـ32 نفسها مع مفاتيح الجولات بترتيب معكوس.
ECB: كل كتلة وحدها
يشفّر ECB كل كتلة بطول 16 بايت على حدة. لا يحتاج إلى IV، لكن كتل النص الصريح المتساوية تصبح كتلًا مشفّرة متساوية، فتبقى الأنماط في البيانات ظاهرة. ويحتاج إلى حشو ما لم يكن الإدخال مضاعفًا لـ16 بايت.
CBC: كتل متسلسلة وIV
يجري CBC عملية XOR بين كل كتلة من النص الصريح والكتلة المشفّرة السابقة قبل أن تُشفَّر، ويستخدم IV للكتلة الأولى. ولأن IV لا يدخل إلا في الكتلة الأولى، يُفسد IV الخاطئ أول 16 بايت من النص الصريح بالضبط ويترك الحشو في الكتلة الأخيرة سليمًا، لذلك كثيرًا ما لا يظهر أي خطأ.
CTR وCFB وOFB: SM4 شفرةً تدفّقية
تشفّر هذه الأوضاع عدّادًا أو قيمة تغذية راجعة وتجري XOR بين الناتج والبيانات، فيكون النص المشفّر بطول النص الصريح ولا يوجد حشو. في CTR يُزاد IV كاملًا بطول 16 بايت كعدّاد واحد بطول 128 بت بترتيب big-endian، مطابقةً لـOpenSSL. وIV الخاطئ يشوّه الرسالة كلها في CTR وOFB، لكنه يشوّه الكتلة الأولى فقط في CFB.
قواعد الحشو
يضيف PKCS#7 من 1 إلى 16 بايت قيمة كلٍّ منها n، فحتى الرسالة المكوّنة أصلًا من عدد صحيح من الكتل تحصل على كتلة حشو كاملة. أما الحشو الصفري فيضيف بايتات 0x00 عند الحاجة فقط، ويزيل كل الأصفار في النهاية عند فكّ الشفرة. وخيار بدون حشو يترك البيانات كما هي ويرفض الإدخال الذي لا يملأ كتلًا كاملة.

أفضل ممارسات استخدام SM4

لا تختر ECB في التصاميم الجديدة
يكشف ECB أيّ الكتل متساوية. استخدم CBC أو CTR، إلا إذا كنت تطابق نظامًا قائمًا يستخدم ECB أصلًا.
استخدم IV عشوائيًا جديدًا لكل رسالة
ليس IV سرًّا، لكن يجب ألا يتكرّر مع المفتاح نفسه. ولّده عشوائيًا لكل رسالة، واحفظه أو أرسله بجوار النص المشفّر.
صادِق على النص المشفّر
ينصّ المعيار الصيني GB/T 17964-2021 الخاص بأوضاع تشغيل الشفرات الكتلية على أن الأوضاع التي يصفها تحمي السرية لا السلامة. في CBC يكفي تغيير بايت واحد من IV لتحويل pay=100.00 إلى pay=900.00، ويظل فكّ الشفرة ناجحًا. احسب رمز MAC على IV والنص المشفّر وتحقّق منه قبل فكّ الشفرة، مثلًا باستخدام مولّد HMAC.
اكتب كل معامل في مواصفة الواجهة
عبارة «مشفّر بـSM4» ليست مواصفة. دوّن الوضع، والحشو، وطريقة ترميز المفتاح وIV، ومجموعة محارف النص الصريح، وهل النص المشفّر Hex أم Base64.
أبقِ المفاتيح الحقيقية بعيدًا عن صفحات الويب والكود المصدري
استخدم هذه الصفحة مع مفاتيح اختبار. مكان مفاتيح الإنتاج نظام لإدارة المفاتيح أو وحدة أمان عتادية (HSM)، تُحمَّل منه وقت التشغيل بدل لصقها أو إيداعها في المستودع.

أسئلة شائعة عن شفرة SM4

لماذا يفشل فكّ شفرة SM4 برسالة خطأ في الحشو أو بنص مشوّه؟
لا ينجح فكّ الشفرة إلا إذا طابق كل شيء ما استخدمه الطرف الذي شفّر البيانات: بايتات المفتاح، والوضع، وIV، والحشو، وطريقة كتابة النص المشفّر (Hex أم Base64). والخطأ الذي يظهر لك — «bad decrypt» أو استثناء في الحشو أو شاشة من الرموز المشوّهة — لا يقول أيّها المختلف، وبعض المكتبات تعيد ناتجًا فارغًا بدل أي خطأ. الصق النص المشفّر والمفتاح وIV هنا على أي حال. عندما يفشل فكّ الشفرة، تعيد الصفحة المحاولة بكل تركيبة من ترميز النص المشفّر وصيغة المفتاح والوضع وIV والحشو — بما في ذلك المفاتيح التي قصّتها مكتبة ما بصمت إلى 16 بايت، والنص الصريح المرمَّز بـGBK — وتسرد القراءات التي تُنتج نصًا مقروءًا، مع تمييز تلك التي اجتاز فيها حشو PKCS#7 الفحص. وإذا خرجت أول 16 بايت وحدها خاطئة، فالمفتاح والوضع صحيحان والخطأ في IV.
ما طول مفتاح SM4، وهل يمكن أن يكون 256 بت؟
مفتاح SM4 طوله 128 بت بالضبط، أي 16 بايت — بحجم الكتلة نفسه. لا يعرّف GB/T 32907 سوى هذا الطول الواحد للمفتاح؛ فلا يوجد SM4 بمفتاح 192 أو 256 بت. إذا طلب منك أحدهم مفتاح SM4 بطول 256 بت، فتحقّق هل حُسبت سلسلة Hex من 32 خانة على أنها 32 حرفًا كلٌّ منها 8 بتات. يمكن كتابة 16 بايت على شكل 32 خانة Hex أو 16 حرف ASCII، والخلط بين الاثنين هو أكثر أخطاء المفتاح شيوعًا: السلسلة 0123456789abcdeffedcba9876543210 إذا قُرئت كـHex فهي 16 بايت، أما إذا قُرئت كنص فهي 32 بايت وتُرفض. مُحدِّد الصيغة وعدّاد البايتات بجوار حقل المفتاح موجودان لالتقاط هذا الخطأ تحديدًا.
ما هو IV في SM4، وما الطول المطلوب له؟
متجه التهيئة (IV) قيمة بطول 16 بايت تُمزج في الكتلة الأولى في CBC وCTR وCFB وOFB؛ أما ECB فلا يستخدمه. يجب أن يكون طوله 16 بايت بالضبط — 32 خانة Hex أو 16 حرف ASCII — فإذا ظهر لك خطأ في طول IV، فتحقّق هل قُرئت سلسلة Hex من 32 خانة كنص طوله 32 بايت. ليس IV سرًّا، لكن يجب ألا يتكرّر مع المفتاح نفسه: ولّده عشوائيًا وأرسله مع النص المشفّر، وغالبًا في مقدّمته. في CBC لا يُصدر IV الخاطئ عادةً أي خطأ، بل يشوّه أول 16 بايت فقط. بعض المكتبات تستخدم بصمت IV كلّه أصفار عند عدم تمريره (sm-crypto-v2، وtjfoc/gmsm في Go)، بينما تولّد BouncyCastle في Java قيمة عشوائية — وإذا لم تُحفظ تلك القيمة مع النص المشفّر، فلن يستطيع أحد فكّ شفرته.
ما الفرق بين ECB وCBC في SM4، وأيّهما أستخدم؟
استخدم CBC (أو CTR) مع IV عشوائي جديد لكل رسالة. يحوّل ECB الكتل المتساوية بطول 16 بايت إلى كتل مشفّرة متساوية، فتظهر البنية المتكرّرة في البيانات من خلال النص المشفّر. لا تختر ECB إلا للتخاطب مع نظام يستخدمه أصلًا. ولاحظ أن أيًّا من الوضعين لا يكتشف العبث: فإن كان ذلك مهمًا، فأرسل أيضًا رمز MAC محسوبًا على IV والنص المشفّر، مثلًا باستخدام مولّد HMAC.
أيّ حشو أستخدم مع SM4: PKCS5Padding أم PKCS#7 أم الحشو الصفري أم بدون حشو؟
يضيف PKCS#7 دائمًا من 1 إلى 16 بايت، يحمل كلٌّ منها عدد البايتات المضافة، فيستطيع المستقبِل إزالته دون أي لبس. وفي شفرة كتلية بطول 16 بايت مثل SM4، فإن PKCS5Padding في Java هو الحشو نفسه — إذ تمرّر BouncyCastle الاسمين عبر مسار الكود ذاته. أما الحشو الصفري فيضيف 0x00 حتى حدّ الكتلة التالية فقط. وعند فكّ الشفرة تزيل Hutool وBouncyCastle كل بايتات 0x00 في النهاية، بما فيها الأصفار التي كانت جزءًا حقيقيًا من البيانات، بينما تزيل مكتبة gmssl في Python بايتًا واحدًا فقط. ويتطلّب خيار «بدون حشو» أن يكون الإدخال عددًا صحيحًا من الكتل بطول 16 بايت. أما CTR وCFB وOFB فأوضاع تدفّقية لا تستخدم الحشو أبدًا. إذا انتهى النص بعد فكّ شفرته بمسافات شاردة أو مربّعات أو أسطر جديدة، فالحشو لم يُزَل: بيانات PKCS#7 المفكوكة دون حشو تحتفظ في آخرها بعدد n من البايتات قيمة كلٍّ منها n (وتظهر 0x09 و0x0A و0x0D كمسافات جدولة وأسطر جديدة)؛ حوّل الناتج إلى Hex وانظر إلى الكتلة الأخيرة.
ما طول النص المشفّر في SM4، وهل يمكن معرفة الوضع منه؟
احسب بالبايت. مع PKCS#7 في ECB أو CBC يُقرَّب طول النص الصريح إلى المضاعف التالي للعدد 16، والرسالة التي طولها مضاعف لـ16 أصلًا تحصل على كتلة كاملة إضافية — فتصبح 5 أو 15 بايت 16 بايت، وتصبح 16 بايت 32 بايت. الحشو الصفري يكمل فقط حتى المضاعف التالي لـ16، وخيار بدون حشو يُبقي الطول كما هو، والنص المشفّر في CTR وCFB وOFB بطول النص الصريح تمامًا. ترميز Hex يضاعف عدد البايتات؛ أما Base64 فيأخذ 4 × ⌈عدد البايتات / 3⌉ حرفًا، فتصبح 16 بايت 24 حرفًا، و32 بايت 44 حرفًا، و64 بايت 88 حرفًا. أضف 16 بايت إذا كان IV مُلحقًا في المقدّمة. النص المشفّر وحده لا يكشف الوضع، لكن هناك قرينتين تساعدان: الطول الذي ليس مضاعفًا لـ16 يكاد يستبعد ECB أو CBC مع الحشو، ووجود كتلتين متطابقتين بطول 16 بايت يشير إلى ECB. وإن لم تكن متأكدًا، فالصقه في تبويب فكّ الشفرة وسيجرّب التشخيص التلقائي الأوضاع نيابةً عنك.
هل يعطي SM4 النص المشفّر نفسه في كل مرة، ولماذا يختلف ناتج أداة أخرى؟
يعطي ECB — أو أي وضع مع IV ثابت — النص المشفّر نفسه في كل مرة للمفتاح والنص الصريح نفسيهما؛ أما مع IV عشوائي جديد في كل تشغيل، فيتغيّر الناتج في كل مرة، وهذا هو المطلوب. وبعد ذلك قارن الوضع، والحشو، وهل قُرئ المفتاح كـHex أم كنص، وكيف رُمِّز النص الصريح — UTF-8 في معظم الكود، لكن GBK عندما يستدعي كود Java قديم getBytes() على نظام Windows صيني — وكيف طُبعت النتيجة: Base64 أم Hex بأحرف صغيرة أم Hex بأحرف كبيرة. مع إعدادات متطابقة وIV ثابت، يُنتج أي تنفيذين صحيحين ناتجًا متطابقًا. وإن شككت في إحدى الأداتين، فتحقّق من كلتيهما أولًا مقابل متجه اختبار GB/T 32907.
كيف أتحقّق من صحة تنفيذي الخاص لـSM4؟
ابدأ بالمتجهين الواردين في الملحق A من GB/T 32907-2016. عندما يكون المفتاح والنص الصريح كلاهما 0123456789abcdeffedcba9876543210، يجب أن يُشفَّر النص مرة واحدة إلى 681edf34d206965e86b3e94f536e4246، وأن يصبح بعد مليون مرة متسلسلة 595298c7c6fd271f0402f804c33d3f66. هذان المتجهان يختبران الشفرة الكتلية وحدها، لذا شفّر بعد ذلك نصًا ما بوضع CBC بمفتاح وIV ثابتين، وقارن الناتج بهذه الصفحة أو بأمر OpenSSL الذي تعرضه. المحرّك الذي تقوم عليه هذه الصفحة مُختبَر مقابل المتجهين كليهما، ومقابل OpenSSL 3 في الأوضاع الخمسة جميعها.
هل يستطيع OpenSSL أن يشفّر بخوارزمية SM4 ويفكّ شفرتها؟
نعم. يتضمّن OpenSSL 3 خوارزمية SM4 بأوضاع ECB وCBC وCFB وOFB وCTR. استخدم openssl enc -sm4-cbc -K <32 hex digits> -iv <32 hex digits>: يأخذ -K المفتاح الخام بصيغة Hex، فلا دخل لأي كلمة مرور، ويُلغي -nopad حشو PKCS#7، ويقرأ -base64 -A أو يكتب Base64 في سطر واحد. انتبه لأمرين: -sm4 وحده يعني CBC، وقيمة -K ذات الطول الخاطئ تُقصّ أو تُكمَل بالأصفار مع مجرد تحذير. لوحة OpenSSL في هذه الصفحة تبني الأمر من إعداداتك الحالية؛ وبما أن openssl enc لا يدعم الحشو الصفري، تذكر اللوحة ذلك صراحةً بدل أن تطبع أمرًا لن يطابق النتيجة.
كيف أفكّ شفرة نص SM4 مشفّر قادم من Java (Hutool) أو JavaScript (sm-crypto
اعرف أولًا الوضع والحشو اللذين يستخدمهما الطرف الآخر فعلًا — فالكود كثيرًا لا يصرّح بهما. الدالة SmUtil.sm4(key) في Hutool تمرّر الاسم SM4 فقط، فتكمله BouncyCastle إلى ECB مع PKCS#7 (أي PKCS5Padding في Java)؛ ولا يعني CBC إلا سلسلة كاملة مثل SM4/CBC/PKCS5Padding. وفي JavaScript تعتمد sm-crypto أيضًا ECB افتراضيًا، وتأخذ المفتاح سلسلة Hex من 32 خانة، وتطبع Hex بأحرف صغيرة، بينما تعتمد gm-crypt وضع CBC افتراضيًا، وتأخذ مفتاحًا نصيًا من 16 حرفًا، وتطبع Base64. ثم تحقّق من مجموعة محارف النص الصريح: دوال السلاسل في Hutool تستخدم UTF-8 دائمًا، لكن استدعاء getBytes() المجرّد على JDK 17 أو أقدم في Windows الصيني قد يعني GBK، وهذا يغيّر النص المشفّر. اختر المكتبة من مطابقة افتراضيات مكتبة لضبط كل ذلك بنقرة واحدة، أو أدخل القيم بنفسك؛ وإن لم تكن متأكدًا من إحداها، فالصق النص المشفّر على أي حال وسيجرّب التشخيص التلقائي تركيبات الوضع والحشو وIV والترميز.
هل SM4 آمن، وهل تُرفع بياناتي؟
من حيث الخوارزمية، يستخدم SM4 مفتاحًا بطول 128 بت و32 جولة؛ ويذكر RFC 8998 (2021) أنه لم تكن هناك، وقت كتابته، أي مفاتيح ضعيفة أو مشكلات أمنية معروفة في SM4. المخاطر العملية تأتي من طريقة الاستخدام: ECB يسرّب الأنماط وCBC لا يكتشف العبث. أما هذه الصفحة فلا ترفع شيئًا. المتصفحات لا تتضمّن SM4، لذا تحمل هذه الصفحة تنفيذها الخاص لـSM4 وتشغّله محليًا؛ يمكنك فتح لوحة الشبكة ومشاهدة أنه لا يخرج أي طلب، أو قطع الاتصال ومواصلة استخدام الأداة. وهذا يجعلها مناسبة لبيانات الاختبار وتصحيح الأخطاء والتعلّم. لكنه لا يجعل صفحة ويب المكان المناسب لمفاتيح الإنتاج: فمكانها نظام لإدارة المفاتيح أو وحدة عتادية، لا مربّع نص في أي موقع.
ما الفرق بين SM4 وAES؟
كلاهما شفرة كتلية بكتل طولها 128 بت، والأوضاع والحشو يعملان بالطريقة نفسها في الاثنين — ولهذا تبدو أخطاء التوافق في SM4 مطابقة تمامًا لأخطاء AES. يُجري SM4 ‏32 جولة وله حجم مفتاح واحد هو 128 بت؛ أما AES-128 فيُجري 10 جولات، ولدى AES أيضًا مفاتيح بطول 192 و256 بت. وSM4 هو المعيار الوطني الصيني GB/T 32907-2016، وأصبح منذ 2021 جزءًا من المعيار الدولي ISO/IEC 18033-3 إلى جانب AES؛ ويُستخدم حيث تُشترط التعمية التجارية الصينية. أما AES فهو المعيار FIPS 197 الصادر عن NIST. وللعمل مع AES استخدم أداة شفرة AES.

أدوات ذات صلة

عرض جميع الأدوات →

فك تشفير AES — يدعم OpenSSL/CryptoJS

أدوات الأمن

فك تشفير AES أونلاين — GCM/CBC/CTR، عبارة مرور أو مفتاح خام، يكتشف تلقائيًا صيغة OpenSSL وCryptoJS "U2FsdGVkX1". يعمل 100% داخل المتصفح، والمفاتيح لا تغادر الصفحة أبدًا.

أداة تشفير AESGCM/CBC/CTR

أدوات الأمن

أداة تشفير AES مجانية أونلاين — AES-128/192/256، GCM/CBC/CTR، عبارة مرور (PBKDF2) أو مفتاح خام. تعمل 100% داخل متصفحك؛ لا شيء يُرفع.

مولّد تجزئة bcrypt والتحقق منها

أدوات الأمن

ولّد تجزئات كلمات المرور بـ bcrypt وتحقق منها أونلاين — تكلفة قابلة للضبط، بادئات $2b$/$2a$/$2y$. 100% في متصفحك؛ كلمة مرورك لا تُرفع أبداً.

حاسبة المجموع الاختباري CRC

أدوات الأمن

الصق بيانات ست عشرية أو نصاً واحصل على 63 متغيّراً من CRC-8 وCRC-16 وCRC-32 دفعة واحدة. لديك قيمة تحقق لا تستطيع مطابقتها؟ اكتبها لتسمّي الأداة المتغيّر — MODBUS وCCITT-FALSE وXMODEM وKERMIT. يعمل كلياً داخل متصفحك.

مولّد HMAC ومدقّق التوقيع

أدوات الأمن

مولّد ومدقّق HMAC مجاني أونلاين. احسب HMAC-SHA256/SHA1/SHA384/SHA512 بمفاتيح Text أو Hex أو Base64 وإخراج Hex/Base64/Base64URL. كل شيء داخل متصفحك — المفاتيح لا تغادر الصفحة.

محلّل JWT — فك ترميز الرموز

أدوات الأمن

فك ترميز رموز JWT أونلاين مع محلّل JWT المجاني. افحص الترويسة والحمولة والتوقيع وانتهاء الصلاحية والخوارزمية والمطالبات فوراً. 100% في المتصفح — رمزك لا يغادر جهازك. بلا تسجيل، بلا تتبّع.