SM4 anahtar uzunluğu
16 bayt Tam olarak 128 bit: 16 bayt; 32 hex basamağı veya 16 ASCII karakter olarak yazılır. 192 veya 256 bitlik SM4 anahtarı yoktur.
SM4 ile online şifreleyin ve çözün. Çözülemezse mod, dolgu, IV ve kodlamadan hangisinin yanlış olduğunu bulup düzeltmeyi önerir. Tarayıcıda çalışır, veri yüklenmez. ECB, CBC, CTR, CFB, OFB; PKCS#7, sıfır dolgusu veya dolgusuz.
ECB aynı blokları aynı şifreli metne dönüştürür ve örüntüleri sızdırır — yalnızca bunu şart koşan bir sistemle konuşmak için kullanın.
CTR, CFB ve OFB akış modlarıdır: dolgu yoktur ve şifreli metin düz metinle aynı uzunluktadır.
Otomatik tanı
—
OpenSSL 3 gerektirir. Komut, girdiğiniz anahtarı içerir.
| Anahtar | 0123456789abcdeffedcba9876543210 |
|---|---|
| Düz metin | 0123456789abcdeffedcba9876543210 |
| Şifreli metin, 1 şifreleme | 681edf34d206965e86b3e94f536e4246 |
| Şifreli metin, 1.000.000 şifreleme | 595298c7c6fd271f0402f804c33d3f66 |
Kriptografik araçlar geliştiren yazılımcılar tarafından yazılmış ve incelenmiştir. Bu sayfada geçen her şifreli metin ve bayt sayısı aracın motoruyla hesaplanır ve testlerle kontrol edilir.
16 bayt Tam olarak 128 bit: 16 bayt; 32 hex basamağı veya 16 ASCII karakter olarak yazılır. 192 veya 256 bitlik SM4 anahtarı yoktur.
681edf34d206965e86b3e94f536e4246 Anahtar ve düz metin 0123456789abcdeffedcba9876543210 olduğunda tek şifreleme 681edf34d206965e86b3e94f536e4246 verir.
32 tur 16 baytlık (128 bitlik) bloklar, 32 turda şifrelenir.
ilk 16 bayt Hayır. Yalnızca ilk 16 bayt yanlış çözülür; son bloktaki dolgu ise kontrolden yine geçer.
SM4, Çin'in ticari kriptografi standartlarındaki blok şifresidir. GM/T 0002-2012 olarak yayımlandı, GB/T 32907-2016 numaralı ulusal standart oldu (1 Mart 2017'den beri yürürlükte) ve 2021'de yapılan bir değişiklikle uluslararası ISO/IEC 18033-3 standardına eklendi. Simetrik bir şifredir: aynı 128 bitlik anahtar hem şifreler hem de şifreyi çözer; 128 bitlik bloklar üzerinde, her seferinde 16 bayt işler — AES ile aynı blok boyutu.
İçeride her blok dört adet 32 bitlik sözcüğe bölünür ve 32 turdan geçirilir. Her turda sözcüklerden üçü bir tur anahtarıyla karıştırılır, sonuç 8 bitlik bir S-kutusundan ve doğrusal bir dönüşümden geçirilip dördüncü sözcüğe katılır. 32 tur anahtarı, iki sabit değer kümesi kullanılarak anahtardan türetilir; şifre çözme de tur anahtarlarını ters sırada kullanan aynı hesaplamadır.
Blok şifresi tek başına yalnızca tam 16 baytı işleyebilir; bu yüzden gerçek veri her zaman bir çalışma modundan geçer. Bu araç beş klasik modu sunar: tam bloklarla çalışan ve dolgu gerektiren ECB ile CBC; SM4'ü hiç dolgu gerektirmeyen bir akış şifresine dönüştüren CTR, CFB ve OFB. Başarısız şifre çözmelerin çoğunun SM4'ün kendisiyle ilgisi yoktur — iki tarafın mod, dolgu, IV, metin kodlaması ya da anahtar dizesinin nasıl bayta dönüştüğü konusunda anlaşamamasından kaynaklanır; kütüphaneler çıplak bir "SM4" ifadesinin ne anlama geldiği konusunda bile anlaşamaz.
Tarayıcıların yerleşik Web Crypto API'si SM4 içermez; bu yüzden bu sayfa kendi implementasyonunu taşır ve yerel olarak çalıştırır. Bu implementasyon iki GB/T 32907 test vektörüne karşı test edilmiş ve her modda OpenSSL 3 ile çapraz kontrol edilmiştir.
// 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 Şifre çözme başarısız olduğunda sayfa şifreli metin kodlamasını, anahtar biçimini, modu, IV'yi, dolguyu ve metin kodlamasını yeniden dener ve okunabilir metin veren ayarları gösterir.
Tek tıkla OpenSSL, Hutool, sm-crypto, gm-crypt veya tjfoc/gmsm varsayılanlarını ayarlar — bu kütüphaneler yalın "SM4" ifadesinin ECB mi yoksa CBC mi olduğu konusunda bile anlaşamaz.
PKCS#7, sıfır dolgusu veya dolgusuz olarak ECB, CBC, CTR, CFB ve OFB. Düz metin UTF-8 ya da eski Java kodunun Çince Windows'ta ürettiği kodlama olan GBK olabilir. GCM desteklenmez.
Tek tıkla rastgele 16 baytlık bir anahtar veya IV üretin ya da kodunuzun yazdığı biçimde girin. Canlı bayt sayacı, başka nedenlerin peşine düşmeden önce elinizde tam 16 bayt olduğunu doğrular.
Ek A'daki iki sonuç da bir tabloda yer alır ve tek tıkla yüklenebilir; böylece herhangi bir SM4 implementasyonunu standarda göre kontrol edebilirsiniz.
Her sonuç, onu yeniden üreten openssl enc komutuyla birlikte gelir; böylece sonucu terminalde doğrulayabilir ya da bir iş arkadaşınıza iletebilirsiniz.
SM4 motoru yerel olarak çalışır. Anahtarlar ve veriler sayfadan asla çıkmaz; araç çevrimdışıyken de çalışmaya devam eder.
openssl enc)-sm4 = CBC -sm4, -sm4-cbc için bir takma addır. -K ve -iv hex alır; -nopad verilmedikçe PKCS#7 açık kalır ve -base64 -A eklenmedikçe çıktı ham baytlardır. Yanlış uzunlukta bir -K yalnızca bir uyarıyla kısaltılır ya da sıfırla doldurulur.
SmUtil.sm4(key)Hutool yalın bir SM4 iletir; BouncyCastle bunu PKCS#7 dolgulu ECB olarak çalıştırır (JCE buna PKCS5Padding der). String metotları UTF-8 kullanır ve encryptHex küçük harfli hex yazdırır. CBC için new SM4(Mode.CBC, Padding.PKCS5Padding, key, iv) kullanın.
Cipher.getInstance("SM4")IV gerektiren bir modda IV verilmezse şifreleme sessizce rastgele bir IV üretir, şifre çözme ise no IV set when one expected fırlatır — yani o IV saklanmadan şifrelenmiş bir metin hiçbir yerde çözülemez.
sm4.encrypt(data, key) varsayılan olarak PKCS#7 dolgulu ECB kullanır, anahtarı 32 haneli bir hex dizesi olarak bekler ve küçük harfli hex döndürür. Modu yalnızca mode: 'cbc' değiştirir; başka her değer sessizce ECB'de kalır. sm-crypto-v2 aynı şekilde davranır, ancak CBC'ye iv verilmezse tamamı sıfır bir IV kullanır.
Varsayılan olarak CBC kullanır, anahtarı ve IV'yi 16 karakterlik UTF-8 dizeleri olarak alır ve Base64 döndürür. Baytları geçerli UTF-8 olmayan bir anahtar ona hiç verilemez.
CryptSM4Modu crypt_ecb veya crypt_cbc çağırarak seçersiniz. set_key yalnızca ilk 16 baytı okur; bu yüzden daha uzun bir anahtar sessizce kısaltılır ve yanlış bir anahtar genellikle hata yerine boş bayt döndürür.
sm4Sm4Cbc, SetIV çağrılana kadar tamamı sıfır kalan paket düzeyinde bir IV kullanır, CFB ve OFB'de bile PKCS#7 dolgusu uygular ve dolgu kaldırma hatalarını yok sayar — yanlış bir anahtar hata vermeden nil döndürür.
Anahtar 0123456789abcdeffedcba9876543210, düz metin (hex) 0123456789abcdeffedcba9876543210
681edf34d206965e86b3e94f536e4246
Bu, GB/T 32907-2016 Ek A'daki birinci örnektir: anahtar ve düz metin aynı 128 bitlik değerdir ve tek bir şifreleme 681edf34d206965e86b3e94f536e4246 verir. Her seferinde bir önceki çıktıyı yeniden şifreleyerek toplam bir milyon kez şifrelediğinizde 595298c7c6fd271f0402f804c33d3f66 elde edilir. İki değer de bu sayfadaki test vektörü tablosunda yer alır ve kullandığınız motorun aynısıyla hesaplanmıştır. GB/T 32907 test vektörü düğmesi ilkini yükler.
Anahtar 0123456789abcdeffedcba9876543210, IV fedcba98765432100123456789abcdef, düz metin: SM4 interop test: order 20260911-0042
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y
Düz metin UTF-8 olarak 37 bayttır. PKCS#7 bunu 48 bayta, yani üç adet 16 baytlık bloğa tamamlar; Base64 bu 48 baytı 64 karakterle yazar. Örnek yükle düğmesi tam olarak bu değerleri doldurur, OpenSSL paneli de aynı Base64 dizesini terminalde yeniden üreten bir komut gösterir.
Yukarıdaki şifreli metin, IV 00000000000000000000000000000000 ile çözülüyor
16 bayt anlamsız veri, ardından ": order 20260911-0042"
CBC, IV'yi yalnızca ilk bloğa katar; PKCS#7 dolgusu ise son bloktadır. Bu yüzden dolgu kontrolü yine geçer ve OpenSSL hata vermez. Bu sayfa okunamayan ilk bloğu fark eder ve anahtarla modun doğru, sorunun IV'de olduğunu söyler — ya da şifreli metnin ilk 16 baytının IV'nin kendisi olduğunu.
Karşı taraftaki kütüphaneyi biliyorsanız onu Kütüphane varsayılanları altından seçin. Bilmiyorsanız Şifrele veya Çöz'ü seçip mod ve dolguyu eşleştirin. Akış modlarında (CTR, CFB, OFB) dolgu olmadığı için bu modlarda dolgu seçicisi devre dışıdır.
İkisi de tam olarak 16 bayttır. Dizenin yazıldığı biçimi seçin — hex, metin veya Base64 — ve bayt sayacının yeşile dönmesini izleyin. Rastgele düğmeleri yeni değerler üretir.
Şifreleme için metin yazın (UTF-8 veya GBK) ya da hex baytlar yapıştırın. Şifre çözme için şifreli metni yapıştırın ve Base64 mü hex mi olduğunu belirtin. Sonuç siz yazdıkça güncellenir.
Çıktıyı kopyalayın ya da aynı anahtar ve IV ile şifre çözme sekmesine taşımak için Bu şifreli metni çöz düğmesine tıklayın. OpenSSL paneli sonucu yeniden üreten bir komut gösterir.
Tanı, girdilerinizin okunabilir metne çözüldüğü ayarları listeler. Birini tek tıkla uygulayın; yalnızca ilk 16 bayt çözülmüyorsa nota bakın — bu, IV'ye işaret eder.
32 karakterlik bir hex dizesi yalnızca hex olarak çözüldüğünde 16 bayttır. Metin olarak okunduğunda 32 bayttır ve SM4 bunu reddeder — anahtarları sessizce kısaltan ya da dolduran kodlarda ise bambaşka bir anahtara dönüşür.
Anahtar (metin): 0123456789abcdeffedcba9876543210 -> 32 bayt, reddedildi
Anahtar (hex): 0123456789abcdeffedcba9876543210 -> 16 bayt
İki taraf aynı modu kullanmalıdır. ECB ile çözülen CBC şifreli metni her blokta anlamsız veri verir ve genellikle sondaki dolgu kontrolünden de geçemez.
şifreleme: SM4/CBC/PKCS5Padding çözme: SM4/ECB/PKCS5Padding -> bad decrypt
şifreleme: SM4/CBC/PKCS5Padding çözme: SM4/CBC/PKCS5Padding, aynı IV
CBC'de yanlış IV hata vermez: ilk 16 bayt bozuk çıkar, geri kalanı normal şekilde çözülür. Düz metninizin yalnızca başı bozuksa iki taraftaki IV'yi karşılaştırın.
çözmede kullanılan IV: 00000000000000000000000000000000 -> 16 bayt anlamsız veri + ": order 20260911-0042"
çözmede kullanılan IV: fedcba98765432100123456789abcdef -> "SM4 interop test: order 20260911-0042"
Base64 ve hex, aynı baytları yazmanın iki farklı yoludur. Birini diğeri gibi okumak şifreye en baştan yanlış girdi verir.
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y hex olarak okundu -> geçersiz
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y Base64 olarak okundu -> 48 bayt
Sıfır dolgusu dolguyu veriden ayırt edemez; bu yüzden gerçekten 0x00 ile biten düz metin bu baytları kaybeder. Düz metin olmayan her şey için PKCS#7 kullanın.
sıfır dolgusu: 61 62 00 -> 61 62 olarak çözülür
PKCS#7: 61 62 00 -> 61 62 00 olarak çözülür
OpenSSL sm4 ifadesini CBC olarak yorumlar. BouncyCastle — dolayısıyla Hutool'un SmUtil.sm4(key) çağrısı da — SM4 ifadesini PKCS#7 dolgulu ECB olarak yorumlar. İkisi de "yalnızca SM4 kullanan" iki sistem mod konusunda anlaşamayabilir.
Java: Cipher.getInstance("SM4") -> ECB + PKCS#7
OpenSSL: openssl enc -sm4 -> CBC Java: Cipher.getInstance("SM4/CBC/PKCS5Padding")
OpenSSL: openssl enc -sm4-cbc Java'da karakter seti belirtilmeden çağrılan getBytes() platform varsayılanını kullanır; Çince Windows'ta JDK 17 veya öncesinde bu GBK'dir. Aynı Çince metin böylece farklı bir şifreli metne dönüşür ve karşı taraf onu bozuk karakterlere (mojibake) çözer.
"国密SM4 test".getBytes() // Çince Windows'ta JDK <= 17 ile GBK -> ECB şifreli metni 3188d06cf28db70092f8753cbd5ee518
"国密SM4 test".getBytes(StandardCharsets.UTF_8) -> ECB şifreli metni d830308b0ae4fa7b9a2b5d59f7f65ca5
pay=100.00 değerini pay=900.00 yapar ve şifre çözme yine başarılı olur. IV ve şifreli metin üzerinden bir MAC hesaplayın ve şifreyi çözmeden önce kontrol edin; örneğin HMAC üretici ile.0123456789abcdeffedcba9876543210 hex olarak okunduğunda 16 bayttır, ama aynı dize metin olarak okunduğunda 32 bayttır ve reddedilir. Anahtar alanının yanındaki biçim seçicisi ve bayt sayacı tam da bunu yakalamak için vardır. PKCS5Padding dolgusu da aynı dolgudur — BouncyCastle iki adı da aynı kod yoluna yönlendirir. Sıfır dolgusu yalnızca bir sonraki blok sınırına kadar 0x00 ekler. Şifre çözerken Hutool ve BouncyCastle sondaki bütün 0x00 baytlarını siler, gerçekten verinin parçası olan sıfır baytlar da dahil; Python'daki gmssl ise yalnızca birini siler. Dolgusuz modda girdi, 16 baytlık blokların tam katı olmalıdır. CTR, CFB ve OFB akış modlarıdır ve hiç dolgu kullanmaz. Çözülen metnin sonunda başıboş boşluklar, kutucuklar veya satır sonları varsa dolgu kaldırılmamıştır: PKCS#7 verisi dolgusuz çözülürse sonunda değeri n olan n bayt kalır (0x09, 0x0A ve 0x0D sekme ve satır sonu olarak görünür); çıktıyı Hex'e çevirip son bloğa bakın. getBytes() çağırdığında GBK — ve sonucun nasıl yazdırıldığı: Base64, küçük harfli hex veya büyük harfli hex. Ayarlar aynı ve IV sabitse iki doğru implementasyon birebir aynı çıktıyı üretir. Araçlardan birinden şüpheleniyorsanız önce ikisini de GB/T 32907 test vektörüyle kontrol edin. 0123456789abcdeffedcba9876543210 olduğunda tek şifreleme 681edf34d206965e86b3e94f536e4246, art arda bir milyon şifreleme ise 595298c7c6fd271f0402f804c33d3f66 vermelidir. Bu vektörler yalnızca blok şifresini test eder; bu yüzden ardından sabit bir anahtar ve IV ile CBC'de biraz metin şifreleyin ve sonucu bu sayfayla ya da sayfanın gösterdiği OpenSSL komutuyla karşılaştırın. Bu sayfanın arkasındaki motor, iki vektöre karşı ve beş modun tamamında OpenSSL 3'e karşı test edilmiştir. openssl enc -sm4-cbc -K <32 hex digits> -iv <32 hex digits> kullanın: -K ham anahtarı hex olarak alır, dolayısıyla işin içinde parola yoktur; -nopad PKCS#7'yi kapatır, -base64 -A ise tek satırlık Base64 okur veya yazar. İki şeye dikkat edin: yalın -sm4 CBC anlamına gelir ve yanlış uzunlukta bir -K değeri yalnızca bir uyarıyla kesilir ya da sıfırla doldurulur. Bu sayfadaki OpenSSL paneli komutu mevcut ayarlarınızdan oluşturur; openssl enc sıfır dolgusunu desteklemediği için panel, eşleşmeyecek bir komut yazdırmak yerine bunu açıkça belirtir. SmUtil.sm4(key) çağrısı yalnızca SM4 adını iletir ve BouncyCastle eksikleri PKCS#7 dolgulu ECB ile tamamlar (Java'da PKCS5Padding); yalnızca SM4/CBC/PKCS5Padding gibi tam bir dize CBC anlamına gelir. JavaScript'te sm-crypto da varsayılan olarak ECB kullanır, anahtarı 32 haneli bir hex dizesi olarak alır ve küçük harfli hex yazdırır; gm-crypt ise varsayılan olarak CBC kullanır, 16 karakterlik bir metin anahtarı alır ve Base64 yazdırır. Ardından düz metnin karakter setini kontrol edin: Hutool'un string metotları her zaman UTF-8 kullanır, ama Çince Windows üzerinde JDK 17 veya öncesinde çıplak bir getBytes() GBK anlamına gelebilir ve bu da şifreli metni değiştirir. Bunları tek tıkla ayarlamak için kütüphaneyi Kütüphane varsayılanları altından seçin ya da kendiniz girin; biri belirsizse şifreli metni yine de yapıştırın, otomatik tanı mod, dolgu, IV ve kodlama kombinasyonlarını dener. Güvenlik Araçları
AES şifreli metnini online çözün — GCM/CBC/CTR, parola veya ham anahtar, OpenSSL ve CryptoJS "U2FsdGVkX1" biçimini otomatik algılar. %100 tarayıcıda, anahtarlar sayfadan asla çıkmaz.
Güvenlik Araçları
Ücretsiz online AES şifreleme — AES-128/192/256, GCM/CBC/CTR, parola (PBKDF2) veya ham anahtar. %100 tarayıcınızda çalışır; hiçbir şey yüklenmez.
Güvenlik Araçları
bcrypt şifre karmalarını çevrimiçi oluşturun ve doğrulayın — ayarlanabilir maliyet, $2b$/$2a$/$2y$ önekleri. %100 tarayıcınızda; şifreniz asla yüklenmez.
Güvenlik Araçları
Onaltılık veya metin yapıştırın; CRC-8, CRC-16 ve CRC-32'nin 63 çeşidi aynı anda hesaplansın. Tutturamadığınız bir sağlama toplamı mı var? Yazın, araç çeşidi söylesin: MODBUS, CCITT-FALSE, XMODEM. Tamamen tarayıcınızda çalışır.
Güvenlik Araçları
Ücretsiz online HMAC üretici ve doğrulayıcı. Metin, Hex veya Base64 anahtarlarla ve Hex/Base64/Base64URL çıktısıyla HMAC-SHA256/SHA1/SHA384/SHA512 hesaplayın. %100 tarayıcınızda — anahtarlar sayfadan asla çıkmaz.
Güvenlik Araçları
Ücretsiz JWT çözücümüzle JWT token'larını online çözün. header, payload, signature, son kullanma, algoritma ve claim'leri anında inceleyin. %100 tarayıcıda çalışır — token'ınız cihazınızdan ayrılmaz. Kayıt yok, izleme yok.