Długość klucza SM4
16 bajtów Dokładnie 128 bitów: 16 bajtów, zapisanych jako 32 cyfry szesnastkowe lub 16 znaków ASCII. Nie istnieją 192- ani 256-bitowe klucze SM4.
Szyfrowanie SM4 online. Gdy odszyfrowanie zawodzi, wskaże błędny tryb, dopełnienie, IV lub kodowanie i poda poprawkę. Działa lokalnie, bez wysyłania. ECB, CBC, CTR, CFB, OFB, PKCS#7.
ECB szyfruje jednakowe bloki do jednakowego szyfrogramu i ujawnia wzorce — nadaje się tylko do współpracy z systemem, który go wymaga.
CTR, CFB i OFB to tryby strumieniowe: bez dopełnienia, a szyfrogram jest tak długi jak tekst jawny.
Automatyczna diagnoza
—
Wymaga OpenSSL 3. Polecenie zawiera wpisany klucz.
| Klucz | 0123456789abcdeffedcba9876543210 |
|---|---|
| Tekst jawny | 0123456789abcdeffedcba9876543210 |
| Szyfrogram, 1 szyfrowanie | 681edf34d206965e86b3e94f536e4246 |
| Szyfrogram, 1 000 000 szyfrowań | 595298c7c6fd271f0402f804c33d3f66 |
Napisane i zweryfikowane przez programistów budujących narzędzia kryptograficzne. Każdy szyfrogram i każda liczba bajtów podana na tej stronie są obliczane przez silnik narzędzia i sprawdzane testami.
16 bajtów Dokładnie 128 bitów: 16 bajtów, zapisanych jako 32 cyfry szesnastkowe lub 16 znaków ASCII. Nie istnieją 192- ani 256-bitowe klucze SM4.
681edf34d206965e86b3e94f536e4246 Dla klucza i tekstu jawnego 0123456789abcdeffedcba9876543210 jedno szyfrowanie daje 681edf34d206965e86b3e94f536e4246.
32 rundy Bloki 16-bajtowe (128-bitowe), szyfrowane w 32 rundach.
pierwsze 16 bajtów Nie. Błędnie odszyfrowuje się tylko pierwsze 16 bajtów, a dopełnienie w ostatnim bloku nadal przechodzi kontrolę.
SM4 to szyfr blokowy z chińskich standardów kryptografii komercyjnej. Opublikowano go jako GM/T 0002-2012, następnie stał się normą krajową GB/T 32907-2016 (obowiązującą od 1 marca 2017 r.), a w 2021 roku poprawka dodała go do międzynarodowej normy ISO/IEC 18033-3. To szyfr symetryczny: ten sam 128-bitowy klucz służy do szyfrowania i odszyfrowania, a dane są przetwarzane w 128-bitowych blokach, po 16 bajtów naraz — to ten sam rozmiar bloku co w AES.
Wewnątrz każdy blok jest dzielony na cztery 32-bitowe słowa i przechodzi przez 32 rundy. W każdej rundzie trzy słowa są łączone z kluczem rundy, wynik przechodzi przez 8-bitowy S-box i przekształcenie liniowe, a na końcu zostaje połączony z czwartym słowem. Wszystkie 32 klucze rund wyprowadza się z klucza za pomocą dwóch ustalonych zestawów stałych, a odszyfrowanie to te same obliczenia z kluczami rund w odwrotnej kolejności.
Sam szyfr blokowy obsługuje wyłącznie dokładnie 16 bajtów, dlatego prawdziwe dane zawsze przechodzą przez tryb pracy. To narzędzie oferuje pięć klasycznych trybów: ECB i CBC, które działają na pełnych blokach i wymagają dopełnienia, oraz CTR, CFB i OFB, które zamieniają SM4 w szyfr strumieniowy bez żadnego dopełnienia. Większość nieudanych odszyfrowań nie ma nic wspólnego z samym SM4 — wynika z tego, że obie strony różnie ustawiają tryb, dopełnienie, IV, kodowanie tekstu albo sposób zamiany ciągu klucza na bajty, a biblioteki nie zgadzają się nawet co do tego, co oznacza samo „SM4”.
Wbudowany w przeglądarki interfejs Web Crypto API nie obejmuje SM4, dlatego ta strona zawiera własną implementację i uruchamia ją lokalnie. Jest ona testowana na dwóch wektorach testowych GB/T 32907 i porównywana z OpenSSL 3 w każdym trybie.
// 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 Gdy odszyfrowanie zawodzi, strona ponownie sprawdza kodowanie szyfrogramu, format klucza, tryb, IV, dopełnienie i kodowanie tekstu, a następnie pokazuje ustawienia, które dają czytelny tekst.
Jedno kliknięcie ustawia wartości domyślne OpenSSL, Hutool, sm-crypto, gm-crypt lub tjfoc/gmsm — bibliotek, które nie zgadzają się nawet co do tego, czy samo „SM4” oznacza ECB, czy CBC.
ECB, CBC, CTR, CFB i OFB z PKCS#7, dopełnieniem zerami lub bez dopełnienia. Tekst jawny może być w UTF-8 albo w GBK — kodowaniu, które starszy kod w Javie tworzy w chińskiej wersji Windows. GCM nie jest obsługiwany.
Losowy 16-bajtowy klucz lub IV można wygenerować jednym kliknięciem albo wpisać w takiej postaci, w jakiej zapisuje go kod. Licznik bajtów na żywo potwierdza, że jest ich dokładnie 16, zanim zacznie się szukać innych przyczyn.
Oba wyniki z załącznika A są podane w tabeli i można je wczytać jednym kliknięciem, więc każdą implementację SM4 da się sprawdzić względem normy.
Każdemu wynikowi towarzyszy polecenie openssl enc, które go odtwarza, dzięki czemu można go potwierdzić w terminalu albo przekazać współpracownikowi.
Silnik SM4 działa lokalnie. Klucze i dane nigdy nie opuszczają strony, a narzędzie działa także offline.
openssl enc)-sm4 = CBC -sm4 to alias -sm4-cbc. -K i -iv przyjmują hex, PKCS#7 pozostaje włączone, dopóki nie poda się -nopad, a wynik to surowe bajty, chyba że doda się -base64 -A. -K o złej długości jest obcinany lub dopełniany zerami, a OpenSSL wyświetla jedynie ostrzeżenie.
SmUtil.sm4(key)Hutool przekazuje samo SM4, które BouncyCastle wykonuje jako ECB z PKCS#7 (w JCE: PKCS5Padding). Metody tekstowe używają UTF-8, a encryptHex zwraca hex małymi literami. Dla CBC trzeba użyć new SM4(Mode.CBC, Padding.PKCS5Padding, key, iv).
Cipher.getInstance("SM4")W trybie, który wymaga IV, ale go nie dostaje, szyfrowanie po cichu generuje losowy IV, a odszyfrowanie rzuca no IV set when one expected — więc szyfrogramu zaszyfrowanego bez zapisania tego IV nie da się nigdzie odszyfrować.
sm4.encrypt(data, key) domyślnie używa ECB z PKCS#7, oczekuje klucza jako 32-cyfrowego ciągu szesnastkowego i zwraca hex małymi literami. Tryb zmienia tylko mode: 'cbc'; każda inna wartość po cichu pozostawia ECB. sm-crypto-v2 zachowuje się tak samo, ale gdy CBC nie dostanie iv, używa IV złożonego z samych zer.
Domyślnie używa CBC, przyjmuje klucz i IV jako 16-znakowe ciągi UTF-8 i zwraca Base64. Klucza, którego bajty nie są poprawnym UTF-8, w ogóle nie da się do niego przekazać.
CryptSM4Tryb wybiera się, wywołując crypt_ecb lub crypt_cbc. set_key odczytuje tylko pierwsze 16 bajtów, więc dłuższy klucz jest po cichu obcinany, a błędny klucz zwykle zwraca puste bajty zamiast błędu.
sm4Sm4Cbc używa IV na poziomie pakietu, który pozostaje wyzerowany, dopóki nie zostanie wywołane SetIV, dopełnia PKCS#7 nawet w CFB i OFB i ignoruje błędy usuwania dopełnienia — błędny klucz zwraca nil bez żadnego błędu.
Klucz 0123456789abcdeffedcba9876543210, tekst jawny (hex) 0123456789abcdeffedcba9876543210
681edf34d206965e86b3e94f536e4246
To przykład 1 z załącznika A normy GB/T 32907-2016: klucz i tekst jawny mają tę samą 128-bitową wartość, a jedno szyfrowanie daje 681edf34d206965e86b3e94f536e4246. Szyfrowanie wyniku raz za razem, łącznie milion razy, daje 595298c7c6fd271f0402f804c33d3f66. Obie wartości są podane w tabeli wektorów testowych na tej stronie i zostały obliczone przez ten sam silnik, który obsługuje narzędzie. Przycisk Wektor testowy GB/T 32907 wczytuje pierwszą z nich.
Klucz 0123456789abcdeffedcba9876543210, IV fedcba98765432100123456789abcdef, tekst jawny: SM4 interop test: order 20260911-0042
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y
Tekst jawny to 37 bajtów UTF-8. PKCS#7 dopełnia go do 48 bajtów, czyli trzech 16-bajtowych bloków, które w Base64 zajmują 64 znaki. Przycisk Wczytaj przykład wstawia dokładnie te wartości, a panel OpenSSL pokazuje polecenie, które odtwarza w terminalu ten sam ciąg Base64.
Szyfrogram z poprzedniego przykładu odszyfrowany z IV 00000000000000000000000000000000
16 bajtów śmieci, potem ": order 20260911-0042"
CBC miesza IV wyłącznie z pierwszym blokiem, a dopełnienie PKCS#7 znajduje się w ostatnim bloku, więc kontrola dopełnienia nadal przechodzi i OpenSSL nie zgłasza żadnego błędu. Ta strona zauważa nieczytelny pierwszy blok i informuje, że klucz i tryb są poprawne, a problemem jest IV — albo że pierwsze 16 bajtów szyfrogramu to właśnie IV.
Jeśli wiadomo, z jakiej biblioteki korzysta druga strona, wystarczy wybrać ją w polu Domyślne ustawienia biblioteki. W przeciwnym razie wybierz Szyfruj lub Odszyfruj i dopasuj tryb oraz dopełnienie. Tryby strumieniowe (CTR, CFB, OFB) nie mają dopełnienia, więc selektor dopełnienia jest dla nich wyłączony.
Oba mają dokładnie 16 bajtów. Wybierz format, w jakim zapisano ciąg — hex, tekst lub Base64 — i sprawdź, czy licznik bajtów zmienił kolor na zielony. Przyciski Losuj generują nowe wartości.
Przy szyfrowaniu wpisz tekst (UTF-8 lub GBK) albo wklej bajty w hex. Przy odszyfrowaniu wklej szyfrogram i wskaż, czy jest zapisany w Base64, czy w hex. Wynik aktualizuje się w trakcie pisania.
Skopiuj wynik albo kliknij Odszyfruj ten szyfrogram, aby przenieść go do odszyfrowania z tym samym kluczem i IV. Panel OpenSSL pokazuje polecenie, które odtwarza wynik.
Diagnoza wymienia ustawienia, przy których dane wejściowe dają czytelny tekst. Każde z nich można zastosować jednym kliknięciem; jeśli zawodzi tylko pierwsze 16 bajtów, warto przeczytać uwagę — wskazuje ona na IV.
32-znakowy ciąg szesnastkowy ma 16 bajtów tylko wtedy, gdy zostanie odczytany jako hex. Odczytany jako tekst ma 32 bajty, które SM4 odrzuca — albo, w kodzie po cichu obcinającym lub dopełniającym klucze, staje się zupełnie innym kluczem.
Klucz (tekst): 0123456789abcdeffedcba9876543210 -> 32 bajty, odrzucony
Klucz (hex): 0123456789abcdeffedcba9876543210 -> 16 bajtów
Obie strony muszą używać tego samego trybu. Szyfrogram CBC odszyfrowany jako ECB daje śmieci w każdym bloku i zwykle nie przechodzi kontroli dopełnienia na końcu.
szyfrowanie: SM4/CBC/PKCS5Padding odszyfrowanie: SM4/ECB/PKCS5Padding -> bad decrypt
szyfrowanie: SM4/CBC/PKCS5Padding odszyfrowanie: SM4/CBC/PKCS5Padding, ten sam IV
W CBC błędny IV nie wywołuje błędu: pierwsze 16 bajtów wychodzi zniekształcone, a reszta odszyfrowuje się normalnie. Jeśli uszkodzony jest tylko początek tekstu jawnego, warto porównać IV po obu stronach.
IV przy odszyfrowaniu: 00000000000000000000000000000000 -> 16 bajtów śmieci + ": order 20260911-0042"
IV przy odszyfrowaniu: fedcba98765432100123456789abcdef -> "SM4 interop test: order 20260911-0042"
Base64 i hex to dwa sposoby zapisu tych samych bajtów. Odczytanie jednego jako drugiego od samego początku przekazuje szyfrowi błędne dane wejściowe.
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y odczytany jako hex -> nieprawidłowy
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y odczytany jako Base64 -> 48 bajtów
Dopełnienie zerami nie odróżnia dopełnienia od danych, więc tekst jawny, który naprawdę kończy się bajtami 0x00, traci je. Do wszystkiego, co nie jest zwykłym tekstem, lepiej używać PKCS#7.
dopełnienie zerami: 61 62 00 -> po odszyfrowaniu 61 62
PKCS#7: 61 62 00 -> po odszyfrowaniu 61 62 00
OpenSSL traktuje sm4 jako CBC. BouncyCastle — a więc także SmUtil.sm4(key) z Hutool — traktuje SM4 jako ECB z PKCS#7. Dwa systemy, które „po prostu używają SM4”, mogą różnić się trybem.
Java: Cipher.getInstance("SM4") -> ECB + PKCS#7
OpenSSL: openssl enc -sm4 -> CBC Java: Cipher.getInstance("SM4/CBC/PKCS5Padding")
OpenSSL: openssl enc -sm4-cbc getBytes() w Javie bez podania zestawu znaków używa domyślnego kodowania platformy, którym w chińskiej wersji Windows z JDK 17 lub starszym jest GBK. Ten sam chiński tekst daje wtedy inny szyfrogram, a druga strona odszyfrowuje go do nieczytelnych „krzaczków”.
"国密SM4 test".getBytes() // GBK w chińskiej wersji Windows, JDK <= 17 -> szyfrogram ECB 3188d06cf28db70092f8753cbd5ee518
"国密SM4 test".getBytes(StandardCharsets.UTF_8) -> szyfrogram ECB d830308b0ae4fa7b9a2b5d59f7f65ca5
pay=100.00 w pay=900.00, a odszyfrowanie nadal się udaje. Warto obliczyć MAC z IV i szyfrogramu i sprawdzić go przed odszyfrowaniem, na przykład za pomocą generatora HMAC.0123456789abcdeffedcba9876543210 odczytany jako hex ma 16 bajtów, ale ten sam ciąg odczytany jako tekst ma 32 bajty i zostaje odrzucony. Selektor formatu i licznik bajtów obok pola klucza służą właśnie do wychwycenia tej pomyłki. PKCS5Padding z Javy to dokładnie to samo dopełnienie — BouncyCastle obsługuje obie nazwy tą samą ścieżką kodu. Dopełnienie zerami dokłada bajty 0x00 tylko do najbliższej granicy bloku. Przy odszyfrowaniu Hutool i BouncyCastle usuwają wszystkie końcowe bajty 0x00, łącznie z zerami, które naprawdę były częścią danych, a gmssl w Pythonie usuwa tylko jeden. Brak dopełnienia wymaga, by dane wejściowe składały się z pełnych 16-bajtowych bloków. CTR, CFB i OFB to tryby strumieniowe i nigdy nie stosują dopełnienia. Jeśli odszyfrowany tekst kończy się dziwnymi spacjami, prostokątami lub znakami nowej linii, dopełnienie nie zostało usunięte: dane z PKCS#7 odszyfrowane bez dopełnienia zachowują na końcu n bajtów o wartości n (0x09, 0x0A i 0x0D wyglądają jak tabulatory i łamania wierszy); wystarczy przełączyć wynik na Hex i obejrzeć ostatni blok. getBytes() w chińskiej wersji Windows — oraz sposób zapisu wyniku: Base64, hex małymi literami lub hex wielkimi literami. Przy identycznych ustawieniach i stałym IV dwie poprawne implementacje dają identyczny wynik. Jeśli któreś z narzędzi budzi podejrzenia, najpierw należy sprawdzić oba na wektorze testowym GB/T 32907. 0123456789abcdeffedcba9876543210, jedno szyfrowanie musi dać 681edf34d206965e86b3e94f536e4246, a milion szyfrowań w łańcuchu — 595298c7c6fd271f0402f804c33d3f66. Sprawdzają one wyłącznie sam szyfr blokowy, więc w drugim kroku warto zaszyfrować jakiś tekst w CBC ze stałym kluczem i IV i porównać wynik z tą stroną albo z pokazanym na niej poleceniem OpenSSL. Silnik tej strony jest testowany na obu wektorach oraz porównywany z OpenSSL 3 we wszystkich pięciu trybach. openssl enc -sm4-cbc -K <32 hex digits> -iv <32 hex digits>: -K przyjmuje surowy klucz w hex, więc żadne hasło nie bierze w tym udziału, -nopad wyłącza PKCS#7, a -base64 -A odczytuje lub zapisuje Base64 w jednym wierszu. Trzeba uważać na dwie rzeczy: samo -sm4 oznacza CBC, a wartość -K o złej długości jest obcinana lub dopełniana zerami, przy czym OpenSSL wyświetla jedynie ostrzeżenie. Panel OpenSSL na tej stronie buduje polecenie z bieżących ustawień; openssl enc nie obsługuje dopełnienia zerami, więc panel o tym informuje, zamiast wypisywać polecenie, które dałoby inny wynik. SmUtil.sm4(key) z Hutool przekazuje tylko nazwę SM4, a BouncyCastle uzupełnia ją do ECB z PKCS#7 (PKCS5Padding w Javie); CBC oznacza dopiero pełny ciąg, taki jak SM4/CBC/PKCS5Padding. W JavaScripcie sm-crypto również domyślnie używa ECB, przyjmuje klucz jako 32-cyfrowy ciąg szesnastkowy i zwraca hex małymi literami, natomiast gm-crypt domyślnie używa CBC, przyjmuje 16-znakowy klucz tekstowy i zwraca Base64. Następnie trzeba sprawdzić zestaw znaków tekstu jawnego: metody tekstowe Hutool zawsze używają UTF-8, ale gołe getBytes() w JDK 17 lub starszym w chińskiej wersji Windows może oznaczać GBK, co zmienia szyfrogram. Wybranie biblioteki w polu Domyślne ustawienia biblioteki ustawia to wszystko jednym kliknięciem; można też wprowadzić wartości ręcznie. Jeśli któraś z nich jest niepewna, i tak warto wkleić szyfrogram — automatyczna diagnoza sprawdzi kombinacje trybu, dopełnienia, IV i kodowania. Narzędzia bezpieczeństwa
Odszyfruj AES online — GCM/CBC/CTR, hasło lub klucz surowy, automatyczne wykrywanie formatu OpenSSL i CryptoJS „U2FsdGVkX1”. 100% w przeglądarce, klucze nigdy jej nie opuszczają.
Narzędzia bezpieczeństwa
Darmowe szyfrowanie AES online — AES-128/192/256, GCM/CBC/CTR, hasło (PBKDF2) lub klucz surowy. Działa w 100% w przeglądarce; nic nie jest przesyłane.
Narzędzia bezpieczeństwa
Generuj i weryfikuj skróty bcrypt haseł online — regulowany koszt, prefiksy $2b$/$2a$/$2y$. W 100% w przeglądarce; Twoje hasło nigdy nie jest wysyłane.
Narzędzia bezpieczeństwa
Wklej hex albo tekst i policz naraz wszystkie 63 warianty CRC-8, CRC-16 i CRC-32. Suma kontrolna z urządzenia się nie zgadza? Wpisz ją, a narzędzie wskaże wariant: MODBUS, CCITT-FALSE, XMODEM, KERMIT. Wszystko lokalnie.
Narzędzia bezpieczeństwa
Darmowy generator i weryfikator HMAC online. Oblicz HMAC-SHA256/SHA1/SHA384/SHA512 z kluczem Tekst, Hex lub Base64 i wynikiem Hex/Base64/Base64URL. 100% w Twojej przeglądarce — klucze nigdy nie opuszczają strony.
Narzędzia bezpieczeństwa
Dekoduj JWT online darmowym dekoderem JWT. Sprawdź header, payload, signature, claims i wygaśnięcie. W 100% w przeglądarce — token nie opuszcza urządzenia.