AES-ontsleutelingstool — OpenSSL- & CryptoJS-compatibel
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.
Geavanceerde opties
Hergebruik nooit een IV met dezelfde sleutel. Laat leeg om een veilige willekeurige IV te genereren.
Hoe AES-ontsleuteling werkt
AES-ontsleuteling is precies het omgekeerde van versleuteling: dezelfde symmetrische sleutel die de data heeft dooreengehusseld, doorloopt de rondes van het cijfer in omgekeerde volgorde om de oorspronkelijke bytes terug te krijgen. Omdat AES symmetrisch is, bestaat er geen aparte 'ontsleutelsleutel' — je moet exact dezelfde sleutel of wachtwoordzin, modus en IV opgeven die zijn gebruikt om te versleutelen. Klop de parameters, dan komt de platte tekst byte voor byte terug; is er één verkeerd, dan krijg je een fout of onzin.
Om correct te ontsleutelen moeten vier dingen exact overeenkomen met de versleuteling: de sleutel (of de wachtwoordzin plus de sleutelafleidingsinstellingen), de bedrijfsmodus (GCM, CBC of CTR), de IV of nonce, en — voor GCM — de authenticatietag. Mis je er ook maar één, dan is het resultaat óf een harde fout (een GCM-authenticatiefout, een CBC-padding-fout) óf stille onzin (CTR, of CBC met de verkeerde IV). Deze tool leest de salt, IV en tag voor je uit de cijfertekst wanneer ze erin zijn verpakt, en diagnosticeert de mislukking wanneer iets niet klopt.
Cijfertekst komt in een paar verschillende vormen binnen, en deze tool herkent er drie. Formaat 1 is onze zelfstandige wachtwoordzin-indeling: een salt van 16 byte, dan de IV, dan de cijfertekst (met de GCM-tag aangehangen in de GCM-modus) — ontsleutel deze met alleen de wachtwoordzin. Formaat 2 is de ruwe-sleutel-indeling: de IV voorafgaand aan de cijfertekst, of 'kale' cijfertekst waarbij je de IV apart opgeeft. Formaat 3 is de OpenSSL-indeling, geproduceerd door het commando openssl enc en door CryptoJS.
Dat OpenSSL-formaat is de moeite waard om op het zicht te herkennen. Het begint met de 8 ASCII-bytes Salted__, gevolgd door een salt van 8 byte en dan de cijfertekst, en wanneer het geheel Base64-gecodeerd wordt, komen die eerste bytes altijd naar voren als het prefix U2FsdGVkX1. Als een cijfertekst die je hebt gekregen dus begint met U2FsdGVkX1, is deze vrijwel zeker geproduceerd door openssl enc of een aanroep van CryptoJS AES.encrypt(text, passphrase). CryptoJS leidt zijn sleutel af met de verouderde functie EVP_BytesToKey via één enkele MD5-pas, terwijl modern openssl PBKDF2 gebruikt — daarom draait bij het ontsleutelen van deze cijferteksten alles om het kiezen van de juiste sleutelafleidingsfunctie. Is je invoer Base64 en wil je gewoon de ruwe bytes zien, dan toont onze Base64-decoder ze. Om cijfertekst in deze formaten te maken, gebruik je de AES-versleutelingstool.
// AES-256-GCM decrypt with a passphrase (PBKDF2-HMAC-SHA256, 600,000 iterations).
// Identical code runs in the browser and in Node.js 20+ via Web Crypto.
async function aesGcmDecrypt(base64, passphrase) {
const enc = new TextEncoder();
const packed = Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));
const salt = packed.slice(0, 16), iv = packed.slice(16, 28); // salt(16) | iv(12)
const ct = packed.slice(28); // ciphertext + tag
const baseKey = await crypto.subtle.importKey(
'raw', enc.encode(passphrase), 'PBKDF2', false, ['deriveKey']);
const key = await crypto.subtle.deriveKey(
{ name: 'PBKDF2', salt, iterations: 600000, hash: 'SHA-256' },
baseKey, { name: 'AES-GCM', length: 256 }, false, ['decrypt']);
const plain = await crypto.subtle.decrypt(
{ name: 'AES-GCM', iv }, key, ct); // throws if the tag fails
return new TextDecoder().decode(plain); // recovered plaintext
} Belangrijkste functies
Detecteert automatisch OpenSSL- & CryptoJS-uitvoer
Plak cijfertekst die begint met U2FsdGVkX1 en de tool herkent het Salted__-formaat en biedt een overschakeling met één klik naar de bijpassende ontsleutelingsflow, zodat je nooit vastloopt op een doodlopende foutmelding.
Drie sleutelafleidingsfuncties
Ontsleutel over elke generatie van het openssl-enc-formaat heen: PBKDF2 met een aangepast aantal iteraties, EVP_BytesToKey met SHA-256, of de verouderde MD5-enkele-pas die CryptoJS gebruikt.
Verklaart waarom het ontsleutelen mislukte
In plaats van een algemene fout krijg je een diagnose: verkeerde sleutel versus verkeerde IV, een GCM-authenticatiefout, een CBC-padding-fout, base64-vervuiling, of 'dit lijkt op een cijfertekst uit het MD5-tijdperk, probeer EVP-MD5'.
Overeenkomend openssl-commando live getoond
Zie het exacte commando openssl enc -d dat het ontsleutelen op de command line reproduceert, inclusief aantal iteraties, zodat je het resultaat buiten de browser kunt verifiëren.
Wachtwoordzin of ruwe sleutel, GCM/CBC/CTR
Verwerkt zelfstandige wachtwoordzin-cijfertekst, ruwe-sleutel-cijfertekst met voorafgevoegde of apart opgegeven IV, en alle drie de Web Crypto-modi.
100% in je browser
Cijfertekst en sleutels worden lokaal verwerkt met de Web Crypto API en nooit geüpload — je kunt dit verifiëren met het tabblad Netwerk of door offline te gaan.
Voorbeelden van AES-ontsleuteling
Een zelfstandige wachtwoordzin-cijfertekst ontsleutelen (GCM)
salt(16) ‖ iv(12) ‖ cijfertekst ‖ tag(16), Base64 — van de versleutelingspagina
The quick brown fox jumps over the lazy dog.
Dit is het omgekeerde van het GCM-voorbeeld op de versleutelingspagina. Neem de zelfstandige Base64-string die daar is geproduceerd voor de wachtwoordzin hunter2, plak hem hier met Modus GCM, Sleutelgrootte 256, Sleuteltype Wachtwoordzin en dezelfde wachtwoordzin hunter2, en de oorspronkelijke zin komt terug. Je voert de salt of IV niet apart in — de tool leest de salt van 16 byte en de IV van 12 byte uit het begin van de string, leidt de sleutel af met PBKDF2-HMAC-SHA256 (600.000 iteraties) en verifieert de aangehangen 128-bit GCM-tag voordat er tekst wordt teruggegeven. Klik op de versleutelingspagina op Voorbeeld laden om een nieuwe string te genereren, en ontsleutel hem dan hier.
Echte OpenSSL-/PBKDF2-uitvoer ontsleutelen
U2FsdGVkX18AESIzRFVmd1PBwxIFQpF+VgIhTK0aDHQ=
Attack at dawn!
Dit is echte uitvoer van openssl enc. Plak hem in, schakel over naar de OpenSSL-modus (Modus CBC, Sleuteltype Wachtwoordzin), voer de wachtwoordzin correct-horse in, kies de sleutelafleidingsfunctie PBKDF2 en zet iteraties op 10.000 — de platte tekst is Attack at dawn!. Het prefix U2FsdGVkX1 vertelde de tool dat dit het Salted__-formaat was, en de salt van 8 byte zit direct achter die header in de Base64. Je kunt de exacte ontsleuteling op de command line reproduceren: echo 'U2FsdGVkX18AESIzRFVmd1PBwxIFQpF+VgIhTK0aDHQ=' | openssl enc -d -aes-256-cbc -pbkdf2 -iter 10000 -pass pass:correct-horse -base64 -A. Als een vergelijkbare cijfertekst mislukt met PBKDF2, is deze waarschijnlijk gemaakt door CryptoJS — zet de KDF op EVP-MD5 en probeer opnieuw. Klik op OpenSSL-voorbeeld laden om deze waarden automatisch in te vullen.
AES-cijfertekst ontsleutelen
- 1
Plak de cijfertekst
Zet je Base64- of Hex-cijfertekst in het invoerveld. Begint hij met U2FsdGVkX1, dan markeert de tool hem als OpenSSL/CryptoJS-formaat en biedt aan je naar de juiste modus over te schakelen.
- 2
Stel het formaat en de modus in
Voor een zelfstandige string van deze tool laat je de wachtwoordzin-modus staan met de bijpassende GCM/CBC/CTR. Voor OpenSSL/CryptoJS-uitvoer accepteer je de overschakeling (CBC + wachtwoordzin). Voor ruwe-sleutel-data kies je Ruwe sleutel en de codering, en geef je de IV op als deze niet is voorafgevoegd.
- 3
Kies de sleutelafleidingsfunctie
Kies in de OpenSSL-modus PBKDF2 (en het aantal iteraties), EVP-SHA256 of EVP-MD5, passend bij hoe de sleutel is afgeleid. EVP-MD5 is de functie die CryptoJS gebruikt.
- 4
Voer de wachtwoordzin of sleutel in
Typ de exacte wachtwoordzin, of plak de exacte ruwe sleutel als hex of Base64. De platte tekst verschijnt rechts zodra alles overeenkomt.
- 5
Lees de diagnose als het mislukt
Geeft het ontsleutelen een fout, dan noemt het paneel de waarschijnlijke oorzaak — verkeerde IV, verkeerde sleutel, padding-fout, base64-vervuiling of een KDF-mismatch — zodat je één instelling tegelijk kunt aanpassen in plaats van te gokken.
Waarom AES-ontsleuteling mislukt — en hoe je het oplost
GCM-authenticatie mislukt
GCM weigert platte tekst terug te geven als de tag niet verifieert. De oorzaak is een verkeerde wachtwoordzin of sleutel, de verkeerde modus, een verkeerde IV, of gewijzigde/afgekapte cijfertekst — GCM kan niet zeggen welke. Controleer elk ervan opnieuw tegen hoe de data is versleuteld.
mode: CBC // but the data was encrypted with GCM => Authentication failed
mode: GCM, same passphrase and key size as encryption => plaintext
CBC: een verminkt eerste blok betekent de verkeerde IV
Bij CBC beïnvloedt de IV alleen het eerste blok van 16 byte. Is blok één onzin maar de rest netjes gedecodeerd, dan is je IV verkeerd; is alles onzin, dan is de sleutel verkeerd.
iv: 00000000000000000000000000000000 (wrong IV) => first block corrupt, rest readable
iv: (the exact IV used to encrypt) => Attack at dawn!
CBC-/PKCS#7-padding-fout
Een padding-fout betekent bijna altijd dat de sleutel verkeerd is; het kan ook betekenen dat de cijfertekst beschadigd, afgekapt was, of niet PKCS#7-gepad was. Bevestig dat de volledige cijfertekst is gekopieerd en dat de wachtwoordzin en KDF overeenkomen.
passphrase: hunter3 // one character off => padding error
passphrase: hunter2 // exact => plaintext
Base64- (of hex-)vervuiling
Regeleinden, spaties of typografische aanhalingstekens die samen met de cijfertekst zijn geplakt, verstoren het decoderen. De tool verwijdert witruimte automatisch, maar ontbrekende of extra tekens leiden nog steeds tot fouten.
“U2FsdGVkX1...” (curly quotes and trailing junk copied in)
U2FsdGVkX18AESIzRFVmd1PBwxIFQpF+VgIhTK0aDHQ= (clean Base64)
U2FsdGVkX1 gedetecteerd maar OpenSSL-modus staat uit
Begint de invoer met U2FsdGVkX1, dan kijk je naar OpenSSL/CryptoJS Salted__-uitvoer, die niet zal ontsleutelen als een normale wachtwoordzin-string. De tool toont een banner; klik op Overschakelen naar OpenSSL-modus en kies de KDF.
OpenSSL compatible: off input: U2FsdGVkX1... => cannot parse
OpenSSL compatible: on, KDF chosen => plaintext
KDF-mismatch (de CryptoJS-valkuil)
Een cijfertekst die mislukt met PBKDF2 of SHA-256 maar ontsleutelt met EVP-MD5, is geproduceerd door CryptoJS of openssl 1.0.2 en ouder. Op de command line hebben die -md md5 nodig.
KDF: PBKDF2 // CryptoJS ciphertext => padding error
KDF: EVP-MD5 // matches CryptoJS => plaintext
Wat je kunt doen met AES-ontsleuteling
- Ontsleutel de uitvoer van openssl enc
- Lees een Salted__-blob geproduceerd door openssl enc -aes-256-cbc zonder naar een terminal te gaan: plak de Base64, voer de wachtwoordzin in, kies de KDF, en krijg je platte tekst.
- Ontsleutel CryptoJS-cijfertekst
- Herstel data uit een verouderde app die CryptoJS AES.encrypt(text, passphrase) gebruikte. Selecteer EVP-MD5 om de enkele-pas-MD5-sleutelafleiding ervan te matchen — de stap die de meeste mensen missen.
- Debug een ontsleuteling die blijft mislukken
- Wanneer je eigen code iets niet kan ontsleutelen, plak het dan hier om te isoleren of het probleem bij de sleutel, de IV, de modus, de codering of de KDF ligt, met behulp van het diagnosepaneel.
- Verifieer een versleutelings-round-trip
- Bevestig dat cijfertekst van de AES-versleutelingspagina of uit je app terug ontsleutelt naar exact de oorspronkelijke bytes.
- Begrijp een onbekende cijfertekst
- Identificeer een formaat aan zijn vorm — een U2FsdGVkX1-prefix, of een prefix van vaste lengte die op een IV lijkt — en zoek uit hoe deze is geproduceerd voordat je een sleutel probeert.
Interne werking en formaten van AES-ontsleuteling
- GCM-ontsleuteling — geauthenticeerd
- GCM herberekent de 128-bit tag over de cijfertekst en vergelijkt deze voordat er platte tekst wordt teruggegeven; bij een mismatch wordt een fout gegooid in plaats van beschadigde data te lekken. Het gebruikt de voorafgevoegde IV van 96 bit. Een GCM-mislukking betekent dat de sleutel, modus, IV of cijfertekst verkeerd is — het cijfer zelf kan je niet vertellen welke.
- CBC-ontsleuteling — let op het eerste blok en de padding
- CBC heeft twee onderscheiden foutpatronen. Is alleen het eerste blok van 16 byte verminkt en ziet de rest er goed uit, dan was de IV verkeerd. Is elk blok onzin, dan is de sleutel verkeerd. Een PKCS#7-padding-fout betekent meestal dat de sleutel verkeerd is, of dat de cijfertekst beschadigd of afgekapt is. CBC heeft geen tag (in tegenstelling tot een geauthenticeerde constructie zoals een HMAC), dus een verkeerde sleutel kan zelfs ontsleutelen naar bytes die er plausibel uitzien.
- CTR-ontsleuteling — stil bij een fout
- CTR gooit nooit een fout: een verkeerde sleutel levert gewoon onzin op, wat meestal naar boven komt als een 'geen geldige UTF-8'-fout zodra de bytes naar tekst worden gedecodeerd. Match de teller/IV exact. Omdat er geen integriteitscontrole is, moet je elke CTR-uitvoer die je niet apart hebt geauthenticeerd met argwaan behandelen.
- Cijfertekst-indelingen (F1 / F2 / F3)
- Formaat 1 (wachtwoordzin) is salt(16), dan IV, dan cijfertekst, met de GCM-tag van 16 byte aangehangen in de GCM-modus. Formaat 2 (ruwe sleutel) is IV, dan cijfertekst, of kale cijfertekst met apart opgegeven IV. Formaat 3 (OpenSSL) is de ASCII-header Salted__, dan een salt van 8 byte, dan de cijfertekst. Weten welke indeling je hebt, vertelt de tool waar de salt en IV zich bevinden, en een ruwe sleutel zou zelf uit een CSPRNG moeten komen — zie de geheime-sleutelgenerator.
- Sleutelafleiding: matchen met wat de data versleutelde
- Voor zelfstandige wachtwoordzin-cijfertekst gebruikt deze tool PBKDF2-HMAC-SHA256 bij 600.000 iteraties. Voor OpenSSL/CryptoJS-cijfertekst moet je de gebruikte KDF selecteren: PBKDF2 (de standaard van openssl -pbkdf2 is 10.000 iteraties — stel je exacte aantal in), EVP_BytesToKey met SHA-256 (openssl 1.1+ zonder -pbkdf2), of EVP_BytesToKey met MD5 en één enkele pas (CryptoJS en openssl 1.0.2 en ouder). De klassieke 'het wil niet ontsleutelen'-bug is een CryptoJS- of oud-openssl-cijfertekst die wordt geprobeerd met SHA-256 — schakel over naar EVP-MD5 en het werkt.
Best practices voor AES-ontsleuteling
- Begin met het identificeren van het formaat
- Voordat je aan instellingen sleutelt, kijk naar de cijfertekst. Een U2FsdGVkX1-prefix betekent OpenSSL/CryptoJS; een zelfstandige string van deze tool is het wachtwoordzin-formaat; een kale blob heeft meestal een ruwe sleutel en een aparte IV nodig.
- Match de sleutelafleidingsfunctie exact
- Bij OpenSSL/CryptoJS-cijfertekst is de KDF net zo belangrijk als de wachtwoordzin. Mislukt PBKDF2, probeer dan EVP-MD5 (CryptoJS, oud openssl); ook het aantal iteraties moet overeenkomen, niet alleen het algoritme.
- Plak de cijfertekst schoon
- Losse regeleinden of spaties die zijn meegekopieerd, kunnen Base64 beschadigen. Deze tool verwijdert witruimte automatisch, maar als het decoderen nog steeds mislukt, controleer dan op typografische aanhalingstekens, ontbrekende tekens of een afgekapte kopie. Onze Base64-tool kan je helpen een verdachte string te inspecteren.
- Behandel een verkeerd-sleutel-resultaat eerlijk
- Bij CTR of CBC kan een verkeerde sleutel bytes opleveren in plaats van een fout. Ziet de uitvoer eruit als onzin of faalt hij op de UTF-8-check, dan is de sleutel of IV verkeerd — vertrouw geen gedeeltelijk plausibel uitziende uitvoer.
- Stuur nooit geheime cijfertekst of sleutels naar een server
- Het punt van ontsleutelen in de browser is dat niets de pagina verlaat. Vermijd tools die uploaden; deze gebruikt Web Crypto lokaal, en je kunt dat verifiëren met het tabblad Netwerk of door offline te gaan. AES-256 is sterk — CNSA 2.0-goedgekeurd voor TOP SECRET — dus als je niet kunt ontsleutelen, ligt het probleem bij de parameters, niet bij het cijfer.
Veelgestelde vragen over AES-ontsleuteling
Kan je AES ontsleutelen zonder de sleutel?
Hoe ontsleutel ik de uitvoer van openssl enc?
Wat betekent U2FsdGVkX1 aan het begin van een cijfertekst?
Hoe ontsleutel ik CryptoJS-cijfertekst?
GCM versus CBC — waarom ontsleutelt mijn cijfertekst op de ene manier en niet op de andere?
Worden mijn cijfertekst of sleutel geüpload wanneer ik hier ontsleutel?
Wat is het verschil tussen een wachtwoordzin en een ruwe sleutel bij het ontsleutelen?
Gerelateerde tools
Alle tools bekijken →AES-versleutelingstool — GCM, CBC & CTR
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.
Bcrypt-hashgenerator & -verifier
Beveiligingstools
Genereer en verifieer bcrypt-wachtwoordhashes online — instelbare kostenfactor, $2b$/$2a$/$2y$-prefixes. 100% in je browser; je wachtwoord wordt nooit geüpload.
HMAC-generator en handtekeningverificatie
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.
JWT decoderen — online JWT-decoder
Beveiligingstools
Decodeer JWT-tokens direct in je browser. Inspecteer header, payload, signature, vervaldatum en claims. 100% privé — je token verlaat je apparaat nooit.
JWT-encoder & generator
Beveiligingstools
Gratis online JWT-generator & encoder. Bouw de header en payload en onderteken direct met HS256, RS256 of ES256. 100% in de browser — je secret en sleutel verlaten je apparaat nooit.
Gratis JWT-secretgenerator — HS256/384/512
Beveiligingstools
Genereer een sterk, RFC-correct JWT-secret voor HS256/384/512 — 100% in je browser, nooit naar een server gestuurd. base64url, base64 of hex; kopieer voor .env.