AES-kryptering / -dekryptering

Krypterar eller dekrypterar med AES-128, AES-192 eller AES-256 (FIPS 197) i läget GCM (autentiserad kryptering), CBC, CTR eller ECB. Nycklar är rå hex- eller Base64-byte, eller härleds från ett lösenord med PBKDF2-HMAC-SHA256. GCM stöder AAD och visar autentiseringstaggen separat; CBC/CTR/ECB-utdata är kompatibla med OpenSSL enc. För hashar se Hashgeneratorn, för nyckelade MAC-koder HMAC-generatorn och för äldre chiffer sidan Legacy Ciphers i samma familj.
Körs helt lokalt — nycklar och klartext lämnar aldrig fliken. Filer upp till 200 MB.
Allt som skrivs här stannar i fliken — men det är inte samma sak som “säkert för produktionshemligheter”. Webbläsarens minne, tillägg och personer som tittar över axeln ser det som klistras in. Sidan används för att lära, verifiera och testa interoperabilitet, inte för att hantera kunddata i drift.
Riktning: Läge: Utdata:
GCM = AES-GCM med en 12-byte nonce och en 128-bitars autentiseringstagg (AEAD: konfidentialitet + integritet). Standard när säkerhet är målet.
Hex tål mellanslag, kolon och prefixet 0x.
Återanvänd aldrig en nonce under samma nyckel i GCM eller CTR.
Taggens längd:
Parameterraderna registrerar den exakta nyckeltolkningen, IV, AAD-storlek och tagg, så att ett kopierat resultat alltid kan återskapas på en annan maskin.
Vilket läge bör väljas?
GCM är standardsvaret: det krypterar och autentiserar — taggraden gör manipulation synlig (prova att dekryptera med en vänd taggbyte så vägrar sidan). CBC döljer blockmönster men ger ingen integritet; kombinera det med en HMAC (se HMAC-generatorn) om det måste användas. CTR gör AES till ett strömchiffer — ingen utfyllnad, men en återanvänd nonce under samma nyckel är katastrofal i både CTR och GCM. ECB finns här enbart för kompatibilitet och undervisning: identiska klartextblock krypteras till identiska chiffertextblock (den berömda ECB-pingvinen).
OpenSSL-interoperabilitet — CBC- och CTR-utdata från den här sidan (PKCS#7-utfyllnad, rå nyckel) går att använda med kommandoraden openssl enc:
openssl enc -aes-256-cbc -K <64-hex-nyckel> -iv <32-hex-iv> -in msg.txt -out msg.enc
openssl enc -d -aes-256-cbc -K <nyckel> -iv <iv> -in msg.enc -out msg.txt
Samma sak fungerar med -aes-128-cbc, -aes-192-cbc, -aes-256-ctr (16-byte IV = initialt räknarblock). Observera att openssl enc inte stöder GCM — använd den här sidan, eller openssl aesgcm från OpenSSL 3.3+, för autentiserad kryptering.
Behövs i stället den kinesiska nationella chiffret?
SM4 (GB/T 32907-2016) — blockchiffret som föreskrivs i kinesisk kommersiell kryptografi, med samma 128-bitars block och nyckelstorlek som AES men med eget nyckelschema och egen S-box — finns på en egen sida i lägena ECB och CBC: SM4-kryptering / -dekryptering. Resten av SM-sviten finns där också: SM3 (hash), SM2 (publik nyckel) och SM9 (identitetsbaserad kryptografi).
Självtest
Kör sidans motorer mot oberoende referensvärden: testvektorer med känt svar för alla fyra lägena (framtagna av en oberoende nativ implementering), GCM-taggvektorer med och utan AAD, korskontroller av WebCrypto-motorn mot den rena JS-AES-motorn, GCM-tur-och-retur och negativa tester (en manipulerad tagg eller fel nyckel ska misslyckas). Inget skickas någonstans.
AES-kryptering förklarad från grunden
Kort sagt: AES är det världsomspännande standardchiffret för block — det blandar om 16-byteblock under en nyckel på 128, 192 eller 256 bitar — och läget där det körs (GCM, CBC, CTR, ECB) avgör hur blocken kedjas, vad IV:n används till och om manipulation kan upptäckas. Välj GCM om det inte finns en särskild anledning att inte göra det.
Vad AES i sig är (FIPS 197)

Blockchiffret. AES (Rijndael-konstruktionen, standardiserad av NIST 2001 som FIPS 197) krypterar exakt 16 byte åt gången. Nyckellängden — 16, 24 eller 32 byte — väljer AES-128, -192 eller -256 och antalet interna rundor (10, 12, 14). Varje runda blandar blocket med rundnycklar som härletts ur nyckeln genom substitutionstabeller, radförskjutningar och kolumnblandning. Ingen praktisk attack bryter själva chiffret: de verkliga felen är nästan alltid läges-, IV- eller nyckelhanteringsmisstag, vilket resten av sidan handlar om.

Varför alls ett läge? För att meddelanden sällan är 16 byte. Läget limmar ihop blockkrypteringarna: ECB krypterar bara block var för sig; CBC XOR:ar varje block med föregående chiffertext; CTR krypterar en räknare och XOR:ar den med data som ett strömchiffer; GCM bygger på CTR och lägger till en autentiseringstagg. AES förblir detsamma — läget ändrar allt om vilka garantier man får.

Nycklar och lösenord. En AES-nyckel är 16, 24 eller 32 slumpmässiga byte. Ett lösenord skrivet av en människa är inte det: sidans lösenordsalternativ härleder en korrekt nyckel med PBKDF2-HMAC-SHA256 (600 000 iterationer som standard, OWASP 2023 som grund — se HMAC-generatorn för detaljer om KDF). Använd aldrig en lösenordssträng direkt som AES-nyckel: dess entropi är en liten del av längden.

De fyra lägena jämförda
LägeIV / nonceIntegritetAnteckningar
GCM12 byte, unik per meddelandeJa — 96–128-bitars taggAEAD: den rekommenderade standarden överallt (TLS 1.3, SSH, filformat). Accepterar även AAD.
CBC16 byte, oförutsägbarNejPKCS#7-utfyllnad; klassiskt men kräver en MAC bredvid. Utfyllnadsorakelfel är den klassiska CBC-fallgropen.
CTR16-byte initial räknareNejIngen utfyllnad, strömliknande, direktåtkomst; återanvänd nonce under en nyckel läcker klartext XOR klartext.
ECBingenNejIdentiska block → identisk chiffertext. Pingvindemonstrationen för ECB. Endast för kompatibilitet.

IV-regler i ett stycke. IV:n är inte hemlig — skicka den tillsammans med chiffertexten — men dess unikhetskrav skiljer sig: CBC kräver en oförutsägbar IV; GCM och CTR kräver bara att samma nonce aldrig återanvänds med samma nyckel (återanvändning av nonce i GCM är värre: den läcker autentiseringsnyckeln). Sidans knapp för slumpmässig IV använder webbläsarens säkra slumpgenerator; knappen för alla nollor finns för att återskapa testvektorer, inte för riktiga meddelanden.

Utfyllnad. CBC och ECB behöver hela block, så PKCS#7-utfyllnad lägger till 1 till 16 byte, var och en lika med utfyllnadens längd. Därför växer CBC-chiffertexter med upp till 16 byte, och därför misslyckas dekryptering med fel nyckel oftast med ett utfyllnadsfel. CTR och GCM är strömliknande och behöver ingen utfyllnad — chiffertextens längd är exakt lika med klartextens (prova exemplet i CTR-läget: 43 byte in, 43 byte ut).

CFB och OFB (de två återstående klassiska lägena) finns inte på den här sidan: de är strömliknande som CTR men utan fördel jämfört med den, och lever mest kvar i gamla protokoll.

Vad GCM tillför (AEAD, taggar, AAD)

Autentiserad kryptering. GCM = CTR-kryptering + en GHASH-autentiserare över chiffertexten, IV:n och AAD. Utdatataggen är ett fingeravtryck av allt: ändras en enda bit i chiffertexten, IV:n eller AAD stämmer inte taggen längre, så mottagaren kan bevisa att meddelandet är intakt och kommer från en nyckelinnehavare. CBC+HMAC uppnår samma sak först om man sätter ihop det rätt (encrypt-then-MAC) — GCM gör det rätt i konstruktionen.

AAD. Ytterligare autentiserad data skickas i klartext men täcks av taggen: protokollhuvuden, filnamn, algoritmidentifierare. Mottagaren måste ange identiska AAD-byte, annars misslyckas taggkontrollen — det är själva poängen.

Taggens längd. Den förvalda 128-bitarstaggen är rekommendationen; kortare taggar (96–120 bitar) byter förfalskningsmotstånd mot storlek. Under 96 bitar försämras GCM:s säkerhetsbevis snabbt, varför sidan stannar där.

Nonce-katastrofen. Att återanvända en 12-byte GCM-nonce under samma nyckel läcker XOR:en av klartexterna i de två meddelandena och autentiseringsundernyckeln — därefter går det att förfalska alla framtida meddelanden under den nyckeln. System som inte kan garantera unikhet använder varianter som tål felanvändning av nonce (AES-GCM-SIV, RFC 8452).

Ankarvärden — återskapa dem på den här sidan

Den första raden är det klassiska enblocksexemplet från FIPS 197; resten har tagits fram av en oberoende nativ implementering (OpenSSL via Node.js) och verifierats på nytt med sidans egna motorer. Klistra in nyckeln, IV:n och indatan på sidan för att återskapa varje rad.

FallIndataFörväntad utdata
AES-128 enblock (i 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, samma men med AAD deadbeefkey 000102..1fct eacab966ff15e518f48f5390be502fbc2756ccee0dcfff36a282c50bf5593ae7, tag aead900e895c88252d0388d7aefce5c8
AES-256-CBCkey 000102..1f, IV 101112..1f, plaintext 0011..ef ×20e2392dd6f690b44a5a1b4fdff3b7f83cb9ab59d9900119cc5f83e062d95fb643b1a94b514ea2f3b95f84c900b5c98a8
AES-256-CTR (samma indata som CBC ovan)43-byte plaintext → 43-byte ciphertexte9d2cdb9f661359178ed366dfa3a4671f8e20efd723f090eb7d1d524d480fd3c
Vanliga misstag
  • Att använda ECB eftersom det inte behöver någon IV. Bekvämligheten är fällan: blockmönster läcker rakt in i chiffertexten (krypterar man en bitmapp syns bilden fortfarande). ECB är acceptabelt bara för enstaka block eller exakt 16-byte slumpmässiga nycklar — i praktiken aldrig av eget val.
  • Återanvändning av nonce/IV. Med GCM eller CTR under samma nyckel är det det enda misstag som bryter allt på en gång. Räknarbaserade system (sidans knapp för slumpmässig IV) finns för att göra det omöjligt.
  • Att behandla IV:n som hemlig. Det är den inte. Lagra eller skicka den tillsammans med chiffertexten. Att gömma den ger ingenting och lockar till återanvändning.
  • Att använda ett lösenord som nyckel. "hunter2hunter2hunter2hunter2" är 32 byte men inte 256 bitar entropi — det är ett ordboksord med utfyllnad. Härled med PBKDF2 (inbyggt på sidan) eller generera en slumpmässig nyckel.
  • Att anta att CBC upptäcker manipulation. Vänder man en bit i CBC-chiffertexten lyckas dekrypteringen tyst med skadad klartext. Endast GCM:s tagg (eller en explicit HMAC) gör manipulation synlig.
  • Att jämföra GCM-chiffertexter för likhet. Med slumpmässiga nonces krypteras samma klartext olika varje gång — det är en egenskap. Deterministisk kryptering är ett annat, specialiserat verktyg.
Vanliga frågor

Är AES-128 fortfarande säkert, eller behövs 256? Båda är säkra mot realistiska angripare; de bästa kända attackerna minskar marginalen bara obetydligt. AES-256 är främst viktigt för långsiktiga hemligheter och för framtida kvantdatorer (Grovers algoritm halverar nyckelstyrkan, vilket lämnar AES-256 på ungefär 128-bitars motsvarighet).

Varför kan inte openssl enc göra GCM? Kommandot enc är äldre än AEAD och saknar sätt att bära en tagg; OpenSSL 3.3 lade i stället till ett särskilt kommando, aesgcm. GCM-utdata på den här sidan håller taggen på en egen rad, så att båda kan flyttas explicit.

Vad är nyckelinpackning (AES-KW)? Ett specialiserat läge för att kryptera andra nycklar i fasta 64-bitarsblock med en egen integritetskontroll. Det erbjuds inte här, eftersom indata och utdata är nyckelformade, inte meddelandeformade — felanvändning är normen.

Varför är min CTR-chiffertext lika lång som klartexten, men CBC:s längre? CTR och GCM är strömliknande (ingen utfyllnad); CBC/ECB fyller ut till ett helt 16-byteblock med PKCS#7. Längdskillnaden är avsiktlig och inget fel.

Kan jag dekryptera något som krypterats någon annanstans? Ja, om läget, nyckeln och IV:n (och för GCM även taggen) är exakt kända. Utdatarader på den här sidan registrerar alla dessa precis, så att parametrar kan flyttas mellan verktyg — OpenSSL-rutan ovan visar motsvarande kommandoraderna.