Skip to content

AES-versleutelingstool — GCM, CBC & CTR

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.

Geen tracking Draait in je browser Gratis
Alles gebeurt in je browser — je sleutel en data verlaten deze pagina nooit.
Aanbevolen
Sleutelgrootte
Sleuteltype
Geavanceerde opties
Cijfertekst
De speciale ontsleutelingspagina nodig?
Beoordeeld op cryptografische juistheid tegen FIPS 197, NIST SP 800-38D, OWASP en de W3C Web Crypto-specificatie — Go-Tools Security Team · Jul 16, 2026

Wat is AES-versleuteling?

AES (de Advanced Encryption Standard) is een symmetrisch blokcijfer, gestandaardiseerd door NIST in FIPS 197 in 2001, gebaseerd op het Rijndael-ontwerp van Joan Daemen en Vincent Rijmen. Het versleutelt data in vaste blokken van 128 bit met een sleutel van 128, 192 of 256 bit, waarbij dezelfde sleutel zowel versleutelt als ontsleutelt. Het is het werkpaard van de moderne cryptografie en beschermt alles van HTTPS-verkeer tot schijfversleuteling.

Een kaal blokcijfer husselt slechts één blok van 16 byte door elkaar, dus AES draait altijd binnen een bedrijfsmodus die blokken aan elkaar koppelt. Deze tool biedt er drie, allemaal native geleverd door de Web Crypto API van de browser: GCM, CBC en CTR. GCM (Galois/Counter Mode, NIST SP 800-38D) is de aanbevolen standaard omdat het geauthenticeerd is — het produceert een 128-bit authenticatietag naast de cijfertekst, zodat elke manipulatie wordt gedetecteerd bij het ontsleutelen. CBC en CTR bieden alleen vertrouwelijkheid; op zichzelf kunnen ze je niet vertellen of de cijfertekst is gewijzigd, wat de reden is waarom TLS 1.3 (RFC 8446) elke CBC-cijfersuite liet vallen ten gunste van geauthenticeerde modi zoals GCM.

Je zult merken dat er hier geen ECB-modus is, en dat is opzettelijk. ECB versleutelt elk identiek blok platte tekst naar hetzelfde cijfertekstblok, waardoor grootschalige structuur er zo doorheen lekt — de beroemde 'ECB-pinguïn'-afbeelding is na versleuteling nog altijd duidelijk herkenbaar als pinguïn. De Web Crypto API laat ECB precies om deze reden weg (hij implementeert alleen AES-CBC, AES-CTR en AES-GCM), en wij dus ook. Als je moet interopereren met een verouderd systeem dat ECB gebruikte, zie dat dan als een reden om het te migreren, niet om de zwakte te reproduceren.

Omdat de meeste mensen een wachtwoordzin typen in plaats van een willekeurige sleutel van 32 byte, leidt de tool de AES-sleutel van je wachtwoordzin af met PBKDF2-HMAC-SHA256 bij 600.000 iteraties en een willekeurige salt van 16 byte, in lijn met de huidige OWASP-richtlijn voor wachtwoordopslag (en NIST SP 800-132, die een salt van minstens 128 bit vereist). Dat maakt brute-forcen van een zwakke wachtwoordzin traag, maar het is geen magie: dit is een tool om modi te leren, cijfertekst te debuggen en voor eenmalige persoonlijke data — niet om productiegeheimen te beschermen, die thuishoren in een toegewijd sleutelbeheersysteem. Voor een sterke wachtwoordzin genereer je er een met onze willekeurige-wachtwoordgenerator; voor een echte willekeurige sleutel gebruik je de geheime-sleutelgenerator.

// AES-256-GCM 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 aesGcmEncrypt(plaintext, passphrase) {
  const enc = new TextEncoder();
  const salt = crypto.getRandomValues(new Uint8Array(16));
  const iv = crypto.getRandomValues(new Uint8Array(12));
  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, ['encrypt']);
  const ct = new Uint8Array(await crypto.subtle.encrypt(
    { name: 'AES-GCM', iv }, key, enc.encode(plaintext)));
  const packed = new Uint8Array([...salt, ...iv, ...ct]); // salt(16) | iv(12) | ct+tag
  return btoa(String.fromCharCode(...packed));            // self-contained Base64
}

Belangrijkste functies

Standaard geauthenticeerde GCM-versleuteling

GCM produceert de cijfertekst plus een 128-bit authenticatietag, zodat het ontsleutelen luid mislukt als ook maar één byte is gewijzigd. CBC en CTR zijn één klik verwijderd voor wanneer je ermee moet interopereren.

Zelfstandige cijfertekst

De wachtwoordzin-modus verpakt de willekeurige salt, IV en tag in één Base64-string, zodat wie ontsleutelt alleen de wachtwoordzin nodig heeft — er zijn geen aparte velden om te kopiëren of kwijt te raken.

Wachtwoordzin of ruwe sleutel

Typ een wachtwoordzin (opgerekt met PBKDF2-HMAC-SHA256, 600.000 iteraties) of plak een exacte sleutel van 128/192/256 bit als hex of Base64, met een live byte-teller die de lengte bevestigt.

OpenSSL-compatibele uitvoer

Schakel de OpenSSL-modus in om het Salted__-formaat te produceren dat het enc-commando van OpenSSL en CryptoJS lezen, met het overeenkomende CLI-commando live getoond zodat je het in een terminal kunt reproduceren.

100% in je browser

Elke byte wordt lokaal versleuteld met de Web Crypto API. Open je tabblad Netwerk en je ziet niets de pagina verlaten — het werkt zelfs offline.

Base64- of Hex-uitvoer

Kopieer het resultaat in de codering die je doelsysteem verwacht, en inspecteer de lengtes van salt, IV, cijfertekst en tag in de segment-uitsplitsingsbalk.

Voorbeelden van AES-versleuteling

GCM + wachtwoordzin (zelfstandig, niet-deterministisch)

The quick brown fox jumps over the lazy dog.
salt (16 B) + IV (12 B) + cijfertekst + tag (16 B), Base64-gecodeerd — bij elke run een nieuwe waarde

Met Modus GCM, Sleutelgrootte 256, Sleuteltype Wachtwoordzin en de wachtwoordzin hunter2 wordt deze zin versleuteld tot één zelfstandige Base64-string. Versleutel hem twee keer en je krijgt twee volledig verschillende uitkomsten — dat is opzettelijk. De wachtwoordzin-modus genereert bij elke versleuteling een nieuwe salt van 16 byte en een nieuwe IV van 12 byte, zodat identieke platte tekst nooit dezelfde cijfertekst oplevert en een waarnemer niet kan zien dat twee berichten hetzelfde zijn. De segmentbalk onder de uitvoer toont de exacte indeling: eerst de salt, dan de IV, dan de cijfertekst met de bijbehorende 128-bit GCM-tag erachter. Om te ontsleutelen heeft de ontvanger alleen de wachtwoordzin en dezelfde modus en sleutelgrootte nodig — de salt, IV en tag reizen allemaal mee in de string.

OpenSSL-compatibele uitvoer (CBC + wachtwoordzin)

Attack at dawn!
U2FsdGVkX18AESIzRFVmd1PBwxIFQpF+VgIhTK0aDHQ=

Schakel de OpenSSL-compatibele modus in met Modus CBC, Sleuteltype Wachtwoordzin, de wachtwoordzin correct-horse, KDF PBKDF2 en 10.000 iteraties. De tool geeft dan het OpenSSL-formaat Salted__ als uitvoer: Base64 die altijd begint met U2FsdGVkX1, de Base64-codering van de 8-byte Salted__-header. Omdat elke keer een nieuwe willekeurige salt van 8 byte wordt gegenereerd, verandert de exacte string bij elke run, maar elke variant is op de command line te ontsleutelen met: echo 'U2FsdGVkX18AESIzRFVmd1PBwxIFQpF+VgIhTK0aDHQ=' | openssl enc -d -aes-256-cbc -pbkdf2 -iter 10000 -pass pass:correct-horse -base64 -A — wat Attack at dawn! oplevert. Kies EVP-MD5 in plaats van PBKDF2 om overeen te komen met CryptoJS of OpenSSL 1.0.2 en ouder. Let op: openssl enc ondersteunt geen GCM, dus de OpenSSL-modus is alleen CBC.

Tekst versleutelen met AES

  1. 1

    Kies een modus en sleutelgrootte

    Laat Modus op GCM (aanbevolen) en Sleutelgrootte op 256 staan voor de sterkste zinvolle standaardinstelling. Schakel alleen over naar CBC of CTR als een systeem waarop je mikt dit vereist.

  2. 2

    Kies wachtwoordzin of ruwe sleutel

    Laat Sleuteltype op Wachtwoordzin staan en voer een sterke wachtwoordzin in, of schakel over naar Ruwe sleutel en plak een exacte sleutel van 128/192/256 bit als hex of Base64. De byte-teller bevestigt of je ruwe sleutel een geldige lengte heeft.

  3. 3

    Voer de te versleutelen tekst in

    Typ of plak je platte tekst. Versleuteling gebeurt automatisch terwijl je typt, volledig in je browser — geen knop-rondweg en geen upload.

  4. 4

    Kopieer de zelfstandige cijfertekst

    Het Base64-resultaat rechts bevat al de salt, IV en authenticatietag. Gebruik de segmentbalk om de byte-indeling te zien en klik dan op Kopiëren. Zet de uitvoercodering op Hex als je doelsysteem dat verwacht.

  5. 5

    Ontsleutel het later terug

    Geef de cijfertekst, de wachtwoordzin en dezelfde modus en sleutelgrootte aan de ontvanger, of open de AES-ontsleutelingspagina om het zelf ongedaan te maken.

Veelvoorkomende fouten bij AES-versleuteling

Een wachtwoordzin verwarren met een ruwe sleutel

Een ruwe sleutel moet precies 16, 24 of 32 byte willekeurige data zijn (ingevoerd als hex of Base64); een wachtwoordzin is willekeurige tekst en moet eerst door een KDF worden opgerekt. Als je Ruwe sleutel selecteert en een menselijke wachtwoordzin plakt, geeft dat ofwel een lengtefout ofwel een zwakke sleutel.

✗ Fout
Key type: Raw key
Key (hex): correct horse battery staple   (not hex, not 32 bytes)
✓ Correct
Key type: Passphrase
Passphrase: correct horse battery staple   (stretched with PBKDF2)

Een IV hergebruiken met dezelfde sleutel

De IV moet uniek zijn per bericht onder een gegeven sleutel. Hem hergebruiken is fataal voor GCM (het kan de authenticatiesleutel lekken) en breekt de vertrouwelijkheid voor CBC en CTR. Laat de tool elke keer een nieuwe willekeurige IV genereren.

✗ Fout
// same key, same IV for two messages
encrypt(key, iv, a); encrypt(key, iv, b);
✓ Correct
// fresh random IV each time (the default)
encrypt(key, randomIV(), a);

De salt, IV of tag kwijtraken

Als je alleen de cijfertekst-bytes kopieert en de voorafgaande salt/IV — of de aangehangen GCM-tag — weglaat, kan de data nooit worden ontsleuteld. Bewaar de hele zelfstandige string, niet alleen het middenstuk ervan.

✗ Fout
stored = ciphertext              // salt + IV + tag thrown away
✓ Correct
stored = salt + iv + ciphertext + tag   // the full Base64 string

Verwachten dat GCM-uitvoer bij elke run overeenkomt

GCM (en de wachtwoordzin-modus in het algemeen) gebruikt een willekeurige salt en IV, dus dezelfde tekst versleutelt elke keer tot een andere Base64-string. Dat is een veiligheidsfunctie, geen bug — het betekent dat een afluisteraar niet kan zien dat twee cijferteksten hetzelfde bericht versleutelen.

✗ Fout
assert(encrypt(msg) === encrypt(msg))   // fails — and should
✓ Correct
assert(decrypt(encrypt(msg)) === msg)   // this is what must hold

Wat je kunt doen met AES-versleuteling

Leer hoe AES-modi zich gedragen
Wissel met dezelfde invoer tussen GCM, CBC en CTR om te zien hoe authenticatie, IV-lengte en cijfertekstgrootte veranderen. Een praktische manier om te begrijpen wat NIST SP 800-38D daadwerkelijk voorschrijft.
Produceer cijfertekst die een ander systeem kan lezen
Genereer uitvoer in het OpenSSL-formaat Salted__ (of als ruwe sleutel plus IV), zodat een backend, script of collega die openssl of een cryptobibliotheek gebruikt het zonder wrijving kan ontsleutelen.
Versleutel een korte notitie of snippet
Bescherm een eenmalig stukje persoonlijke tekst — een herstelzin die je tussen apparaten verplaatst, een snippet in een supportticket — met een wachtwoordzin die alleen jij kent. Niet voor gereguleerde of productiegeheimen.
Prototype een versleutelingsformaat
Leg hier je indeling van salt/IV/tag en je KDF-instellingen vast voordat je de code schrijft, met behulp van de segment-uitsplitsing om bytevolgorde en -lengtes te bevestigen.
Genereer testvectoren
Maak bekende cijfertekst met een vaste wachtwoordzin en modus om je eigen ontsleutelingstests te voeden, en verifieer daarna de round-trip op de AES-ontsleutelingspagina.

AES-modi & sleutelafleiding

GCM (Galois/Counter Mode) — geauthenticeerd, aanbevolen
Vertrouwelijkheid plus een 128-bit authenticatietag (NIST SP 800-38D). Het gebruikt een IV van 96 bit (12 byte), willekeurig gegenereerd per versleuteling, en zowel versleutelen als ontsleutelen parallelliseren goed. De ene regel die je nooit mag breken: hergebruik nooit een IV met dezelfde sleutel. SP 800-38D beperkt één sleutel tot ongeveer 2^32 willekeurig gegenereerde IV's, en een herhaling lekt de XOR van twee platte teksten en kan zelfs de authenticatiesleutel blootleggen die de tag beschermt. Het beste voor bijna alles.
CBC (Cipher Block Chaining) — alleen vertrouwelijkheid
Elk blok wordt ge-XOR'd met het vorige cijfertekstblok, met een willekeurige IV van 16 byte. Het heeft geen ingebouwde authenticatie, dus het moet worden gecombineerd met een aparte MAC — encrypt-then-MAC, bijvoorbeeld met onze HMAC-generator — en het is van oudsher gevoelig voor padding-oracle-aanvallen (Vaudenay, EUROCRYPT 2002). Hier aangeboden voor interoperabiliteit met OpenSSL en oudere systemen.
CTR (Counter) — alleen vertrouwelijkheid, streamachtig
Verandert AES in een streamcijfer door een teller te versleutelen, zodat elke bytelengte werkt zonder padding en blokken vrij parallelliseren. Net als CBC biedt het op zichzelf geen integriteit, en het hergebruiken van de teller/IV onder één sleutel is catastrofaal. Nuttig wanneer je willekeurige toegang of streaming-semantiek nodig hebt.
ECB — niet aangeboden (met opzet)
Electronic Codebook versleutelt elk blok onafhankelijk, zodat identieke blokken platte tekst identieke cijfertekst opleveren en patronen lekken — de beruchte 'ECB-pinguïn'. De Web Crypto API implementeert het bewust niet, en wij ook niet. Als een verouderd systeem ECB vereist, zie dat dan als een bug om te repareren in plaats van een formaat om te reproduceren.
Sleutelafleiding: 600.000 vs. 10.000 vs. 1 iteratie
In de standaard wachtwoordzin-modus gebruikt deze tool PBKDF2-HMAC-SHA256 bij 600.000 iteraties (dezelfde SHA-256-hash honderdduizenden keren toegepast) met een salt van 16 byte, volgens OWASP. In de OpenSSL-compatibele modus gebruikt PBKDF2 standaard slechts 10.000 iteraties (de standaard van openssl enc), en de verouderde KDF EVP_BytesToKey die CryptoJS en oud OpenSSL gebruiken, voert één enkele MD5-pas uit — ordes van grootte zwakker. Meer iteraties betekenen een trager brute-force per gok, wat de reden is waarom de moderne standaard zoveel hoger ligt. Argon2 en scrypt zijn nog sterker, maar maken geen deel uit van Web Crypto en vallen hier dus buiten scope; volg voor wachtwoordopslag OWASP en geef de voorkeur aan Argon2id.

Best practices voor AES-versleuteling

Geef de voorkeur aan GCM, tenzij een tegenpartij iets anders vereist
Geauthenticeerde versleuteling vangt manipulatie op die CBC en CTR stilzwijgend doorlaten. Schakel alleen naar CBC of CTR voor interoperabiliteit, en voeg in dat geval een MAC toe.
Gebruik voor elk bericht een nieuwe willekeurige IV
De tool doet dit automatisch. Als je de IV handmatig overschrijft, hergebruik er dan nooit een met dezelfde sleutel — bij GCM is een herhaling catastrofaal, en bij CBC breekt het de semantische veiligheid.
Kies sterke wachtwoordzinnen en echte willekeurige sleutels
PBKDF2 vertraagt brute force maar kan een zwakke wachtwoordzin niet redden. Genereer een lange wachtwoordzin met de wachtwoordgenerator, of een echte willekeurige sleutel met de geheime-sleutelgenerator.
Bewaar de salt, IV en tag bij de cijfertekst
Ze zijn niet geheim, maar zonder hen mislukt het ontsleutelen. Het zelfstandige formaat van deze tool bundelt alle drie; als je de modus met ruwe sleutel en kale cijfertekst gebruikt, kopieer de IV dan apart en bewaar hem samen met de cijfertekst.
Versleutel geen productie- of gereguleerde geheimen in enige online tool
Zelfs volledig client-side is een browser-tool bedoeld voor leren, debuggen en persoonlijke eenmalige gevallen. Echte geheimen horen thuis in een gecontroleerd sleutelbeheersysteem met geauditeerde sleutelverwerking en -rotatie. AES-256 zelf is sterk — goedgekeurd onder de CNSA 2.0-suite van de NSA voor informatie tot en met TOP SECRET — en echte inbreuken ontstaan door implementatiefouten, niet door het cijfer.

Veelgestelde vragen over AES-versleuteling

Is het veilig om tekst online te versleutelen?
Bij deze tool vindt de versleuteling zelf volledig in je browser plaats — je tekst, wachtwoordzin en sleutel gaan nooit naar een server, wat je kunt controleren door het tabblad Netwerk in de gaten te houden. Dat maakt het veilig voor leren, debuggen en eenmalige persoonlijke gegevens. Het is niet de juiste plek voor productiegeheimen, gereguleerde data of iets dat langdurig sleutelbeheer vereist, en dat geldt voor elke online tool: een browserpagina kan geen geauditeerde sleutelopslag, rotatie of toegangscontrole bieden. Versleutel hier wegwerp- en persoonlijke zaken, en bewaar echte geheimen in een toegewijd systeem.
Kan AES zonder de sleutel worden ontsleuteld?
Nee. AES heeft geen bekende praktische zwakte, dus zonder de sleutel of wachtwoordzin is er geen kortere weg — een aanvaller kan alleen sleutels één voor één uitproberen. AES-256 heeft 2^256 mogelijke sleutels; zelfs bij een biljoen biljoen pogingen per seconde zou je nog altijd veel langer dan de leeftijd van het heelal nodig hebben om een betekenisvol deel te doorzoeken. De realistische risico's zitten nooit in het cijfer zelf: het is een zwakke wachtwoordzin, een hergebruikte IV, een gelekte sleutel of een padding-oracle in een slecht gebouwd systeem. Kies een sterke wachtwoordzin en niets daarvan is van toepassing. Wie sleutelloze 'AES-herstel' aanbiedt, verkoopt oplichting.
GCM versus CBC — welke modus moet ik gebruiken?
Gebruik GCM. Het biedt vertrouwelijkheid plus een ingebouwde 128-bit authenticatietag, zodat het ontsleutelen mislukt in plaats van stilzwijgend beschadigde data terug te geven als ook maar één byte van de cijfertekst is gewijzigd. CBC verbergt alleen de data; op zichzelf kan het geen manipulatie detecteren en heeft het een lange geschiedenis van padding-oracle-kwetsbaarheden (Vaudenay, EUROCRYPT 2002), wat de reden is waarom TLS 1.3 (RFC 8446) elke CBC-cijfersuite heeft verwijderd. De enige goede reden om hier voor CBC te kiezen is interoperabiliteit met een bestaand systeem — bijvoorbeeld het enc-commando van OpenSSL, dat geen GCM ondersteunt.
AES-128 versus AES-256 — is 256 de moeite waard?
Beide worden als veilig beschouwd; AES-128 is niet gekraakt en iets sneller. AES-256 heeft een grotere sleutel en een grotere veiligheidsmarge, en het is de omvang die is goedgekeurd onder de CNSA 2.0-suite van de NSA voor informatie tot en met TOP SECRET, wat het een verstandige standaardkeuze maakt. De kosten zijn minimaal — een paar extra rondes per blok. Tenzij je een zeer prestatiekritisch pad optimaliseert, versleutel met AES-256; de extra veiligheidsmarge is in de praktijk vrijwel gratis.
Wordt mijn data geüpload wanneer ik hier versleutel?
Nee. Alle versleuteling gebeurt lokaal via de Web Crypto API van de browser (crypto.subtle), dezelfde geauditeerde implementatie die je browser gebruikt voor HTTPS. Niets van wat je typt wordt ergens naartoe gestuurd — je kunt het Netwerk-paneel van je ontwikkelaarstools openen, iets versleutelen en zien dat er nul verzoeken worden verstuurd, of volledig offline gaan en de tool blijft werken. SubtleCrypto is alleen beschikbaar in beveiligde (HTTPS-)contexten, wat mede de reden is waarom deze garantie standhoudt.
Wat is het verschil tussen een wachtwoordzin en een sleutel?
Een sleutel is precies 128, 192 of 256 bit willekeurige data — voor AES-256 is dat 32 ruwe bytes, meestal geschreven als hex of Base64. Een wachtwoordzin is door mensen getypte tekst van willekeurige lengte en is zelf geen sleutel: hij moet eerst door een sleutelafleidingsfunctie worden opgerekt. Deze tool doet dat automatisch in de wachtwoordzin-modus met PBKDF2-HMAC-SHA256, 600.000 iteraties en een willekeurige salt. Ze door elkaar halen — een wachtwoordzin in het veld voor de ruwe sleutel plakken, of andersom — is een van de meest voorkomende redenen waarom twee systemen het niet eens worden over een cijfertekst. (Voor ondertekende tokens in plaats van versleuteling, zie de JWT-encoder.)
Kan ik zo versleutelen dat OpenSSL of CryptoJS het kan ontsleutelen?
Ja. Schakel de OpenSSL-compatibele modus in (met AES-CBC en een wachtwoordzin) en de tool geeft het Salted__-formaat dat het enc-commando van OpenSSL en CryptoJS begrijpen, en toont je het exact overeenkomende openssl-commando. Kies de juiste sleutelafleidingsfunctie: PBKDF2 voor modern OpenSSL (de standaard van openssl -pbkdf2 is 10.000 iteraties), EVP-SHA256 voor OpenSSL 1.1+ zonder -pbkdf2, of EVP-MD5 voor CryptoJS en OpenSSL 1.0.2 en ouder. Om de andere kant op te gaan en de cijfertekst van iemand anders te lezen, gebruik je de AES-ontsleutelingstool.

Gerelateerde tools

Alle tools bekijken →