Longueur de clé SM4
16 octets Exactement 128 bits : 16 octets, écrits en 32 chiffres hexadécimaux ou 16 caractères ASCII. Il n'existe pas de clé SM4 de 192 ou 256 bits.
Le déchiffrement SM4 échoue ? L'outil trouve le mode, le padding, l'IV ou l'encodage fautif et propose la correction. Tout reste dans le navigateur, rien n'est envoyé. ECB, CBC, CTR, CFB, OFB ; PKCS#7, zéros ou aucun padding.
ECB chiffre des blocs identiques en blocs chiffrés identiques et laisse fuiter des motifs — ne l'utilisez que pour dialoguer avec un système qui l'exige.
CTR, CFB et OFB sont des modes de flot : pas de padding, et le texte chiffré a la même longueur que le texte en clair.
Diagnostic automatique
—
Nécessite OpenSSL 3. La commande contient la clé que vous avez saisie.
| Clé | 0123456789abcdeffedcba9876543210 |
|---|---|
| Texte en clair | 0123456789abcdeffedcba9876543210 |
| Texte chiffré, 1 chiffrement | 681edf34d206965e86b3e94f536e4246 |
| Texte chiffré, 1 000 000 chiffrements | 595298c7c6fd271f0402f804c33d3f66 |
Rédigé et relu par des développeurs qui conçoivent des outils de cryptographie. Chaque texte chiffré et chaque nombre d'octets cités sur cette page sont calculés par le moteur de l'outil et vérifiés par des tests.
16 octets Exactement 128 bits : 16 octets, écrits en 32 chiffres hexadécimaux ou 16 caractères ASCII. Il n'existe pas de clé SM4 de 192 ou 256 bits.
681edf34d206965e86b3e94f536e4246 Avec la clé et le texte en clair 0123456789abcdeffedcba9876543210, un chiffrement donne 681edf34d206965e86b3e94f536e4246.
32 tours Blocs de 16 octets (128 bits), chiffrés en 32 tours.
16 premiers octets Non. Seuls les 16 premiers octets sont mal déchiffrés, et le padding du dernier bloc reste valide.
SM4 est le chiffrement par blocs des normes chinoises de cryptographie commerciale. Publié sous la référence GM/T 0002-2012, il est devenu la norme nationale GB/T 32907-2016 (en vigueur depuis le 1er mars 2017), puis a été ajouté à la norme internationale ISO/IEC 18033-3 par un amendement en 2021. C'est un chiffrement symétrique : la même clé de 128 bits chiffre et déchiffre, et il travaille sur des blocs de 128 bits, soit 16 octets à la fois — la même taille de bloc que l'AES.
À l'intérieur, chaque bloc est découpé en quatre mots de 32 bits et passe par 32 tours. À chaque tour, trois des mots sont combinés avec une clé de tour, le résultat traverse une S-box de 8 bits et une transformation linéaire, puis il est intégré au quatrième mot. Les 32 clés de tour sont dérivées de la clé à l'aide de deux jeux de constantes fixes, et le déchiffrement est le même calcul avec les clés de tour dans l'ordre inverse.
Le chiffrement par blocs seul ne traite que 16 octets exactement : les données réelles passent donc toujours par un mode opératoire. Cet outil propose les cinq modes classiques : ECB et CBC, qui travaillent sur des blocs entiers et nécessitent un padding, et CTR, CFB et OFB, qui transforment SM4 en chiffrement par flot sans aucun padding. La plupart des déchiffrements ratés n'ont rien à voir avec SM4 lui-même : ils viennent d'un désaccord entre les deux côtés sur le mode, le padding, l'IV, l'encodage du texte ou la conversion de la chaîne de clé en octets, et les bibliothèques ne s'accordent même pas sur ce que signifie « SM4 » tout court.
L'API Web Crypto intégrée aux navigateurs n'inclut pas SM4 : cette page embarque donc sa propre implémentation et l'exécute localement. Elle est testée contre les deux vecteurs de test de GB/T 32907 et vérifiée par recoupement avec OpenSSL 3 dans chaque 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 Quand le déchiffrement échoue, la page réessaie l'encodage du texte chiffré, le format de clé, le mode, l'IV, le padding et l'encodage du texte, puis affiche les réglages qui produisent un texte lisible.
Un clic applique les valeurs par défaut d'OpenSSL, Hutool, sm-crypto, gm-crypt ou tjfoc/gmsm — des bibliothèques qui ne s'accordent même pas sur le fait que « SM4 » tout court signifie ECB ou CBC.
ECB, CBC, CTR, CFB et OFB avec PKCS#7, padding par zéros ou sans padding. Le texte en clair peut être en UTF-8 ou en GBK, l'encodage que produit le vieux code Java sous Windows chinois. GCM n'est pas pris en charge.
Générez une clé ou un IV aléatoire de 16 octets en un clic, ou saisissez-le tel que votre code l'écrit. Un compteur d'octets en direct confirme que vous avez exactement 16 octets avant de chercher d'autres causes.
Les deux résultats de l'annexe A sont affichés dans un tableau et se chargent en un clic : vous pouvez ainsi vérifier n'importe quelle implémentation SM4 par rapport à la norme.
Chaque résultat est accompagné de la commande openssl enc qui le reproduit, pour le confirmer dans un terminal ou le transmettre à un collègue.
Le moteur SM4 s'exécute localement. Les clés et les données ne quittent jamais la page, et l'outil continue de fonctionner hors ligne.
openssl enc)-sm4 = CBC -sm4 est un alias de -sm4-cbc. -K et -iv prennent de l'hexadécimal, PKCS#7 reste actif sauf si vous passez -nopad, et la sortie est en octets bruts sauf si vous ajoutez -base64 -A. Un -K de mauvaise longueur est tronqué ou complété par des zéros avec un simple avertissement.
SmUtil.sm4(key)Hutool transmet un SM4 nu, que BouncyCastle exécute en ECB avec PKCS#7 (JCE l'appelle PKCS5Padding). Les méthodes de chaîne utilisent UTF-8 et encryptHex renvoie de l'hexadécimal en minuscules. Pour CBC, utilisez new SM4(Mode.CBC, Padding.PKCS5Padding, key, iv).
Cipher.getInstance("SM4")Dans un mode qui exige un IV mais n'en reçoit pas, le chiffrement génère en silence un IV aléatoire et le déchiffrement lève no IV set when one expected — un texte chiffré produit sans conserver cet IV ne peut donc être déchiffré nulle part.
sm4.encrypt(data, key) utilise par défaut ECB avec PKCS#7, attend la clé sous forme de chaîne hexadécimale de 32 chiffres et renvoie de l'hexadécimal en minuscules. Seul mode: 'cbc' change le mode ; toute autre valeur reste en ECB sans le signaler. sm-crypto-v2 se comporte de la même façon, mais utilise un IV entièrement nul quand CBC ne reçoit pas d'iv.
Utilise CBC par défaut, prend la clé et l'IV sous forme de chaînes UTF-8 de 16 caractères et renvoie du Base64. Une clé dont les octets ne forment pas de l'UTF-8 valide ne peut tout simplement pas lui être passée.
CryptSM4Vous choisissez le mode en appelant crypt_ecb ou crypt_cbc. set_key ne lit que les 16 premiers octets : une clé plus longue est tronquée en silence, et une mauvaise clé renvoie généralement des octets vides au lieu d'une erreur.
sm4Sm4Cbc utilise un IV global au package qui reste entièrement nul tant que SetIV n'est pas appelé, applique un padding PKCS#7 même en CFB et OFB, et ignore les erreurs de retrait du padding — une mauvaise clé renvoie nil sans erreur.
Clé 0123456789abcdeffedcba9876543210, texte en clair (hex) 0123456789abcdeffedcba9876543210
681edf34d206965e86b3e94f536e4246
C'est l'exemple 1 de l'annexe A de la norme GB/T 32907-2016 : la clé et le texte en clair ont la même valeur de 128 bits, et un seul chiffrement donne 681edf34d206965e86b3e94f536e4246. En rechiffrant ce résultat, un million de fois au total, on obtient 595298c7c6fd271f0402f804c33d3f66. Les deux valeurs figurent dans le tableau des vecteurs de test de cette page, calculées par le moteur que vous utilisez. Le bouton Vecteur de test GB/T 32907 charge la première.
Clé 0123456789abcdeffedcba9876543210, IV fedcba98765432100123456789abcdef, texte en clair : SM4 interop test: order 20260911-0042
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y
Le texte en clair fait 37 octets en UTF-8. PKCS#7 le complète à 48 octets, soit trois blocs de 16 octets, que Base64 écrit en 64 caractères. Le bouton Charger l'exemple remplit exactement ces valeurs, et le panneau OpenSSL affiche une commande qui reproduit la même chaîne Base64 dans un terminal.
Le texte chiffré ci-dessus, déchiffré avec l'IV 00000000000000000000000000000000
16 octets illisibles, puis ": order 20260911-0042"
CBC ne mélange l'IV qu'au premier bloc, et le padding PKCS#7 se trouve dans le dernier : la vérification du padding réussit donc quand même, et OpenSSL ne signale aucune erreur. Cette page repère le premier bloc illisible et vous indique que la clé et le mode sont bons et que le problème vient de l'IV — ou que les 16 premiers octets du texte chiffré sont eux-mêmes l'IV.
Si vous connaissez la bibliothèque de l'autre côté, choisissez-la dans Reprendre les valeurs par défaut de. Sinon, sélectionnez Chiffrer ou Déchiffrer et alignez le mode et le padding. Les modes de flot (CTR, CFB, OFB) n'ont pas de padding : le sélecteur de padding est donc désactivé pour eux.
Les deux font exactement 16 octets. Choisissez le format dans lequel la chaîne est écrite — hex, texte ou Base64 — et vérifiez que le compteur d'octets passe au vert. Les boutons Aléatoire génèrent de nouvelles valeurs.
Pour chiffrer, tapez du texte (UTF-8 ou GBK) ou collez des octets en hexadécimal. Pour déchiffrer, collez le texte chiffré et indiquez s'il est en Base64 ou en hex. Le résultat se met à jour pendant la saisie.
Copiez la sortie, ou cliquez sur Déchiffrer ce texte chiffré pour l'envoyer dans l'onglet de déchiffrement avec la même clé et le même IV. Le panneau OpenSSL affiche une commande qui reproduit le résultat.
Le diagnostic liste les réglages avec lesquels vos entrées se déchiffrent en texte lisible. Appliquez-en un d'un clic, ou lisez la note si seuls les 16 premiers octets échouent — c'est le signe d'un problème d'IV.
Une chaîne hexadécimale de 32 caractères ne fait 16 octets que si elle est décodée en hexadécimal. Lue comme du texte, elle fait 32 octets, ce que SM4 refuse — ou, dans du code qui tronque ou complète les clés en silence, elle devient une tout autre clé.
Clé (texte) : 0123456789abcdeffedcba9876543210 -> 32 octets, refusée
Clé (hex) : 0123456789abcdeffedcba9876543210 -> 16 octets
Les deux côtés doivent utiliser le même mode. Un texte chiffré en CBC puis déchiffré en ECB donne des données illisibles dans chaque bloc, et échoue généralement à la vérification du padding à la fin.
chiffrement : SM4/CBC/PKCS5Padding déchiffrement : SM4/ECB/PKCS5Padding -> bad decrypt
chiffrement : SM4/CBC/PKCS5Padding déchiffrement : SM4/CBC/PKCS5Padding, même IV
En CBC, un mauvais IV ne déclenche aucune erreur : les 16 premiers octets sortent brouillés et le reste se déchiffre normalement. Si seul le début de votre texte en clair est cassé, comparez les IV.
IV de déchiffrement 00000000000000000000000000000000 -> 16 octets illisibles + ": order 20260911-0042"
IV de déchiffrement fedcba98765432100123456789abcdef -> "SM4 interop test: order 20260911-0042"
Base64 et l'hexadécimal sont deux façons d'écrire les mêmes octets. Lire l'un comme l'autre fournit au chiffrement une entrée erronée dès le départ.
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y lu comme hex -> invalide
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y lu comme Base64 -> 48 octets
Le padding par zéros ne distingue pas le padding des données : un texte en clair qui se termine réellement par 0x00 perd ces octets. Utilisez PKCS#7 pour tout ce qui n'est pas du texte brut.
padding zéros : 61 62 00 -> déchiffré en 61 62
PKCS#7 : 61 62 00 -> déchiffré en 61 62 00
OpenSSL traite sm4 comme CBC. BouncyCastle — et donc SmUtil.sm4(key) de Hutool — traite SM4 comme ECB avec PKCS#7. Deux systèmes qui « utilisent simplement SM4 » peuvent ne pas être d'accord sur le mode.
Java: Cipher.getInstance("SM4") -> ECB + PKCS#7
OpenSSL: openssl enc -sm4 -> CBC Java: Cipher.getInstance("SM4/CBC/PKCS5Padding")
OpenSSL: openssl enc -sm4-cbc En Java, getBytes() sans jeu de caractères utilise l'encodage par défaut de la plateforme, c'est-à-dire GBK sur un JDK 17 ou antérieur sous Windows chinois. Le même texte chinois donne alors un texte chiffré différent, et l'autre côté le déchiffre en mojibake.
"国密SM4 test".getBytes() // GBK sur un JDK <= 17 sous Windows chinois -> texte chiffré ECB 3188d06cf28db70092f8753cbd5ee518
"国密SM4 test".getBytes(StandardCharsets.UTF_8) -> texte chiffré ECB d830308b0ae4fa7b9a2b5d59f7f65ca5
pay=100.00 en pay=900.00, et le déchiffrement réussit quand même. Calculez un MAC sur l'IV et le texte chiffré et vérifiez-le avant de déchiffrer, par exemple avec le générateur HMAC.0123456789abcdeffedcba9876543210 lu en hexadécimal fait 16 octets, mais la même chaîne lue comme du texte fait 32 octets et est refusée. Le sélecteur de format et le compteur d'octets à côté du champ de clé sont là précisément pour détecter cette confusion. PKCS5Padding de Java est exactement le même padding — BouncyCastle fait passer les deux noms par le même code. Le padding par zéros ajoute des 0x00 uniquement jusqu'à la prochaine frontière de bloc. Au déchiffrement, Hutool et BouncyCastle retirent tous les 0x00 finaux, y compris les octets nuls qui faisaient réellement partie des données, alors que gmssl en Python n'en retire qu'un. Sans padding, l'entrée doit compter un nombre entier de blocs de 16 octets. CTR, CFB et OFB sont des modes de flot et n'utilisent jamais de padding. Si le texte déchiffré se termine par des espaces, des carrés ou des sauts de ligne parasites, le padding n'a pas été retiré : des données PKCS#7 déchiffrées sans padding gardent à la fin n octets de valeur n (0x09, 0x0A et 0x0D s'affichent comme des tabulations et des sauts de ligne) ; passez la sortie en Hex et examinez le dernier bloc. getBytes() sur un Windows chinois — et la façon dont le résultat est affiché : Base64, hexadécimal en minuscules ou en majuscules. Avec des réglages identiques et un IV fixe, deux implémentations correctes produisent une sortie identique. Si vous soupçonnez l'un des outils, vérifiez d'abord les deux avec le vecteur de test GB/T 32907. 0123456789abcdeffedcba9876543210, un chiffrement doit donner 681edf34d206965e86b3e94f536e4246 et un million de chiffrements enchaînés 595298c7c6fd271f0402f804c33d3f66. Ces vecteurs ne testent que le chiffrement par blocs : chiffrez ensuite du texte en CBC avec une clé et un IV fixes, et comparez avec cette page ou avec la commande OpenSSL qu'elle affiche. Le moteur de cette page est testé contre les deux vecteurs et contre OpenSSL 3 dans les cinq modes. openssl enc -sm4-cbc -K <32 hex digits> -iv <32 hex digits> : -K prend la clé brute en hexadécimal, donc aucun mot de passe n'intervient, -nopad désactive PKCS#7, et -base64 -A lit ou écrit du Base64 sur une seule ligne. Attention à deux pièges : -sm4 tout court signifie CBC, et une valeur -K de mauvaise longueur est tronquée ou complétée par des zéros avec un simple avertissement. Le panneau OpenSSL de cette page construit la commande à partir de vos réglages actuels ; openssl enc n'a pas de padding par zéros, donc le panneau le signale au lieu d'afficher une commande qui ne correspondrait pas. SmUtil.sm4(key) de Hutool ne transmet que le nom SM4, et BouncyCastle complète avec ECB avec PKCS#7 (le PKCS5Padding de Java) ; seule une chaîne complète comme SM4/CBC/PKCS5Padding signifie CBC. En JavaScript, sm-crypto utilise lui aussi ECB par défaut, attend la clé sous forme de chaîne hexadécimale de 32 chiffres et renvoie de l'hexadécimal en minuscules, tandis que gm-crypt utilise CBC par défaut, attend une clé texte de 16 caractères et renvoie du Base64. Vérifiez ensuite le jeu de caractères du texte en clair : les méthodes de chaîne de Hutool utilisent toujours UTF-8, mais un getBytes() sans argument sur un JDK 17 ou antérieur sous Windows chinois peut signifier GBK, ce qui change le texte chiffré. Choisissez la bibliothèque dans Reprendre les valeurs par défaut de pour tout régler en un clic, ou saisissez les réglages vous-même ; si l'un d'eux est incertain, collez quand même le texte chiffré, et le diagnostic automatique essaie les combinaisons de mode, de padding, d'IV et d'encodage. Outils de sécurité
Déchiffrez de l'AES en ligne — GCM/CBC/CTR, phrase secrète ou clé brute, détection automatique du format OpenSSL et CryptoJS « U2FsdGVkX1 ». 100 % dans le navigateur, les clés ne quittent jamais la page.
Outils de sécurité
Chiffrement AES en ligne gratuit — AES-128/192/256, GCM/CBC/CTR, phrase secrète (PBKDF2) ou clé brute. 100 % dans votre navigateur ; rien n'est envoyé.
Outils de sécurité
Générez et vérifiez des hachages bcrypt en ligne — coût ajustable, préfixes $2b$/$2a$/$2y$. 100 % dans votre navigateur ; mot de passe jamais envoyé.
Outils de sécurité
Collez du texte ou de l'hexadécimal : les 63 variantes CRC-8, CRC-16 et CRC-32 d'un coup. Somme de contrôle impossible à reproduire ? Saisissez-la, l'outil nomme la variante : MODBUS, CCITT-FALSE, XMODEM. Tout reste local.
Outils de sécurité
Générateur et vérificateur HMAC en ligne gratuit. Calculez HMAC-SHA256/SHA1/SHA384/SHA512 avec des clés en texte, hex ou Base64 et une sortie Hex/Base64/Base64URL. 100 % dans votre navigateur — les clés ne quittent jamais la page.
Outils de sécurité
Décodez des jetons JWT en ligne avec notre décodeur JWT gratuit. Inspectez en-tête, charge utile, signature, expiration et revendications. 100 % navigateur — votre jeton ne quitte jamais votre appareil. Sans inscription ni suivi.