Sleutellengte van SM4
16 byte Precies 128 bit: 16 byte, geschreven als 32 hexcijfers of 16 ASCII-tekens. SM4-sleutels van 192 of 256 bit bestaan niet.
Versleutel en ontsleutel SM4 online. Mislukt ontsleutelen? De tool ziet of modus, padding, IV of codering fout is en geeft de oplossing. Draait in je browser, zonder upload. ECB, CBC, CTR, CFB, OFB; PKCS#7, zero of geen padding.
ECB versleutelt gelijke blokken tot gelijke cijfertekst en lekt patronen — gebruik het alleen om aan te sluiten op een systeem dat het vereist.
CTR, CFB en OFB zijn streammodi: geen padding, en de cijfertekst is even lang als de platte tekst.
Automatische diagnose
—
Vereist OpenSSL 3. Het commando bevat de sleutel die je hebt ingevoerd.
| Sleutel | 0123456789abcdeffedcba9876543210 |
|---|---|
| Platte tekst | 0123456789abcdeffedcba9876543210 |
| Cijfertekst, 1 versleuteling | 681edf34d206965e86b3e94f536e4246 |
| Cijfertekst, 1.000.000 versleutelingen | 595298c7c6fd271f0402f804c33d3f66 |
Geschreven en beoordeeld door ontwikkelaars die cryptografische tools bouwen. Elke cijfertekst en elk aantal bytes op deze pagina is berekend door de engine van de tool en door tests gecontroleerd.
16 byte Precies 128 bit: 16 byte, geschreven als 32 hexcijfers of 16 ASCII-tekens. SM4-sleutels van 192 of 256 bit bestaan niet.
681edf34d206965e86b3e94f536e4246 Met sleutel en platte tekst 0123456789abcdeffedcba9876543210 geeft één versleuteling 681edf34d206965e86b3e94f536e4246.
32 rondes Blokken van 16 byte (128 bit), versleuteld in 32 rondes.
eerste 16 byte Nee. Alleen de eerste 16 byte ontsleutelen verkeerd, en de padding in het laatste blok klopt nog steeds.
SM4 is het blokcijfer uit de Chinese standaarden voor commerciële cryptografie. Het verscheen als GM/T 0002-2012, werd de nationale standaard GB/T 32907-2016 (van kracht sinds 1 maart 2017) en is in 2021 via een amendement opgenomen in de internationale standaard ISO/IEC 18033-3. Het is een symmetrisch cijfer: dezelfde sleutel van 128 bit versleutelt en ontsleutelt, en het werkt met blokken van 128 bit, 16 byte per keer — dezelfde blokgrootte als AES.
Intern wordt elk blok opgesplitst in vier woorden van 32 bit, die 32 rondes doorlopen. Elke ronde mengt drie van de woorden met een rondesleutel, stuurt het resultaat door een 8-bit S-box en een lineaire transformatie, en voegt het samen met het vierde woord. De 32 rondesleutels worden uit de sleutel afgeleid met twee vaste reeksen constanten, en ontsleutelen is dezelfde berekening met de rondesleutels in omgekeerde volgorde.
Het kale blokcijfer verwerkt uitsluitend precies 16 byte, dus echte data gaat altijd door een bedrijfsmodus. Deze tool biedt de vijf klassieke: ECB en CBC, die met hele blokken werken en padding nodig hebben, en CTR, CFB en OFB, die van SM4 een streamcijfer maken zonder enige padding. De meeste mislukte ontsleutelingen hebben niets met SM4 zelf te maken — ze ontstaan doordat beide kanten het oneens zijn over de modus, de padding, de IV, de tekencodering of de manier waarop de sleutelstring bytes wordt, en bibliotheken zijn het zelfs niet eens over wat een kaal “SM4” betekent.
De ingebouwde Web Crypto API van browsers bevat geen SM4, dus deze pagina heeft een eigen implementatie aan boord die lokaal draait. Die is getest tegen de twee GB/T 32907-testvectoren en in elke modus vergeleken met 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 Mislukt het ontsleutelen, dan probeert de pagina het opnieuw met een andere cijfertekstcodering, sleutelformaat, modus, IV, padding en tekencodering, en toont de instellingen die leesbare tekst opleveren.
Eén klik neemt de standaardinstellingen over van OpenSSL, Hutool, sm-crypto, gm-crypt of tjfoc/gmsm — bibliotheken die het niet eens zijn over de vraag of kaal “SM4” ECB of CBC betekent.
ECB, CBC, CTR, CFB en OFB met PKCS#7, zero padding of geen padding. Platte tekst kan UTF-8 of GBK zijn, de codering die oudere Java-code op een Chinees Windows-systeem oplevert. GCM wordt niet ondersteund.
Genereer met één klik een willekeurige sleutel of IV van 16 byte, of voer hem in zoals je code hem schrijft. Een live byteteller bevestigt dat je precies 16 byte hebt voordat je andere oorzaken gaat zoeken.
Beide resultaten uit bijlage A staan in een tabel en zijn met één klik te laden, zodat je elke SM4-implementatie aan de standaard kunt toetsen.
Bij elk resultaat hoort het openssl enc-commando dat het reproduceert, zodat je het in een terminal kunt bevestigen of aan een collega kunt doorgeven.
De SM4-engine draait lokaal. Sleutels en data verlaten de pagina nooit, en de tool blijft ook offline werken.
openssl enc)-sm4 = CBC -sm4 is een alias van -sm4-cbc. -K en -iv verwachten hex, PKCS#7 blijft aan tenzij je -nopad meegeeft, en de uitvoer bestaat uit ruwe bytes tenzij je -base64 -A toevoegt. Een -K met de verkeerde lengte wordt afgekapt of met nullen aangevuld, met alleen een waarschuwing.
SmUtil.sm4(key)Hutool geeft een kaal SM4 door, dat BouncyCastle uitvoert als ECB met PKCS#7 (JCE noemt dat PKCS5Padding). Stringmethoden gebruiken UTF-8 en encryptHex geeft hex in kleine letters. Gebruik voor CBC new SM4(Mode.CBC, Padding.PKCS5Padding, key, iv).
Cipher.getInstance("SM4")Krijgt een modus die een IV nodig heeft er geen, dan genereert versleutelen stilzwijgend een willekeurige IV en gooit ontsleutelen no IV set when one expected — cijfertekst die is versleuteld zonder die IV te bewaren, kan dus nergens meer worden ontsleuteld.
sm4.encrypt(data, key) gebruikt standaard ECB met PKCS#7, verwacht de sleutel als hexstring van 32 cijfers en geeft hex in kleine letters terug. Alleen mode: 'cbc' verandert de modus; bij elke andere waarde blijft het stilzwijgend ECB. sm-crypto-v2 gedraagt zich hetzelfde, maar gebruikt een IV van alleen nullen als CBC geen iv krijgt.
Gebruikt standaard CBC, neemt sleutel en IV als UTF-8-strings van 16 tekens en geeft Base64 terug. Een sleutel waarvan de bytes geen geldige UTF-8 zijn, kun je er helemaal niet aan meegeven.
CryptSM4Je kiest de modus door crypt_ecb of crypt_cbc aan te roepen. set_key leest alleen de eerste 16 byte, dus een langere sleutel wordt stilzwijgend afgekapt, en een verkeerde sleutel levert meestal lege bytes op in plaats van een fout.
sm4Sm4Cbc gebruikt een IV op pakketniveau die uit nullen blijft bestaan tot SetIV wordt aangeroepen, past zelfs in CFB en OFB PKCS#7-padding toe en negeert fouten bij het verwijderen van de padding — een verkeerde sleutel geeft nil terug zonder fout.
Sleutel 0123456789abcdeffedcba9876543210, platte tekst (hex) 0123456789abcdeffedcba9876543210
681edf34d206965e86b3e94f536e4246
Dit is voorbeeld 1 uit bijlage A van GB/T 32907-2016: sleutel en platte tekst zijn dezelfde waarde van 128 bit, en één versleuteling geeft 681edf34d206965e86b3e94f536e4246. Versleutel je die uitvoer telkens opnieuw, in totaal een miljoen keer, dan krijg je 595298c7c6fd271f0402f804c33d3f66. Beide waarden staan in de testvectortabel op deze pagina, berekend door dezelfde engine die jij gebruikt. De knop GB/T 32907-testvector laadt de eerste.
Sleutel 0123456789abcdeffedcba9876543210, IV fedcba98765432100123456789abcdef, platte tekst: SM4 interop test: order 20260911-0042
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y
De platte tekst is 37 byte UTF-8. PKCS#7 vult die aan tot 48 byte, drie blokken van 16 byte, en in Base64 wordt dat 64 tekens. De knop Voorbeeld laden vult precies deze waarden in, en het OpenSSL-paneel toont een commando dat dezelfde Base64-string in een terminal reproduceert.
De cijfertekst hierboven, ontsleuteld met IV 00000000000000000000000000000000
16 byte onzin, dan ": order 20260911-0042"
CBC mengt de IV alleen in het eerste blok, en de PKCS#7-padding zit in het laatste blok, dus de paddingcontrole slaagt gewoon en OpenSSL geeft geen fout. Deze pagina merkt het onleesbare eerste blok op en vertelt je dat sleutel en modus kloppen en dat de IV het probleem is — of dat de eerste 16 byte van de cijfertekst zelf de IV zijn.
Weet je welke bibliotheek de andere kant gebruikt, kies die dan onder Standaardinstellingen van. Kies anders Versleutelen of Ontsleutelen en stem modus en padding af. Streammodi (CTR, CFB, OFB) hebben geen padding, dus de paddingkeuze is voor die modi uitgeschakeld.
Beide zijn precies 16 byte. Kies het formaat waarin de string is geschreven — hex, tekst of Base64 — en kijk of de byteteller groen wordt. De knoppen Willekeurig genereren nieuwe waarden.
Typ bij versleutelen tekst (UTF-8 of GBK) of plak hexbytes. Plak bij ontsleutelen de cijfertekst en geef aan of die Base64 of hex is. Het resultaat wordt bijgewerkt terwijl je typt.
Kopieer de uitvoer, of klik op Deze cijfertekst ontsleutelen om hem met dezelfde sleutel en IV naar het tabblad Ontsleutelen te brengen. Het OpenSSL-paneel toont een commando dat het resultaat reproduceert.
De diagnose somt de instellingen op waarmee je invoer tot leesbare tekst ontsleutelt. Pas er één toe met een klik, of lees de melding als alleen de eerste 16 byte mislukken — dat wijst op de IV.
Een hexstring van 32 tekens is alleen 16 byte als hij als hex wordt gedecodeerd. Als tekst gelezen is hij 32 byte, wat SM4 weigert — of, in code die sleutels stilzwijgend afkapt of aanvult, een heel andere sleutel.
Sleutel (tekst): 0123456789abcdeffedcba9876543210 -> 32 byte, geweigerd
Sleutel (hex): 0123456789abcdeffedcba9876543210 -> 16 byte
Beide kanten moeten dezelfde modus gebruiken. CBC-cijfertekst die als ECB wordt ontsleuteld, levert in elk blok onzin op en faalt meestal op de paddingcontrole aan het eind.
versleutelen: SM4/CBC/PKCS5Padding ontsleutelen: SM4/ECB/PKCS5Padding -> bad decrypt
versleutelen: SM4/CBC/PKCS5Padding ontsleutelen: SM4/CBC/PKCS5Padding, zelfde IV
In CBC geeft een verkeerde IV geen fout: de eerste 16 byte komen verminkt uit en de rest ontsleutelt normaal. Is alleen het begin van je platte tekst kapot, vergelijk dan de IV's.
ontsleutelen met IV 00000000000000000000000000000000 -> 16 byte onzin + ": order 20260911-0042"
ontsleutelen met IV fedcba98765432100123456789abcdef -> "SM4 interop test: order 20260911-0042"
Base64 en hex zijn twee manieren om dezelfde bytes op te schrijven. Lees je het ene als het andere, dan krijgt het cijfer vanaf het begin de verkeerde invoer.
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y als hex gelezen -> ongeldig
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y als Base64 gelezen -> 48 byte
Zero padding kan padding niet van data onderscheiden, dus platte tekst die echt op 0x00 eindigt, raakt die bytes kwijt. Gebruik PKCS#7 voor alles wat geen gewone tekst is.
zero padding: 61 62 00 -> ontsleutelt tot 61 62
PKCS#7: 61 62 00 -> ontsleutelt tot 61 62 00
OpenSSL behandelt sm4 als CBC. BouncyCastle — en dus ook SmUtil.sm4(key) in Hutool — behandelt SM4 als ECB met PKCS#7. Twee systemen die allebei “gewoon SM4 gebruiken”, kunnen het dus oneens zijn over de modus.
Java: Cipher.getInstance("SM4") -> ECB + PKCS#7
OpenSSL: openssl enc -sm4 -> CBC Java: Cipher.getInstance("SM4/CBC/PKCS5Padding")
OpenSSL: openssl enc -sm4-cbc getBytes() zonder tekenset gebruikt in Java de standaard van het platform, en dat is GBK op een Chinese Windows-installatie met JDK 17 of ouder. Dezelfde Chinese tekst versleutelt dan tot andere cijfertekst, en de andere kant ontsleutelt die tot mojibake.
"国密SM4 test".getBytes() // GBK op Chinese Windows met JDK <= 17 -> ECB-cijfertekst 3188d06cf28db70092f8753cbd5ee518
"国密SM4 test".getBytes(StandardCharsets.UTF_8) -> ECB-cijfertekst d830308b0ae4fa7b9a2b5d59f7f65ca5
pay=100.00 wordt pay=900.00, terwijl het ontsleutelen gewoon slaagt. Bereken een MAC over de IV en de cijfertekst en controleer die vóór het ontsleutelen, bijvoorbeeld met de HMAC-generator.0123456789abcdeffedcba9876543210 als hex gelezen is 16 byte, maar dezelfde string als tekst gelezen is 32 byte en wordt geweigerd. De formaatkeuze en de byteteller naast het sleutelveld zijn er precies om dit op te vangen. PKCS5Padding in Java dezelfde padding — BouncyCastle stuurt beide namen door hetzelfde codepad. Zero padding vult alleen met 0x00 aan tot de volgende blokgrens. Bij het ontsleutelen verwijderen Hutool en BouncyCastle elke 0x00 aan het eind, ook nulbytes die echt bij de data hoorden, terwijl gmssl in Python er maar één verwijdert. Geen padding vereist dat de invoer uit een geheel aantal blokken van 16 byte bestaat. CTR, CFB en OFB zijn streammodi en gebruiken nooit padding. Eindigt ontsleutelde tekst op losse spaties, vakjes of regeleinden, dan is de padding niet verwijderd: PKCS#7-data die zonder padding is ontsleuteld, houdt aan het eind n byte met de waarde n over (0x09, 0x0A en 0x0D verschijnen als tabs en regeleinden); zet de uitvoer op Hex en bekijk het laatste blok. getBytes() aanroept op een Chinees Windows-systeem — en hoe het resultaat wordt weergegeven: Base64, hex in kleine letters of hex in hoofdletters. Met identieke instellingen en een vaste IV leveren twee correcte implementaties identieke uitvoer op. Verdenk je een van beide tools, toets ze dan eerst allebei aan de GB/T 32907-testvector. 0123456789abcdeffedcba9876543210 moet één versleuteling 681edf34d206965e86b3e94f536e4246 opleveren en een miljoen versleutelingen achter elkaar 595298c7c6fd271f0402f804c33d3f66. Die testen alleen het blokcijfer, dus versleutel daarna wat tekst in CBC met een vaste sleutel en IV en vergelijk het resultaat met deze pagina of met het OpenSSL-commando dat hier wordt getoond. De engine achter deze pagina is getest tegen beide vectoren en tegen OpenSSL 3 in alle vijf de modi. openssl enc -sm4-cbc -K <32 hex digits> -iv <32 hex digits>: -K neemt de ruwe sleutel in hex, er komt dus geen wachtwoord aan te pas, -nopad zet PKCS#7 uit, en -base64 -A leest of schrijft Base64 op één regel. Let op twee dingen: kaal -sm4 betekent CBC, en een -K-waarde met de verkeerde lengte wordt afgekapt of met nullen aangevuld, met alleen een waarschuwing. Het OpenSSL-paneel op deze pagina stelt het commando samen uit je huidige instellingen; openssl enc kent geen zero padding, dus het paneel meldt dat in plaats van een commando te tonen dat niet zou overeenkomen. SmUtil.sm4(key) in Hutool geeft alleen de naam SM4 door, en BouncyCastle vult dan ECB met PKCS#7 in (in Java PKCS5Padding); alleen een volledige string zoals SM4/CBC/PKCS5Padding betekent CBC. In JavaScript gebruikt sm-crypto standaard ook ECB, verwacht het de sleutel als hexstring van 32 cijfers en geeft het hex in kleine letters terug, terwijl gm-crypt standaard CBC gebruikt, een tekstsleutel van 16 tekens verwacht en Base64 teruggeeft. Controleer daarna de tekenset van de platte tekst: de stringmethoden van Hutool gebruiken altijd UTF-8, maar een kale getBytes() op JDK 17 of ouder op een Chinees Windows-systeem kan GBK betekenen, en dan verandert de cijfertekst. Kies de bibliotheek onder Standaardinstellingen van om dit allemaal met één klik in te stellen, of vul het zelf in; twijfel je over een van de instellingen, plak de cijfertekst dan toch: de automatische diagnose probeert de combinaties van modus, padding, IV en codering. Beveiligingstools
Ontsleutel AES online — GCM/CBC/CTR, wachtwoordzin of ruwe sleutel, detecteert automatisch het OpenSSL- & CryptoJS-formaat "U2FsdGVkX1". 100% in de browser, sleutels verlaten de pagina nooit.
Beveiligingstools
Gratis AES-versleuteling online — AES-128/192/256, GCM/CBC/CTR, wachtwoordzin (PBKDF2) of ruwe sleutel. Draait 100% in je browser; niets wordt geüpload.
Beveiligingstools
Genereer en verifieer bcrypt-wachtwoordhashes online — instelbare kostenfactor, $2b$/$2a$/$2y$-prefixes. 100% in je browser; je wachtwoord wordt nooit geüpload.
Beveiligingstools
Plak hex of tekst en bereken in één keer alle 63 CRC-8-, CRC-16- en CRC-32-varianten. Checksum die niet klopt? Vul hem in en de tool benoemt de variant: MODBUS, CCITT-FALSE, XMODEM, KERMIT. Alles draait in je browser.
Beveiligingstools
Gratis online HMAC-generator en -verificator. Bereken HMAC-SHA256/SHA1/SHA384/SHA512 met sleutels in Tekst, Hex of Base64 en Hex/Base64/Base64URL-uitvoer. 100% in je browser — sleutels verlaten nooit de pagina.
Beveiligingstools
Decodeer JWT-tokens direct in je browser. Inspecteer header, payload, signature, vervaldatum en claims. 100% privé — je token verlaat je apparaat nooit.