SM4-Schlüssellänge
16 Byte Genau 128 Bit: 16 Byte, geschrieben als 32 Hex-Ziffern oder 16 ASCII-Zeichen. SM4-Schlüssel mit 192 oder 256 Bit gibt es nicht.
SM4 online ver- und entschlüsseln. Scheitert das Entschlüsseln, findet das Tool den Fehler — Modus, Padding, IV oder Kodierung — samt Lösung. Läuft im Browser, kein Upload. ECB, CBC, CTR, CFB, OFB; PKCS#7, Zero oder kein Padding.
ECB verschlüsselt gleiche Blöcke zu gleichem Chiffretext und verrät Muster — verwenden Sie es nur, um mit einem System zu kommunizieren, das es voraussetzt.
CTR, CFB und OFB sind Stream-Modi: kein Padding, und der Chiffretext ist genauso lang wie der Klartext.
Automatische Diagnose
—
Erfordert OpenSSL 3. Der Befehl enthält den eingegebenen Schlüssel.
| Schlüssel | 0123456789abcdeffedcba9876543210 |
|---|---|
| Klartext | 0123456789abcdeffedcba9876543210 |
| Chiffretext, 1 Verschlüsselung | 681edf34d206965e86b3e94f536e4246 |
| Chiffretext, 1.000.000 Verschlüsselungen | 595298c7c6fd271f0402f804c33d3f66 |
Geschrieben und geprüft von Entwicklerinnen und Entwicklern, die Kryptografie-Tools bauen. Jeder Chiffretext und jede Byteanzahl auf dieser Seite wird von der Engine des Tools berechnet und durch Tests überprüft.
16 Byte Genau 128 Bit: 16 Byte, geschrieben als 32 Hex-Ziffern oder 16 ASCII-Zeichen. SM4-Schlüssel mit 192 oder 256 Bit gibt es nicht.
681edf34d206965e86b3e94f536e4246 Mit Schlüssel und Klartext 0123456789abcdeffedcba9876543210 ergibt eine Verschlüsselung 681edf34d206965e86b3e94f536e4246.
32 Runden Blöcke mit 16 Byte (128 Bit), verschlüsselt in 32 Runden.
ersten 16 Byte Nein. Nur die ersten 16 Byte werden falsch entschlüsselt, und das Padding im letzten Block ist weiterhin gültig.
SM4 ist die Blockchiffre der chinesischen Standards für kommerzielle Kryptografie. Sie wurde als GM/T 0002-2012 herausgegeben, wurde zum nationalen Standard GB/T 32907-2016 (in Kraft seit dem 1. März 2017) und 2021 per Änderung in den internationalen Standard ISO/IEC 18033-3 aufgenommen. Es handelt sich um eine symmetrische Chiffre: Derselbe 128-Bit-Schlüssel ver- und entschlüsselt, und sie arbeitet auf 128-Bit-Blöcken, also 16 Byte auf einmal — dieselbe Blockgröße wie bei AES.
Intern wird jeder Block in vier 32-Bit-Wörter aufgeteilt und durch 32 Runden geschickt. Jede Runde verknüpft drei der Wörter mit einem Rundenschlüssel, schickt das Ergebnis durch eine 8-Bit-S-Box und eine lineare Transformation und faltet es in das vierte Wort ein. Die 32 Rundenschlüssel werden mit zwei festen Konstantensätzen aus dem Schlüssel abgeleitet, und die Entschlüsselung ist dieselbe Berechnung mit den Rundenschlüsseln in umgekehrter Reihenfolge.
Die Blockchiffre allein verarbeitet nur exakt 16 Byte, deshalb laufen echte Daten immer durch einen Betriebsmodus. Dieses Tool bietet die fünf klassischen an: ECB und CBC, die auf ganzen Blöcken arbeiten und Padding brauchen, sowie CTR, CFB und OFB, die SM4 in eine Stromchiffre ganz ohne Padding verwandeln. Die meisten gescheiterten Entschlüsselungen haben mit SM4 selbst nichts zu tun — sie entstehen, weil sich beide Seiten bei Modus, Padding, IV, Textkodierung oder der Umwandlung des Schlüsselstrings in Bytes nicht einig sind, und die Bibliotheken sind sich nicht einmal einig, was ein bloßes „SM4“ bedeutet.
Die im Browser eingebaute Web Crypto API enthält kein SM4, deshalb bringt diese Seite ihre eigene Implementierung mit und führt sie lokal aus. Sie ist gegen die beiden Testvektoren aus GB/T 32907 getestet und in jedem Modus mit OpenSSL 3 abgeglichen.
// 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 Scheitert die Entschlüsselung, probiert die Seite Chiffretext-Kodierung, Schlüsselformat, Modus, IV, Padding und Textkodierung durch und zeigt die Einstellungen, die lesbaren Text ergeben.
Ein Klick übernimmt die Standardwerte von OpenSSL, Hutool, sm-crypto, gm-crypt oder tjfoc/gmsm — Bibliotheken, die sich nicht einmal einig sind, ob ein bloßes „SM4“ ECB oder CBC bedeutet.
ECB, CBC, CTR, CFB und OFB mit PKCS#7, Zero-Padding oder ohne Padding. Der Klartext kann UTF-8 oder GBK sein — die Kodierung, die älterer Java-Code unter chinesischem Windows erzeugt. GCM wird nicht unterstützt.
Erzeugen Sie per Klick einen zufälligen 16-Byte-Schlüssel oder -IV, oder geben Sie ihn so ein, wie Ihr Code ihn schreibt. Ein Live-Byte-Zähler bestätigt genau 16 Byte, bevor Sie anderen Ursachen nachjagen.
Beide Ergebnisse aus Anhang A stehen in einer Tabelle und lassen sich per Klick laden, sodass Sie jede SM4-Implementierung gegen den Standard prüfen können.
Zu jedem Ergebnis gibt es den openssl enc-Befehl, der es reproduziert — zum Bestätigen im Terminal oder zum Weitergeben an Kollegen.
Die SM4-Engine läuft lokal. Schlüssel und Daten verlassen die Seite nie, und das Tool funktioniert auch offline.
openssl enc)-sm4 = CBC -sm4 ist ein Alias für -sm4-cbc. -K und -iv erwarten Hex, PKCS#7 bleibt aktiv, solange Sie nicht -nopad angeben, und die Ausgabe besteht aus rohen Bytes, sofern Sie nicht -base64 -A hinzufügen. Ein -K mit falscher Länge wird nur mit einer Warnung gekürzt oder mit Nullen aufgefüllt.
SmUtil.sm4(key)Hutool übergibt ein bloßes SM4, das BouncyCastle als ECB mit PKCS#7 ausführt (JCE nennt es PKCS5Padding). Die String-Methoden verwenden UTF-8, und encryptHex gibt Hex in Kleinbuchstaben aus. Für CBC verwenden Sie new SM4(Mode.CBC, Padding.PKCS5Padding, key, iv).
Cipher.getInstance("SM4")In einem Modus, der einen IV braucht, aber keinen bekommt, erzeugt die Verschlüsselung stillschweigend einen zufälligen IV, und die Entschlüsselung wirft no IV set when one expected — Chiffretext, bei dem dieser IV nicht gespeichert wurde, lässt sich deshalb nirgends mehr entschlüsseln.
sm4.encrypt(data, key) verwendet standardmäßig ECB mit PKCS#7, erwartet den Schlüssel als 32-stelligen Hex-String und gibt Hex in Kleinbuchstaben zurück. Nur mode: 'cbc' ändert den Modus; jeder andere Wert bleibt stillschweigend bei ECB. sm-crypto-v2 verhält sich genauso, verwendet bei CBC ohne iv aber einen Null-IV.
Verwendet standardmäßig CBC, erwartet Schlüssel und IV als UTF-8-Strings mit 16 Zeichen und gibt Base64 zurück. Ein Schlüssel, dessen Bytes kein gültiges UTF-8 sind, lässt sich gar nicht erst übergeben.
CryptSM4Den Modus wählen Sie, indem Sie crypt_ecb oder crypt_cbc aufrufen. set_key liest nur die ersten 16 Byte, ein längerer Schlüssel wird also stillschweigend gekürzt, und ein falscher Schlüssel liefert meist leere Bytes statt eines Fehlers.
sm4Sm4Cbc verwendet einen IV auf Paketebene, der aus lauter Nullen besteht, bis SetIV aufgerufen wird, füllt selbst in CFB und OFB mit PKCS#7 auf und verwirft Fehler beim Entfernen des Paddings — ein falscher Schlüssel liefert nil ohne Fehler.
Schlüssel 0123456789abcdeffedcba9876543210, Klartext (Hex) 0123456789abcdeffedcba9876543210
681edf34d206965e86b3e94f536e4246
Dies ist Beispiel 1 aus Anhang A von GB/T 32907-2016: Schlüssel und Klartext sind derselbe 128-Bit-Wert, und eine Verschlüsselung ergibt 681edf34d206965e86b3e94f536e4246. Wird diese Ausgabe immer wieder verschlüsselt, insgesamt eine Million Mal, ergibt sich 595298c7c6fd271f0402f804c33d3f66. Beide Werte stehen in der Testvektor-Tabelle auf dieser Seite, berechnet von derselben Engine, die Sie gerade verwenden. Die Schaltfläche Testvektor GB/T 32907 lädt den ersten.
Schlüssel 0123456789abcdeffedcba9876543210, IV fedcba98765432100123456789abcdef, Klartext: SM4 interop test: order 20260911-0042
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y
Der Klartext umfasst 37 Byte UTF-8. PKCS#7 füllt ihn auf 48 Byte auf, also drei 16-Byte-Blöcke, die Base64 als 64 Zeichen schreibt. Die Schaltfläche Beispiel laden trägt genau diese Werte ein, und der OpenSSL-Bereich zeigt einen Befehl, der im Terminal denselben Base64-String erzeugt.
Der Chiffretext von oben, entschlüsselt mit IV 00000000000000000000000000000000
16 Byte Datenmüll, dann ": order 20260911-0042"
CBC mischt den IV nur in den ersten Block ein, und das PKCS#7-Padding steht im letzten Block — die Padding-Prüfung besteht also weiterhin, und OpenSSL meldet keinen Fehler. Diese Seite bemerkt den unlesbaren ersten Block und sagt Ihnen, dass Schlüssel und Modus stimmen und der IV das Problem ist — oder dass die ersten 16 Byte des Chiffretexts selbst der IV sind.
Kennen Sie die Bibliothek auf der Gegenseite, wählen Sie sie unter „Standardwerte übernehmen von“. Andernfalls wählen Sie Verschlüsseln oder Entschlüsseln und stellen Modus und Padding passend ein. Stream-Modi (CTR, CFB, OFB) haben kein Padding, deshalb ist die Padding-Auswahl für sie deaktiviert.
Beide sind genau 16 Byte lang. Wählen Sie das Format, in dem die Zeichenkette geschrieben ist — Hex, Text oder Base64 — und achten Sie darauf, dass der Byte-Zähler grün wird. Die Schaltflächen „Zufällig“ erzeugen neue Werte.
Zum Verschlüsseln geben Sie Text (UTF-8 oder GBK) ein oder fügen Hex-Bytes ein. Zum Entschlüsseln fügen Sie den Chiffretext ein und geben an, ob er Base64 oder Hex ist. Das Ergebnis aktualisiert sich während der Eingabe.
Kopieren Sie die Ausgabe, oder klicken Sie auf „Diesen Chiffretext entschlüsseln“, um ihn mit demselben Schlüssel und IV in den Tab „Entschlüsseln“ zu übernehmen. Der OpenSSL-Bereich zeigt einen Befehl, der das Ergebnis reproduziert.
Die Diagnose listet die Einstellungen auf, unter denen Ihre Eingaben zu lesbarem Text entschlüsselt werden. Übernehmen Sie eine davon per Klick, oder lesen Sie den Hinweis, falls nur die ersten 16 Byte scheitern — das deutet auf den IV.
Ein 32-stelliger Hex-String ist nur dann 16 Byte lang, wenn er als Hex dekodiert wird. Als Text gelesen sind es 32 Byte, die SM4 ablehnt — oder, in Code, der Schlüssel stillschweigend kürzt oder auffüllt, ein ganz anderer Schlüssel.
Schlüssel (Text): 0123456789abcdeffedcba9876543210 -> 32 Byte, abgelehnt
Schlüssel (Hex): 0123456789abcdeffedcba9876543210 -> 16 Byte
Beide Seiten müssen denselben Modus verwenden. CBC-Chiffretext, der als ECB entschlüsselt wird, ergibt in jedem Block Datenmüll und scheitert meist an der Padding-Prüfung am Ende.
verschlüsseln: SM4/CBC/PKCS5Padding entschlüsseln: SM4/ECB/PKCS5Padding -> bad decrypt
verschlüsseln: SM4/CBC/PKCS5Padding entschlüsseln: SM4/CBC/PKCS5Padding, gleicher IV
Bei CBC löst ein falscher IV keinen Fehler aus: Die ersten 16 Byte kommen verstümmelt heraus, der Rest wird normal entschlüsselt. Ist nur der Anfang Ihres Klartexts kaputt, vergleichen Sie die IVs.
entschlüsseln mit IV 00000000000000000000000000000000 -> 16 Byte Datenmüll + ": order 20260911-0042"
entschlüsseln mit IV fedcba98765432100123456789abcdef -> "SM4 interop test: order 20260911-0042"
Base64 und Hex sind zwei Schreibweisen für dieselben Bytes. Wird das eine als das andere gelesen, bekommt die Chiffre von Anfang an die falsche Eingabe.
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y als Hex gelesen -> ungültig
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y als Base64 gelesen -> 48 Byte
Zero-Padding kann Padding nicht von Daten unterscheiden, deshalb verliert Klartext, der tatsächlich auf 0x00 endet, diese Bytes. Verwenden Sie PKCS#7 für alles, was kein reiner Text ist.
Zero-Padding: 61 62 00 -> entschlüsselt zu 61 62
PKCS#7: 61 62 00 -> entschlüsselt zu 61 62 00
OpenSSL behandelt sm4 als CBC. BouncyCastle — und damit auch SmUtil.sm4(key) von Hutool — behandelt SM4 als ECB mit PKCS#7. Zwei Systeme, die beide „einfach SM4 verwenden“, können sich beim Modus uneinig sein.
Java: Cipher.getInstance("SM4") -> ECB + PKCS#7
OpenSSL: openssl enc -sm4 -> CBC Java: Cipher.getInstance("SM4/CBC/PKCS5Padding")
OpenSSL: openssl enc -sm4-cbc getBytes() ohne Zeichensatz verwendet in Java den Plattform-Standard, und der ist unter chinesischem Windows mit JDK 17 oder älter GBK. Derselbe chinesische Text wird dann zu anderem Chiffretext, und die Gegenseite entschlüsselt ihn zu Mojibake (Zeichensalat).
"国密SM4 test".getBytes() // GBK unter chinesischem Windows, JDK <= 17 -> ECB-Chiffretext 3188d06cf28db70092f8753cbd5ee518
"国密SM4 test".getBytes(StandardCharsets.UTF_8) -> ECB-Chiffretext d830308b0ae4fa7b9a2b5d59f7f65ca5
pay=100.00 ein pay=900.00, und die Entschlüsselung gelingt trotzdem. Berechnen Sie einen MAC über IV und Chiffretext und prüfen Sie ihn vor dem Entschlüsseln, zum Beispiel mit dem HMAC-Generator.0123456789abcdeffedcba9876543210 als Hex gelesen sind 16 Byte, dieselbe Zeichenkette als Text gelesen aber 32 Byte — und wird abgelehnt. Genau dafür gibt es die Formatauswahl und den Byte-Zähler neben dem Schlüsselfeld. PKCS5Padding aus Java genau dasselbe Padding — BouncyCastle schickt beide Namen durch denselben Codepfad. Zero-Padding hängt 0x00 nur bis zur nächsten Blockgrenze an. Beim Entschlüsseln entfernen Hutool und BouncyCastle alle abschließenden 0x00, auch Nullbytes, die eigentlich zu den Daten gehörten, während gmssl für Python nur eines entfernt. Ohne Padding muss die Eingabe aus ganzen 16-Byte-Blöcken bestehen. CTR, CFB und OFB sind Stream-Modi und verwenden nie Padding. Endet der entschlüsselte Text auf verirrte Leerzeichen, Kästchen oder Zeilenumbrüche, wurde das Padding nicht entfernt: PKCS#7-Daten, die ohne Padding entschlüsselt werden, behalten am Ende n Bytes mit dem Wert n (0x09, 0x0A und 0x0D erscheinen als Tabulatoren und Zeilenumbrüche); stellen Sie die Ausgabe auf Hex um und sehen Sie sich den letzten Block an. getBytes() aufruft — und wie das Ergebnis ausgegeben wird: Base64, Hex in Klein- oder in Großbuchstaben. Bei identischen Einstellungen und festem IV liefern zwei korrekte Implementierungen identische Ausgaben. Haben Sie eines der Tools im Verdacht, prüfen Sie zuerst beide gegen den Testvektor aus GB/T 32907. 0123456789abcdeffedcba9876543210, muss eine Verschlüsselung 681edf34d206965e86b3e94f536e4246 ergeben und eine Million verkettete Verschlüsselungen 595298c7c6fd271f0402f804c33d3f66. Diese Vektoren testen nur die Blockchiffre selbst; verschlüsseln Sie deshalb als Nächstes einen Text in CBC mit festem Schlüssel und IV und vergleichen Sie das Ergebnis mit dieser Seite oder mit dem angezeigten OpenSSL-Befehl. Die Engine hinter dieser Seite ist gegen beide Vektoren und in allen fünf Modi gegen OpenSSL 3 getestet. openssl enc -sm4-cbc -K <32 hex digits> -iv <32 hex digits>: -K erwartet den rohen Schlüssel als Hex, es ist also kein Passwort im Spiel, -nopad schaltet PKCS#7 ab, und -base64 -A liest oder schreibt einzeiliges Base64. Achten Sie auf zwei Dinge: Ein bloßes -sm4 bedeutet CBC, und ein -K-Wert mit falscher Länge wird nur mit einer Warnung gekürzt oder mit Nullen aufgefüllt. Der OpenSSL-Bereich auf dieser Seite baut den Befehl aus Ihren aktuellen Einstellungen; openssl enc kennt kein Zero-Padding, deshalb weist der Bereich darauf hin, statt einen Befehl auszugeben, der nicht passen würde. SmUtil.sm4(key) von Hutool übergibt nur den Namen SM4, und BouncyCastle ergänzt ECB mit PKCS#7 (in Java PKCS5Padding); erst ein vollständiger String wie SM4/CBC/PKCS5Padding bedeutet CBC. In JavaScript verwendet auch sm-crypto standardmäßig ECB, erwartet den Schlüssel als 32-stelligen Hex-String und gibt Hex in Kleinbuchstaben aus, während gm-crypt standardmäßig CBC verwendet, einen Textschlüssel mit 16 Zeichen erwartet und Base64 ausgibt. Prüfen Sie dann den Zeichensatz des Klartexts: Die String-Methoden von Hutool verwenden immer UTF-8, aber ein bloßes getBytes() kann unter JDK 17 oder älter auf chinesischem Windows GBK bedeuten, was den Chiffretext verändert. Wählen Sie die Bibliothek unter Standardwerte übernehmen von, um all das mit einem Klick einzustellen, oder tragen Sie es selbst ein; ist etwas unklar, fügen Sie den Chiffretext trotzdem ein, und die Auto-Diagnose probiert die Kombinationen aus Modus, Padding, IV und Kodierung durch. Sicherheitswerkzeuge
AES online entschlüsseln — GCM/CBC/CTR, Passphrase oder Rohschlüssel, erkennt automatisch das OpenSSL- & CryptoJS-Format „U2FsdGVkX1“. 100 % im Browser, Schlüssel verlassen die Seite nie.
Sicherheitswerkzeuge
Kostenloses Online-Tool für AES-Verschlüsselung — AES-128/192/256, GCM/CBC/CTR, Passphrase (PBKDF2) oder Rohschlüssel. Läuft zu 100 % im Browser; nichts wird hochgeladen.
Sicherheitswerkzeuge
Bcrypt-Passwort-Hashes online erzeugen und prüfen — einstellbarer Kostenfaktor, $2b$/$2a$/$2y$. 100 % im Browser; dein Passwort wird nie hochgeladen.
Sicherheitswerkzeuge
Hex oder Text einfügen, alle 63 CRC-8-, CRC-16- und CRC-32-Varianten auf einmal berechnen. Prüfsumme passt nicht? Wert eintragen, das Tool nennt die Variante: MODBUS, CCITT-FALSE, XMODEM, KERMIT. Rechnet lokal im Browser.
Sicherheitswerkzeuge
Kostenloser HMAC-Generator und -Prüfer online. Berechne HMAC-SHA256/SHA1/SHA384/SHA512 mit Schlüsseln als Text, Hex oder Base64 und Ausgabe als Hex/Base64/Base64URL. 100 % in deinem Browser — Schlüssel verlassen nie die Seite.
Sicherheitswerkzeuge
Dekodieren Sie JWT-Token online mit unserem kostenlosen JWT-Dekodierer. Inspizieren Sie sofort Header, Payload, Signatur, Ablauf und Claims. 100 % Browser — Ihr Token verlässt niemals Ihr Gerät. Keine Anmeldung, kein Tracking.