Panjang kunci SM4
16 byte Tepat 128 bit: 16 byte, ditulis sebagai 32 digit hex atau 16 karakter ASCII. Tidak ada kunci SM4 192-bit atau 256-bit.
Enkripsi & dekripsi SM4 online. Dekripsi gagal? Alat ini mencari apakah mode, padding, IV, atau encoding yang salah dan memberi perbaikannya. Berjalan di browser, tanpa unggahan. ECB/CBC/CTR/CFB/OFB; PKCS#7, zero, tanpa padding.
ECB mengenkripsi blok yang sama menjadi ciphertext yang sama dan membocorkan pola — pakai hanya untuk berkomunikasi dengan sistem yang mewajibkannya.
CTR, CFB, dan OFB adalah mode stream: tanpa padding, dan panjang ciphertext sama dengan plaintext.
Diagnosis otomatis
—
Memerlukan OpenSSL 3. Perintah ini memuat kunci yang Anda masukkan.
| Kunci | 0123456789abcdeffedcba9876543210 |
|---|---|
| Plaintext | 0123456789abcdeffedcba9876543210 |
| Ciphertext, 1 kali enkripsi | 681edf34d206965e86b3e94f536e4246 |
| Ciphertext, 1.000.000 kali enkripsi | 595298c7c6fd271f0402f804c33d3f66 |
Ditulis dan ditinjau oleh developer yang membangun alat kriptografi. Setiap ciphertext dan jumlah byte yang dikutip di halaman ini dihitung oleh mesin alat ini dan diperiksa oleh pengujian otomatis.
16 byte Tepat 128 bit: 16 byte, ditulis sebagai 32 digit hex atau 16 karakter ASCII. Tidak ada kunci SM4 192-bit atau 256-bit.
681edf34d206965e86b3e94f536e4246 Dengan kunci dan plaintext 0123456789abcdeffedcba9876543210, satu kali enkripsi menghasilkan 681edf34d206965e86b3e94f536e4246.
32 ronde Blok 16 byte (128 bit), dienkripsi dalam 32 ronde.
16 byte pertama Tidak. Hanya 16 byte pertama yang terdekripsi salah, dan padding di blok terakhir tetap lolos pemeriksaan.
SM4 adalah cipher blok dalam standar kriptografi komersial Tiongkok. Algoritma ini diterbitkan sebagai GM/T 0002-2012, menjadi standar nasional GB/T 32907-2016 (berlaku sejak 1 Maret 2017), dan ditambahkan ke standar internasional ISO/IEC 18033-3 melalui amandemen pada 2021. SM4 adalah cipher simetris: kunci 128-bit yang sama dipakai untuk mengenkripsi dan mendekripsi, dan cipher ini memproses blok 128-bit, 16 byte sekaligus — ukuran blok yang sama dengan AES.
Di dalamnya, setiap blok dipecah menjadi empat word 32-bit dan diproses melalui 32 ronde. Setiap ronde mencampur tiga word dengan round key, melewatkan hasilnya ke S-box 8-bit dan transformasi linear, lalu menggabungkannya ke word keempat. Ke-32 round key diturunkan dari kunci dengan dua set konstanta tetap, dan dekripsi adalah perhitungan yang sama dengan urutan round key dibalik.
Cipher blok saja hanya bisa menangani tepat 16 byte, jadi data sungguhan selalu melewati sebuah mode operasi. Alat ini menyediakan lima mode klasik: ECB dan CBC, yang bekerja pada blok utuh dan memerlukan padding, serta CTR, CFB, dan OFB, yang mengubah SM4 menjadi cipher stream tanpa padding sama sekali. Sebagian besar dekripsi yang gagal tidak ada hubungannya dengan SM4 itu sendiri — penyebabnya adalah kedua sisi tidak sepakat soal mode, padding, IV, encoding teks, atau cara string kunci diubah menjadi byte, dan library bahkan tidak sepakat soal arti "SM4" tanpa keterangan tambahan.
Web Crypto API bawaan browser tidak menyertakan SM4, jadi halaman ini membawa implementasinya sendiri dan menjalankannya secara lokal. Implementasi ini diuji terhadap dua vektor uji GB/T 32907 dan dicocokkan silang dengan OpenSSL 3 di setiap mode.
// 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 Saat dekripsi gagal, halaman ini mencoba ulang encoding ciphertext, format kunci, mode, IV, padding, dan encoding teks, lalu menampilkan pengaturan yang menghasilkan teks terbaca.
Satu klik mengatur default OpenSSL, Hutool, sm-crypto, gm-crypt, atau tjfoc/gmsm — library yang bahkan tidak sepakat apakah "SM4" saja berarti ECB atau CBC.
ECB, CBC, CTR, CFB, dan OFB dengan PKCS#7, zero padding, atau tanpa padding. Plaintext bisa UTF-8 atau GBK, encoding yang dihasilkan kode Java lama di Windows berbahasa Tionghoa. GCM tidak didukung.
Buat kunci atau IV 16-byte acak dengan satu klik, atau masukkan persis seperti yang ditulis kode Anda. Penghitung byte langsung memastikan Anda punya tepat 16 byte sebelum mulai memburu penyebab lain.
Kedua hasil Lampiran A tercantum dalam tabel dan bisa dimuat dengan satu klik, sehingga Anda bisa memeriksa implementasi SM4 apa pun terhadap standarnya.
Setiap hasil disertai perintah openssl enc yang mereproduksinya, sehingga Anda bisa memastikannya di terminal atau membagikannya ke rekan kerja.
Mesin SM4 berjalan secara lokal. Kunci dan data tidak pernah meninggalkan halaman, dan alat ini tetap bekerja secara offline.
openssl enc)-sm4 = CBC -sm4 adalah alias dari -sm4-cbc. -K dan -iv menerima hex, PKCS#7 tetap aktif kecuali Anda memberi -nopad, dan output berupa byte mentah kecuali Anda menambahkan -base64 -A. Nilai -K dengan panjang yang salah dipotong atau diisi nol dengan hanya sebuah peringatan.
SmUtil.sm4(key)Hutool meneruskan SM4 saja, yang dijalankan BouncyCastle sebagai ECB dengan PKCS#7 (JCE menyebutnya PKCS5Padding). Method string memakai UTF-8 dan encryptHex mencetak hex huruf kecil. Untuk CBC, gunakan new SM4(Mode.CBC, Padding.PKCS5Padding, key, iv).
Cipher.getInstance("SM4")Pada mode yang memerlukan IV tetapi tidak diberi IV, enkripsi diam-diam membuat IV acak dan dekripsi melempar no IV set when one expected — jadi ciphertext yang dienkripsi tanpa menyimpan IV tersebut tidak bisa didekripsi di mana pun.
sm4.encrypt(data, key) default ke ECB dengan PKCS#7, mengharapkan kunci berupa string hex 32 digit, dan mengembalikan hex huruf kecil. Hanya mode: 'cbc' yang mengubah mode; nilai lain apa pun diam-diam tetap ECB. sm-crypto-v2 berperilaku sama, tetapi memakai IV serba nol jika CBC tidak diberi iv.
Default ke CBC, menerima kunci dan IV berupa string UTF-8 16 karakter, dan mengembalikan Base64. Kunci yang byte-nya bukan UTF-8 valid sama sekali tidak bisa diberikan ke library ini.
CryptSM4Anda memilih mode dengan memanggil crypt_ecb atau crypt_cbc. set_key hanya membaca 16 byte pertama, jadi kunci yang lebih panjang diam-diam terpotong, dan kunci yang salah biasanya mengembalikan byte kosong alih-alih error.
sm4Sm4Cbc memakai IV tingkat package yang tetap serba nol sampai SetIV dipanggil, memberi padding PKCS#7 bahkan pada CFB dan OFB, dan mengabaikan error unpadding — kunci yang salah mengembalikan nil tanpa error.
Kunci 0123456789abcdeffedcba9876543210, plaintext (hex) 0123456789abcdeffedcba9876543210
681edf34d206965e86b3e94f536e4246
Ini adalah contoh 1 dari Lampiran A GB/T 32907-2016: kunci dan plaintext bernilai 128-bit yang sama, dan satu kali enkripsi menghasilkan 681edf34d206965e86b3e94f536e4246. Mengenkripsi output itu lagi dan lagi, total satu juta kali, menghasilkan 595298c7c6fd271f0402f804c33d3f66. Kedua nilai tercantum di tabel vektor uji di halaman ini, dihitung oleh mesin yang sama dengan yang sedang Anda pakai. Tombol Vektor uji GB/T 32907 memuat vektor yang pertama.
Kunci 0123456789abcdeffedcba9876543210, IV fedcba98765432100123456789abcdef, plaintext: SM4 interop test: order 20260911-0042
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y
Plaintext-nya berukuran 37 byte UTF-8. PKCS#7 menambahkan padding hingga 48 byte, yaitu tiga blok 16-byte, yang ditulis Base64 sebagai 64 karakter. Tombol Muat contoh mengisi persis nilai-nilai ini, dan panel OpenSSL menampilkan perintah yang menghasilkan string Base64 yang sama di terminal.
Ciphertext di atas, didekripsi dengan IV 00000000000000000000000000000000
16 byte rusak, lalu ": order 20260911-0042"
CBC hanya mencampurkan IV ke blok pertama, sedangkan padding PKCS#7 berada di blok terakhir, sehingga pemeriksaan padding tetap lolos dan OpenSSL tidak memunculkan error. Halaman ini mendeteksi blok pertama yang tidak terbaca dan memberi tahu bahwa kunci dan mode sudah benar dan IV-lah masalahnya — atau bahwa 16 byte pertama ciphertext itu sendiri adalah IV.
Jika Anda tahu library di sisi lain, pilih di Cocokkan dengan default. Jika tidak, pilih Enkripsi atau Dekripsi, lalu samakan mode dan padding. Mode stream (CTR, CFB, OFB) tidak memakai padding, jadi pemilih padding dinonaktifkan untuk mode tersebut.
Keduanya tepat 16 byte. Pilih format penulisan string-nya — hex, teks, atau Base64 — dan pastikan penghitung byte berubah hijau. Tombol Acak membuat nilai baru.
Untuk enkripsi, ketik teks (UTF-8 atau GBK) atau tempelkan byte hex. Untuk dekripsi, tempelkan ciphertext dan tentukan apakah formatnya Base64 atau hex. Hasilnya diperbarui saat Anda mengetik.
Salin output-nya, atau klik Dekripsi ciphertext ini untuk membawanya ke tab dekripsi dengan kunci dan IV yang sama. Panel OpenSSL menampilkan perintah yang mereproduksi hasilnya.
Diagnosis menampilkan pengaturan yang membuat input Anda terdekripsi menjadi teks terbaca. Terapkan salah satunya dengan satu klik, atau baca catatannya jika hanya 16 byte pertama yang gagal — itu menunjuk ke IV.
String hex 32 karakter hanya berukuran 16 byte jika di-decode sebagai hex. Jika dibaca sebagai teks, ukurannya 32 byte dan ditolak SM4 — atau, pada kode yang diam-diam memotong atau mengisi kunci, menjadi kunci yang sama sekali berbeda.
Kunci (teks): 0123456789abcdeffedcba9876543210 -> 32 byte, ditolak
Kunci (hex): 0123456789abcdeffedcba9876543210 -> 16 byte
Kedua sisi harus memakai mode yang sama. Ciphertext CBC yang didekripsi sebagai ECB menghasilkan data acak di setiap blok, dan biasanya gagal pemeriksaan padding di akhir.
enkripsi: SM4/CBC/PKCS5Padding dekripsi: SM4/ECB/PKCS5Padding -> bad decrypt
enkripsi: SM4/CBC/PKCS5Padding dekripsi: SM4/CBC/PKCS5Padding, IV sama
Pada CBC, IV yang salah tidak memunculkan error: 16 byte pertama keluar rusak dan sisanya terdekripsi normal. Jika hanya awal plaintext Anda yang rusak, bandingkan IV-nya.
IV dekripsi 00000000000000000000000000000000 -> 16 byte rusak + ": order 20260911-0042"
IV dekripsi fedcba98765432100123456789abcdef -> "SM4 interop test: order 20260911-0042"
Base64 dan hex adalah dua cara menulis byte yang sama. Membaca yang satu sebagai yang lain membuat cipher menerima input yang salah sejak awal.
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y dibaca sebagai hex -> tidak valid
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y dibaca sebagai Base64 -> 48 byte
Zero padding tidak bisa membedakan padding dari data, sehingga plaintext yang memang diakhiri 0x00 kehilangan byte tersebut. Gunakan PKCS#7 untuk apa pun yang bukan teks biasa.
zero padding: 61 62 00 -> terdekripsi menjadi 61 62
PKCS#7: 61 62 00 -> terdekripsi menjadi 61 62 00
OpenSSL memperlakukan sm4 sebagai CBC. BouncyCastle — dan karena itu juga SmUtil.sm4(key) milik Hutool — memperlakukan SM4 sebagai ECB dengan PKCS#7. Dua sistem yang sama-sama "cukup pakai SM4" bisa berbeda mode.
Java: Cipher.getInstance("SM4") -> ECB + PKCS#7
OpenSSL: openssl enc -sm4 -> CBC Java: Cipher.getInstance("SM4/CBC/PKCS5Padding")
OpenSSL: openssl enc -sm4-cbc getBytes() di Java tanpa charset memakai default platform, yaitu GBK pada JDK 17 atau lebih lama di Windows berbahasa Tionghoa. Teks Tionghoa yang sama lalu terenkripsi menjadi ciphertext yang berbeda, dan sisi lain mendekripsinya menjadi mojibake.
"国密SM4 test".getBytes() // GBK di Windows berbahasa Tionghoa, JDK <= 17 -> ciphertext ECB 3188d06cf28db70092f8753cbd5ee518
"国密SM4 test".getBytes(StandardCharsets.UTF_8) -> ciphertext ECB d830308b0ae4fa7b9a2b5d59f7f65ca5
pay=100.00 menjadi pay=900.00 dan dekripsi tetap berhasil. Hitung MAC atas IV dan ciphertext lalu periksa sebelum mendekripsi, misalnya dengan generator HMAC.0123456789abcdeffedcba9876543210 yang dibaca sebagai hex berukuran 16 byte, tetapi string yang sama jika dibaca sebagai teks berukuran 32 byte dan ditolak. Pemilih format dan penghitung byte di sebelah kolom kunci ada untuk menangkap persis kesalahan ini. PKCS5Padding di Java adalah padding yang sama — BouncyCastle memproses kedua nama itu lewat jalur kode yang sama. Zero padding menambahkan 0x00 hanya sampai batas blok berikutnya. Saat dekripsi, Hutool dan BouncyCastle membuang semua 0x00 di akhir, termasuk byte nol yang sebenarnya bagian dari data, sementara gmssl di Python hanya membuang satu. Tanpa padding, input harus berupa kelipatan utuh blok 16-byte. CTR, CFB, dan OFB adalah mode stream dan tidak pernah memakai padding. Jika teks hasil dekripsi diakhiri spasi, kotak, atau baris baru yang tidak semestinya, padding-nya belum dibuang: data PKCS#7 yang didekripsi tanpa padding menyisakan n byte bernilai n di akhir (0x09, 0x0A, dan 0x0D tampil sebagai tab dan baris baru); ganti output ke Hex dan periksa blok terakhirnya. getBytes() di sistem Windows berbahasa Tionghoa — dan bagaimana hasilnya dicetak: Base64, hex huruf kecil, atau hex huruf besar. Dengan pengaturan identik dan IV tetap, dua implementasi yang benar menghasilkan output yang identik. Jika Anda mencurigai salah satu alat, uji keduanya lebih dulu dengan vektor uji GB/T 32907. 0123456789abcdeffedcba9876543210, satu kali enkripsi harus menghasilkan 681edf34d206965e86b3e94f536e4246, dan satu juta enkripsi berantai harus menghasilkan 595298c7c6fd271f0402f804c33d3f66. Keduanya hanya menguji cipher bloknya, jadi selanjutnya enkripsi sebuah teks dalam CBC dengan kunci dan IV tetap, lalu bandingkan dengan halaman ini atau dengan perintah OpenSSL yang ditampilkannya. Mesin di balik halaman ini diuji terhadap kedua vektor tersebut dan terhadap OpenSSL 3 di kelima mode. openssl enc -sm4-cbc -K <32 hex digits> -iv <32 hex digits>: -K menerima kunci mentah dalam hex, jadi tidak ada kata sandi yang terlibat, -nopad mematikan PKCS#7, dan -base64 -A membaca atau menulis Base64 satu baris. Waspadai dua hal: -sm4 saja berarti CBC, dan nilai -K dengan panjang yang salah akan dipotong atau diisi nol dengan hanya sebuah peringatan. Panel OpenSSL di halaman ini menyusun perintah dari pengaturan Anda saat ini; openssl enc tidak punya zero padding, jadi panel ini menyatakan hal itu alih-alih mencetak perintah yang hasilnya tidak akan cocok. SmUtil.sm4(key) milik Hutool hanya meneruskan nama SM4, dan BouncyCastle mengisinya dengan ECB dengan PKCS#7 (PKCS5Padding di Java); hanya string lengkap seperti SM4/CBC/PKCS5Padding yang berarti CBC. Di JavaScript, sm-crypto juga default ke ECB, menerima kunci sebagai string hex 32 digit, dan mencetak hex huruf kecil, sedangkan gm-crypt default ke CBC, menerima kunci teks 16 karakter, dan mencetak Base64. Lalu periksa charset plaintext: method string Hutool selalu memakai UTF-8, tetapi getBytes() tanpa argumen pada JDK 17 atau lebih lama di Windows berbahasa Tionghoa bisa berarti GBK, yang mengubah ciphertext. Pilih library-nya di Cocokkan dengan default untuk mengatur semua ini dalam satu klik, atau masukkan sendiri; jika ada yang belum pasti, tetap tempelkan ciphertext-nya dan diagnosis otomatis akan mencoba kombinasi mode, padding, IV, dan encoding. Alat Keamanan
Dekripsi AES online — GCM/CBC/CTR, frasa sandi atau kunci mentah, otomatis mendeteksi format OpenSSL & CryptoJS "U2FsdGVkX1". 100% di browser, kunci tidak pernah meninggalkan halaman.
Alat Keamanan
Enkripsi AES online gratis — AES-128/192/256, GCM/CBC/CTR, frasa sandi (PBKDF2) atau kunci mentah. Berjalan 100% di browser Anda; tidak ada yang diunggah.
Alat Keamanan
Buat dan verifikasi hash kata sandi bcrypt online — biaya yang dapat diatur, prefiks $2b$/$2a$/$2y$. 100% di browser Anda; kata sandi tidak pernah diunggah.
Alat Keamanan
Tempel data hex atau teks dan dapatkan 63 varian CRC-8, CRC-16, dan CRC-32 sekaligus. Punya checksum yang tidak bisa dicocokkan? Masukkan nilainya dan alat ini menyebut nama variannya — MODBUS, CCITT-FALSE, XMODEM, KERMIT.
Alat Keamanan
Generator dan verifikator HMAC online gratis. Hitung HMAC-SHA256/SHA1/SHA384/SHA512 dengan kunci Teks, Hex, atau Base64 dan output Hex/Base64/Base64URL. 100% di browser Anda — kunci tidak pernah meninggalkan halaman.
Alat Keamanan
Dekode token JWT online dengan dekoder JWT gratis kami. Periksa header, payload, tanda tangan, kedaluwarsa, dan klaim secara instan. 100% browser — token Anda tidak meninggalkan perangkat. Tanpa pendaftaran, tanpa pelacakan.