AES-kryptering / -dekryptering

Krypter eller dekrypter med AES-128, AES-192 eller AES-256 (FIPS 197) i GCM (autentisert kryptering), CBC, CTR eller ECB-modus. Nøkler er rå heks- eller Base64-byte, eller utledet fra et passord med PBKDF2-HMAC-SHA256. GCM støtter AAD og viser autentiseringstaggen separat; CBC-, CTR- og ECB-utdata er kompatible med OpenSSL enc. For hasher, se Hash-generatoren, for nøklede MAC-er HMAC-generatoren, og for eldre chiffer siden for eldre chiffer i denne familien.
Kjører helt lokalt — nøkler og klartekst forlater aldri fanen. Filer opptil 200 MB.
Alt som skrives inn her blir i denne fanen — men det betyr ikke det samme som «trygt for produksjonshemmeligheter». Nettleserminnet, utvidelser og folk som titter over skulderen ser det man limer inn. Bruk denne siden til å lære, verifisere og teste interoperabilitet, ikke til å håndtere ekte kundedata.
Retning: Modus: Utdata:
GCM = AES-GCM med 12-byte nonce og 128-bit autentiseringstagg (AEAD: konfidensialitet + integritet). Standard når sikkerhet er målet.
Heks tåler mellomrom, kolon og 0x-prefikser.
Gjenbruk aldri en nonce under samme nøkkel i GCM eller CTR.
Taglengde:
Parameterlinjene registrerer den eksakte tolkningen av nøkkelen, IV-en, AAD-størrelsen og taggen, slik at et kopiert resultat alltid kan reproduseres på en annen maskin.
Hvilken modus bør man velge?
GCM er standardsvaret: den krypterer og autentiserer — taggeringen gjør manipulering synlig (prøv å dekryptere med en snudd tagg-byte, så avviser siden det). CBC skjuler blokkmønstre, men gir ingen integritet; kombiner den med en HMAC (se HMAC-generatoren) hvis man må bruke den. CTR gjør AES om til en strømchiffer — ingen utfylling, men en gjenbrukt nonce under samme nøkkel er katastrofal i både CTR og GCM. ECB finnes her kun for kompatibilitet og undervisning: identiske klartekstblokker krypteres til identiske chifferblokker (den berømte ECB-pingvinen).
OpenSSL-interoperabilitet — CBC- og CTR-utdata fra denne siden (PKCS#7-utfylling, rå nøkkel) fungerer toveis med kommandolinjen openssl enc:
openssl enc -aes-256-cbc -K <64-hex-nøkkel> -iv <32-hex-iv> -in msg.txt -out msg.enc
openssl enc -d -aes-256-cbc -K <nøkkel> -iv <iv> -in msg.enc -out msg.txt
Det samme gjelder -aes-128-cbc, -aes-192-cbc og -aes-256-ctr (16-byte IV = startblokken for telleren). Merk at openssl enc ikke støtter GCM — bruk denne siden, eller openssl aesgcm fra OpenSSL 3.3+, for autentisert kryptering.
Trenger man i stedet den kinesiske nasjonale chifferen?
SM4 (GB/T 32907-2016) — blokkchifferet som er påbudt i kinesisk kommersiell kryptografi, med samme 128-bit blokk- og nøkkelstørrelse som AES, men med egen nøkkelplan og egen S-boks — kjører på sin egen side i ECB- og CBC-modus: SM4-kryptering / -dekryptering. Resten av SM-familien ligger der også: SM3 (hash), SM2 (offentlig nøkkel) og SM9 (identitetsbasert kryptografi).
Selvtest
Kjører sidens motorer mot uavhengige ankerverdier: kjente svarvektorer for alle fire modi (generert av en uavhengig native implementasjon), GCM-taggvektorer med og uten AAD, krysskontroll av WebCrypto-motoren mot den rene JS-AES-motoren, GCM-rundtur og negative tester (manipulert tagg og feil nøkkel må feile). Ingenting sendes noen vei.
AES-kryptering forklart fra grunnen
Kort sagt: AES er den verdensomspennende standarden for blokkchiffer — den blander 16-byte-blokker under en nøkkel på 128, 192 eller 256 bit — og modusen man kjører den i (GCM, CBC, CTR, ECB) avgjør hvordan blokkene kjedes sammen, hva IV-en er til for, og om manipulering kan oppdages. Velg GCM med mindre det finnes en grunn til å la være.
Hva AES selv er (FIPS 197)

Blokkchifferet. AES (Rijndael-designet, standardisert av NIST i 2001 som FIPS 197) krypterer nøyaktig 16 byte om gangen. Nøkkellengden — 16, 24 eller 32 byte — velger AES-128, -192 eller -256 og antall interne runder (10, 12, 14). Hver runde blander blokken med rundenøkler avledet fra nøkkelen, gjennom substitusjonstabeller, radforskyvninger og kolonneblandinger. Ingen praktisk angrep bryter selve chifferet: de reelle feilene er nesten alltid feil i modus, IV eller nøkkelhåndtering, og det er det resten av denne siden handler om.

Hvorfor en modus i det hele tatt? Fordi meldinger sjelden er 16 byte. Modusen binder blokkkrypteringene sammen: ECB krypterer blokker uavhengig av hverandre; CBC XOR-er hver blokk med forrige chiffertekst; CTR krypterer en teller og XOR-er den med dataene som en strømchiffer; GCM bygger på CTR og legger til en autentiseringstagg. AES er den samme — modusen endrer alt om garantiene man får.

Nøkler og passord. En AES-nøkkel er 16, 24 eller 32 tilfeldige byte. Et menneskelig passord er ikke det: denne sidens passordalternativ utleder en skikkelig nøkkel med PBKDF2-HMAC-SHA256 (600 000 iterasjoner som standard, OWASPs grunnlinje fra 2023 — se HMAC-generatoren for detaljer om KDF). Bruk aldri en passordstreng direkte som AES-nøkkel: entropien er en liten brøkdel av lengden.

De fire modusene sammenlignet
ModusIV / nonceIntegritetMerknader
GCM12 byte, unik per meldingJa — 96..128-bit taggAEAD: standardvalget overalt (TLS 1.3, SSH, filformater). Godtar også AAD.
CBC16 byte, uforutsigbarNeiPKCS#7-utfylling; klassisk, men trenger en MAC ved siden av. Utfyllingsorakel-feil er den klassiske CBC-fellen.
CTR16-byte starttellerNeiIngen utfylling, strømliknende, tilfeldig tilgang; gjenbruk av nonce under én nøkkel lekker klartekst XOR klartekst.
ECBingenNeiIdentiske blokker → identisk chiffertekst. ECB-pingvin-demonstrasjonen. Kun for kompatibilitet.

IV-regler i ett avsnitt. IV-en er ikke hemmelig — send den sammen med chifferteksten — men kravene til unikhet er forskjellige: CBC krever en uforutsigbar IV; GCM og CTR krever bare at samme nonce aldri gjenbrukes med samme nøkkel (gjenbruk av nonce i GCM er verre: den lekker autentiseringsnøkkelen). Denne sidens knapp for tilfeldig IV bruker nettleserens sikre tilfeldighetsgenerator; knappen for bare nuller finnes for å reprodusere testvektorer, ikke for ekte meldinger.

Utfylling. CBC og ECB trenger hele blokker, så PKCS#7-utfylling legger til 1..16 byte, og hver av dem er lik utfyllingens lengde. Derfor vokser CBC-chiffertekster med opptil 16 byte, og derfor feiler dekryptering med feil nøkkel vanligvis med en utfyllingsfeil. CTR og GCM er strømliknende og trenger ingen utfylling — chifferteksten har nøyaktig samme lengde som klarteksten (prøv eksempelet i CTR-modus: 43 byte inn, 43 byte ut).

CFB og OFB (de to gjenværende klassiske modusene) er ikke implementert på denne siden: de er strømliknende som CTR, men uten fordel fremfor den, og lever mest videre i gamle protokoller.

Hva GCM legger til (AEAD, tagger, AAD)

Autentisert kryptering. GCM = CTR-kryptering + en GHASH-autentikator over chifferteksten, IV-en og AAD. Utdatataggen er et fingeravtrykk av alt: endres én bit i chifferteksten, IV-en eller AAD, stemmer ikke taggen lenger, slik at mottakeren kan bevise at meldingen er intakt og fra en nøkkelholder. CBC+HMAC oppnår det samme bare dersom man setter det sammen riktig (kryptere-så-MAC) — GCM gjør det riktig ved konstruksjon.

AAD. Tilleggsdata med autentisering sendes i klartekst, men dekkes av taggen: protokollheadere, filnavn, algoritmeidentifikatorer. Mottakeren må oppgi nøyaktig de samme AAD-bytene, ellers feiler taggsjekken — det er poenget.

Taglengde. Den vanlige 128-bit-taggen er anbefalingen; kortere tagger (96..120 bit) bytter forfalskningsmotstand mot størrelse. Under 96 bit svekkes sikkerhetsbevisene for GCM raskt, og derfor stopper denne siden der.

Nonce-katastrofen. Gjenbruk av en 12-byte GCM-nonce under samme nøkkel lekker XOR av klarteksten til de to meldingene og autentiseringsundernøkkelen — deretter er forfalskninger mulig for alle fremtidige meldinger under den nøkkelen. Systemer som ikke kan garantere unikhet bruker nonce-misbruk-motstandsdyktige varianter (AES-GCM-SIV, RFC 8452).

Ankerverdier — reproduser dem på denne siden

Den første raden er det kjente FIPS 197-eksempelet med én blokk; resten er generert av en uavhengig native implementasjon (OpenSSL via Node.js) og verifisert på nytt i denne sidens motorer. Lim inn nøkkel, IV og inndata på siden for å reprodusere hver linje.

Store/små bokstaverInndataForventet utdata
AES-128 enkeltblokk (FIPS 197-stil)key 000102..0f, plaintext 00112233..ff69c4e0d86a7b0430d8cdb78070b4c55a
AES-128-GCMkey 000102..0f, IV 606162..6b, plaintext 0011..ef ×2ct 275f095bedfda377063fee326128892188377b410698ed03a022b9971bb4bdbe, tag 87ea7770714048977de2fd8dac645ecf
AES-256-GCM, samme, men med AAD deadbeefkey 000102..1fct eacab966ff15e518f48f5390be502fbc2756ccee0dcfff36a282c50bf5593ae7, tag aead900e895c88252d0388d7aefce5c8
AES-256-CBCkey 000102..1f, IV 101112..1f, plaintext 0011..ef ×20e2392dd6f690b44a5a1b4fdff3b7f83cb9ab59d9900119cc5f83e062d95fb643b1a94b514ea2f3b95f84c900b5c98a8
AES-256-CTR (samme inndata som CBC over)43-byte plaintext → 43-byte ciphertexte9d2cdb9f661359178ed366dfa3a4671f8e20efd723f090eb7d1d524d480fd3c
Vanlige feil
  • Å bruke ECB fordi den ikke krever IV. Bekvemmeligheten er fellen: blokkmønstre lekker rett inn i chifferteksten (krypterer man et bitmap, ser man fortsatt bildet). ECB er bare akseptabel for enkeltblokker eller nøyaktig 16-byte tilfeldige nøkler — i praksis aldri et bevisst valg.
  • Gjenbruk av nonce/IV. Med GCM eller CTR under én nøkkel er dette den ene feilen som ødelegger alt på en gang. Tellerbaserte systemer (denne sidens knapp for tilfeldig IV) finnes for å gjøre det umulig.
  • Å behandle IV-en som hemmelig. Det er den ikke. Lagre eller send den sammen med chifferteksten. Å skjule den gir ingenting og frister til gjenbruk.
  • Å bruke et passord som nøkkel. "hunter2hunter2hunter2hunter2" er 32 byte, men ikke 256 bit entropi — det er et ordboksord med utfylling. Utled med PBKDF2 (innebygd på denne siden) eller generer en tilfeldig nøkkel.
  • Å anta at CBC oppdager manipulering. Snu en bit i CBC-chifferteksten, og dekrypteringen «lykkes» med stille ødelagt klartekst. Bare GCM-taggen (eller en eksplisitt HMAC) gjør manipulering synlig.
  • Å sammenligne GCM-chiffertekster for likhet. Med tilfeldige nonces krypteres samme klartekst annerledes hver gang — det er en egenskap. Deterministisk kryptering er et annet, spesialisert verktøy.
Ofte stilte spørsmål

Er AES-128 fortsatt trygt, eller må man bruke 256? Begge er sikre mot realistiske angripere; de kjente angrepene reduserer bare en liten del av marginen. AES-256 er først og fremst viktig for langtidshemmeligheter og post-kvantekomfort (Grovers algoritme halverer nøkkelstyrken, slik at AES-256 blir på ca. 128-bit ekvivalent).

Hvorfor gjør ikke openssl enc GCM? Kommandoen enc er eldre enn AEAD og har ingen måte å bære en tagg på; OpenSSL 3.3 la i stedet til en egen kommando, aesgcm. GCM-utdataene på denne siden har taggen på en egen linje, slik at begge kan flyttes eksplisitt.

Hva er nøkkelinnpakning (AES-KW)? En spesialisert modus for kryptering av andre nøkler i faste 64-bit-biter med en egen integritetssjekk. Den tilbys ikke her, fordi inn- og utdata er nøkkelformet, ikke meldingsformet — feilbruk er normen.

Hvorfor har CTR-chifferteksten samme lengde som klarteksten, mens CBC-chifferteksten er lengre? CTR og GCM er strømliknende (ingen utfylling); CBC/ECB fyller opp til en hel 16-byte-blokk med PKCS#7. Lengdeforskjellen er bevisst, ikke en feil.

Kan man dekryptere noe som er kryptert et annet sted? Ja, dersom man kjenner nøyaktig modus, nøkkel og IV (og for GCM taggen). Utdatalinjene på denne siden registrerer alt dette presist, slik at parametrene kan overføres mellom verktøy — OpenSSL-boksen over viser de tilsvarende kommandolinjene.