Enkripsi / Dekripsi SM4

Enkripsi atau dekripsi dengan SM4 — GB/T 32907-2016, cipher blok 128-bit standar nasional Tiongkok — dalam mode ECB dan CBC dengan padding PKCS#7. Keluarannya kompatibel byte demi byte dengan openssl enc -sm4-ecb / -sm4-cbc. Semuanya berjalan di browser; tidak ada yang diunggah.
Padding PKCS#7 selalu diterapkan, persis seperti enc OpenSSL.
Baca masukan sebagai:
Tulis keluaran sebagai:
Pemeriksaan silang OpenSSL — enkripsi di sini, lalu jalankan openssl enc -d -sm4-cbc -K <hexkey> -iv <hexiv> -in file.sm4 -out file.txt (atau -sm4-ecb tanpa -iv): byte-nya cocok persis, karena halaman ini menerapkan padding PKCS#7 yang sama seperti OpenSSL.
Uji mandiri
Memutar ulang vektor known-answer lampiran A.1 GB/T 32907-2016, enam vektor silang ECB/CBC deterministik yang dihasilkan oleh implementasi referensi Python independen, keempat kumpulan contoh, dan jalur negatif (ukuran kunci salah, ciphertext bukan kelipatan blok, padding yang dimanipulasi harus ditolak).
Apa itu SM4?
Dalam satu kalimat: SM4 adalah cipher blok standar nasional Tiongkok — blok 128-bit, kunci 128-bit, cipher 32 ronde dengan struktur Feistel tak seimbang, diterbitkan sebagai GB/T 32907-2016 (sebelumnya GM/T 0002-2012), memainkan peran dalam rangkaian "SM" Tiongkok yang sama dengan peran AES di dunia NIST.
SM4 vs AES sekilas
AspekSM4AES
Ukuran blok128 bit128 bit
Ukuran kuncihanya 128 bit128 / 192 / 256 bit
Ronde3210 / 12 / 14
StrukturFeistel tak seimbang (satu word 32-bit diperbarui per ronde)jaringan substitusi–permutasi (seluruh keadaan setiap ronde)
S-boxsatu kotak 8×8, digunakan 4× per rondesatu kotak 8×8, 16× per ronde + MixColumns
Mode standarECB, CBC (halaman ini); GCM/CTR di suite TLS (RFC 8998)ECB, CBC, CTR, GCM, ...
Dipublikasikan2012 (GM/T 0002-2012; GB/T 32907-2016); dalam ISO/IEC 18033-3:20102001 (FIPS 197)

Pekerjaan yang sama, desain berbeda: keduanya adalah cipher blok 128-bit dengan S-box 8×8 publik, tetapi SM4 mengiterasi 32 ronde Feistel yang ringan sementara AES menerapkan 10–14 ronde seluruh-keadaan yang lebih berat. Dalam perangkat lunak AES biasanya lebih cepat berkat instruksi perangkat keras (AES-NI); SM4 mencapai posisi yang sebanding dengan ekstensi CPU khusus di platform Tiongkok. Keduanya tidak memiliki serangan praktis; kunci 128-bit tetaplah kunci 128-bit.

Mengapa menggunakan SM4 alih-alih AES?

Kepatuhan dan interop, bukan kekuatan: regulasi kriptografi komersial Tiongkok (商用密码) mewajibkan rangkaian SM di sektor bersertifikat, dan protokol seperti TLCP serta TLS 1.3 dengan suite RFC 8998 menegosiasikan SM4. Jika pihak lawan, regulator, atau perangkat keras Anda hanya berbicara SM4, Anda menggunakan SM4. Jika Anda bebas memilih, AES-256 di halaman AES situs ini tetap menjadi standar global.

Kesalahan umum
  • ECB pada data terstruktur. Blok plaintext yang identik menghasilkan blok ciphertext yang identik — penguin klasik. Gunakan CBC (default halaman ini) dengan IV baru kapan pun data lebih panjang dari satu blok.
  • Kunci berukuran 16 byte, tepat. Tidak seperti AES, SM4 tidak memiliki varian 192/256-bit. Frasa sandi seperti "password" bukan kunci — turunkan dulu dengan KDF (lihat Pembuat Hash Kata Sandi).
  • Mengira padding bersifat opsional. Halaman ini — seperti enc OpenSSL — selalu menerapkan PKCS#7, sehingga plaintext 16 byte terenkripsi menjadi 32 byte. SM4 mentah tanpa padding sengaja tidak ditawarkan.
  • Menggunakan ulang IV dalam CBC. Pasangan kunci+IV yang berulang dalam CBC membocorkan kesamaan awalan pesan. Buat IV acak per pesan dan kirimkan bersama ciphertext.
FAQ

Apakah ini kompatibel dengan OpenSSL? Ya — byte demi byte. openssl enc -sm4-cbc -K 0011... -iv 4455... -in in.txt -out out.sm4 (OpenSSL 1.1.1+) menghasilkan ciphertext persis seperti yang dicetak halaman ini untuk kunci, IV, dan masukan yang sama; GmSSL sama saja.

Mengapa tidak ada SM4-GCM di sini? Ekosistem pustaka yang berdekatan dengan standar umumnya menyediakan SM4-GCM terutama di dalam tumpukan TLS; konvensi baris perintah berorientasi berkas yang dicocokkan halaman ini (enc) mencakup ECB/CBC. SM4 terautentikasi termasuk di lapisan protokol.

Apakah SM4 ada di WebCrypto? Tidak — tidak ada peramban yang mengimplementasikannya. Itulah sebabnya halaman ini menjalankan implementasi dari awal dalam JavaScript, dengan vektor uji standar itu sendiri dihubungkan ke self-test di atas.

Bisakah sesuatu yang dienkripsi di tempat lain didekripsi? Bisa, jika Anda mengetahui mode, kunci, IV, dan bahwa PKCS#7 digunakan — tempel ciphertext sebagai hex atau Base64, ganti ke Dekripsi, lalu jalankan.