Elke keer dat je een bericht verstuurt, een online betaling doet of inlogt bij een beveiligde dienst, werkt versleuteling op de achtergrond om je gegevens privé te houden. Een van de algoritmen die dit werk tegenwoordig uitvoert, is ChaCha20: een snel, veilig en lichtgewicht cijfer dat wordt vertrouwd door zowel techgiganten als beveiligingsexperts. Dit is wat het is en hoe het je gegevens veilig houdt.

Het ChaCha20-algoritme begrijpen
Om het ChaCha20-algoritme te begrijpen, is het nuttig om het op te splitsen in de kernonderdelen: de oorsprong, het proces waarmee versleutelde gegevens worden geproduceerd, en de rol van de sleutel, nonce en teller. Elk van deze onderdelen werkt samen om snelheid, efficiëntie en beveiliging te bieden, waardoor ChaCha20 een sterke optie is in veel moderne versleutelingsprotocollen.
Wie heeft ChaCha20 ontwikkeld en waarom?
ChaCha werd in 2008 ontwikkeld door Daniel J. Bernstein, een Amerikaans-Duitse wiskundige, informaticus en cryptograaf. Het is gebaseerd op zijn eerdere ontwerp, Salsa20.
Een van de belangrijkste redenen om ChaCha20 te creëren was om een sterk alternatief te bieden voor veelgebruikte cijfers zoals Advanced Encryption Standard (AES). Hoewel AES zeer veilig is, werkt het het snelst op apparaten die hardwareversnelling ondersteunen: speciale CPU-instructies, zoals Intel’s Advanced Encryption Standard New Instructions (AES-NI), die de bewerkingen versnellen. Veel oudere, mobiele of energiezuinige apparaten hebben deze hardwareondersteuning niet, waardoor AES trager en energieverbruikender wordt wanneer het puur in software wordt geïmplementeerd.
ChaCha20 is ontworpen om dit probleem te vermijden. Het gebruikt alleen eenvoudige bewerkingen die vrijwel op elke processor snel worden uitgevoerd. Dit lichtgewicht ontwerp maakt het bijzonder geschikt voor smartphones, embedded systemen en andere omgevingen met beperkte middelen. Tegenwoordig wordt ChaCha20 aanbevolen in moderne protocollen zoals Transport Layer Security (TLS) 1.3 als een betrouwbare optie naast AES.
Hoe ChaCha20 werkt
Stel dat je dit bericht wilt versleutelen met ChaCha20: “ExpressVPN protects my online privacy and helps keep my data safe.” Zo werkt dat, stap voor stap.
1. Zet het bericht om in bytes.
Computers werken met bytes, dat zijn 8-bit-eenheden die een getal van 0 tot 255 kunnen opslaan. Tekst zoals onze zin wordt opgeslagen door elk teken (“E,” “x,” spatie, “.”, enz.) aan 1 byte te koppelen. Onze zin is 66 bytes lang, dus er is iets meer dan één chunk (blok) van 64 bytes nodig om te versleutelen.
2. Vervolgens heb je een geheime sleutel nodig.
ChaCha20 is een symmetrisch cipher, wat betekent dat hetzelfde geheim wordt gebruikt om te versleutelen en te ontsleutelen. Dat geheim is een 256-bits sleutel (32 bytes). Je kunt het zien als een lang, willekeurig wachtwoord dat alleen de zender en de ontvanger kennen. Waarom 256 bits? Het is groot genoeg dat raden door uitproberen in de praktijk onmogelijk is.
3. Je hebt ook een nonce nodig (number used once).
Een nonce is een openbaar, uniek getal dat voor elk bericht wordt gekozen dat je met een bepaalde sleutel versleutelt.
In de Internet Engineering Task Force (IETF)-versie van ChaCha20is de nonce 96 bits (12 bytes). Het hoeft niet geheim te zijn, maar mag nooit herhaald worden met dezelfde sleutel. Het hergebruiken van een sleutel–nonce-paar zou je bericht onthullen.
4. ChaCha20 maakt een keystream.
ChaCha20 behoort tot de familie van de “stream cipher”. In plaats van je bericht rechtstreeks te versleutelen, produceert het eerst een stroom van pseudo-willekeurige bytes die een keystream wordt genoemd. Vervolgens combineer je die keystream met de bytes van je bericht via een eenvoudige bewerking die exclusive OR (XOR) heet.
Hoe maakt ChaCha20 de keystream?
Bouw een interne state
ChaCha20 houdt een klein werkgebied bij dat de state wordt genoemd, gerangschikt als een 4×4-raster van getallen. Elk getal in het raster is een word, wat hier een 32-bit (4-byte) unsigned integer betekent, zoals bijvoorbeeld 00000000 00000000 00000111 01001001.
De 16 words in het raster worden gevuld met:
- 4 vaste constanten (ze identificeren alleen het algoritme),
- 8 words uit de 256-bit-sleutel (aangezien 8 × 4 bytes = 32 bytes),
- 1 block counter (hierna uitgelegd),
- 3 words uit de nonce (3 × 4 bytes = 12 bytes).

De block counter
De keystream wordt geproduceerd in blokken van 64 bytes tegelijk.
Om elk 64-byte-blok anders te maken, gebruikt ChaCha20 een 32-bit-teller in de state die begint bij 0 voor het eerste blok, 1 voor het volgende blok, enzovoort.
Meng de staat (de ARX-kern)
ChaCha20 mengt herhaaldelijk de 16 woorden uit het raster met slechts drie bewerkingen: optelling (modulo 2³²), rotatie (bitsgewijze rotatie van 32-bitswoorden) en XOR (die twee bits vergelijkt en 1 uitvoert als ze verschillen en 0 als ze hetzelfde zijn).
Deze menging, gebaseerd op Addition-, Rotation- en XOR-bewerkingen (ARX), gebeurt in ronden (ChaCha20 doet 20 ronden). Het kernpunt is dat deze eenvoudige, snelle bewerkingen de staat grondig door elkaar husselen op een manier die zonder de sleutel moeilijk omkeerbaar is.
Produceer 64 bytes keystream
Na het mengen telt ChaCha20 de oorspronkelijke staat op bij de gemengde staat (woord voor woord) en voert het resultaat vervolgens uit als 64 keystream-bytes. Dat is één keystream-blok.
5. Maak zoveel keystream-blokken als nodig
Je bericht kan elke lengte hebben. ChaCha20 gebruikt eenvoudig counter = 0 om de eerste 64 bytes keystream te maken, counter = 1 voor de volgende 64 bytes, counter = 2 voor de volgende 64 bytes, enzovoort. Omdat de counter verandert, is elk keystream-blok uniek (zelfs met dezelfde sleutel en nonce).
6. Lijn de keystream uit met je bericht
Ons voorbeeldbericht is 67 bytes, dus blok 0 dekt berichtbytes 0–63 (64 bytes) en blok 1 dekt berichtbytes 64–66 (de laatste 3 bytes). We gebruiken alleen de eerste 3 bytes van het tweede keystream-blok en negeren de rest.
7. Combineer het bericht met de keystream via XOR
XOR is een bewerking per byte met een handige eigenschap: dezelfde XOR twee keer uitvoeren brengt je terug waar je begon:
Versleuteling (per byte): plaintext XOR keystream = ciphertext
Decryptie (per byte, dezelfde keystream): ciphertext XOR keystream = plaintext
ChaCha20 vergelijken met andere ciphers
Hoewel ChaCha20 tegenwoordig veel wordt gebruikt, is het niet het enige encryptiealgoritme in omloop. Andere ciphers, zoals AES en Rivest–Shamir–Adleman (RSA), zijn ook gebruikelijk, maar ze werken op verschillende manieren en zijn geschikt voor verschillende taken. Ze vergelijken helpt te laten zien waar ChaCha20 past en waarom bepaalde protocollen het verkiezen boven de alternatieven.
ChaCha20 vs. AES
ChaCha20 en AES zijn beide encryptiealgoritmen met een symmetrische sleutel, wat betekent dat dezelfde sleutel wordt gebruikt voor zowel encryptie als decryptie. Voor een beter begrip van verschillende cryptografische technieken, waaronder de verschillen tussen encryptie en hashing, kun je deze uitleg bekijken van hashing vs. encryptie.
Het belangrijkste verschil tussen ChaCha20 en AES ligt in hoe ze gegevens verwerken. AES is een block cipher die gegevens versleutelt in blokken van vaste grootte, terwijl ChaCha20 een stream cipher is die een continue keystream genereert die met de gegevens wordt gecombineerd.
AES profiteert vaak van hardwareversnelling op moderne processors, waardoor het in die omgevingen extreem snel is. ChaCha20 is daarentegen ontworpen om consistent goed te presteren, zelfs zonder gespecialiseerde hardwareondersteuning, waardoor het een sterke keuze is voor mobiele apparaten en energiezuinige systemen. Daarom ExpressVPN gebruikt zowel AES-256 als ChaCha20 voor het Lightway-protocol en schakelt automatisch over naar degene die het beste bij je apparaat past (je kunt ook handmatig de ene of de andere kiezen).
Een ander praktisch verschil zit in de implementatie. AES kan complexer zijn om veilig te coderen, omdat het kwetsbaar kan zijn voor timingaanvallen als het niet zorgvuldig is geïmplementeerd. ChaCha20 gebruikt eenvoudige ARX-bewerkingen die van nature in constante tijd draaien, wat dit risico helpt te verminderen.
Beide ciphers worden als veilig beschouwd wanneer ze correct zijn geïmplementeerd, en moderne protocollen zoals TLS 1.3 ondersteunen beide. De keuze tussen hen hangt af van de hardware van het apparaat en de prestatievereisten, eerder dan van beveiligingszorgen.
| Functie | ChaCha20 | AES |
| Type cipher | Stroomcijfer | Blokcijfer |
| Hardwareversnelling | Snel op alle apparaten | Beste met AES‑NI (specifieke hardware-instructies) |
| Eenvoud van implementatie | Eenvoudiger, constante‑tijd bewerkingen | Complexer, vereist zorgvuldige codering |
| Snelheid zonder AES‑NI (specifieke hardware-instructies) | Zeer snel | Langzamer |
ChaCha20 vs. RSA
ChaCha20 en RSA zijn geen directe concurrenten: ze vervullen verschillende functies in beveiligde communicatie.
RSA is een asymmetrisch versleutelingsalgoritme, wat betekent dat het een sleutelpaar gebruikt: één publieke en één privésleutel. Het wordt doorgaans aan het begin van een beveiligde verbinding gebruikt om versleutelingssleutels uit te wisselen of identiteiten te verifiëren. In TLS is het symmetrische-sleutelalgoritme vaak AES, waarbij de sleuteluitwisseling wordt beveiligd met RSA.
Omdat RSA complexere wiskunde inhoudt en met grotere sleutelgroottes werkt, is het trager en minder efficiënt voor continue dataversleuteling.
ChaCha20 daarentegen is een symmetrisch stroomcijfer. Het gebruikt één gedeelde sleutel voor zowel versleuteling als ontsleuteling, waardoor het sneller is en beter geschikt voor doorlopende gegevensoverdracht.
In de praktijk combineren veel beveiligde protocollen beide aanpakken: RSA (of een ander asymmetrisch algoritme) voor de initiële handshake en ChaCha20 of een ander symmetrisch cijfer voor de rest van de sessie.
Voordelen van ChaCha20
ChaCha20 is niet alleen populair omdat het veilig is, maar ook omdat het goed werkt in praktijksituaties. Het is snel op allerlei apparaten, zelfs telefoons en gadgets met minder vermogen. Het ontwerp is eenvoudig, wat helpt om veelvoorkomende fouten te vermijden die versleuteling kunnen verzwakken.
Snelheid en prestaties op mobiele en energiezuinige apparaten
ChaCha20 is ontworpen om efficiënt te werken op allerlei hardware, niet alleen high‑end processors. Op apparaten zonder AES-hardwareversnelling, zoals veel smartphones, tablets of IoT-apparaten, kan het merkbaar sneller draaien.
Eenvoud en weerstand tegen timingaanvallen
ChaCha20 is opgebouwd rond eenvoudige ARX-bewerkingen. Deze draaien in constante tijd, wat betekent dat de uitvoeringssnelheid niet verandert op basis van de verwerkte data: alle bewerkingen duren precies even lang.
Dit ontwerp maakt het eenvoudiger om veilig te implementeren en helpt te beschermen tegen timingaanvallen, die proberen informatie te achterhalen door te meten hoe lang versleutelingsstappen duren.
Wat zijn de bekende beperkingen van ChaCha20?
ChaCha20 is jarenlang bestudeerd en er zijn geen in de praktijk werkende breaks van de volledige 20‑rondeversie gepubliceerd. Over het algemeen is het het meest grondig geteste alternatief voor AES dat er vandaag is. Het heeft echter enkele duidelijke beperkingen waar ontwikkelaars rekening mee moeten houden. Gebruik buiten deze grenzen kan de bescherming verzwakken.
- Hergebruik van een nonce is een ernstig risico: Het gebruik van dezelfde nonce met dezelfde sleutel doorbreekt onmiddellijk de vertrouwelijkheid. Elk nonce–sleutelpaar moet uniek zijn.
- Geen ingebouwde authenticatie: ChaCha20 versleutelt alleen gegevens. Om te controleren dat gegevens niet zijn gewijzigd, moet het worden gebruikt met Poly1305.
- Limiet op versleutelde gegevens per sleutel/nonce: ChaCha20 kan tot 2³² blokken van 64 bytes (ongeveer 256 GB) aan met dezelfde sleutel en nonce. Het overschrijden van deze limiet zou leiden tot hergebruik van de keystream en de beveiliging van de versleuteling volledig ondermijnen.
ChaCha20-Poly1305 uitgelegd
ChaCha20‑Poly1305 is een koppeling van twee cryptografische componenten die samenwerken om gegevens te beschermen:
- ChaCha20 versleutelt informatie met een gedeelde geheime sleutel en zet leesbare tekst om in iets dat voor iedereen zonder de sleutel op willekeurige gegevens lijkt. Het detecteert echter geen manipulatie.
- Poly1305 produceert een berichtauthenticatiecode (MAC) waarmee de ontvanger kan bevestigen dat de gegevens niet zijn gewijzigd en dat ze van de juiste bron afkomstig zijn.
Samen vormen ze wat bekendstaat als Authenticated Encryption with Additional Data (AEAD). Dit betekent dat het versleutelingsproces niet alleen de inhoud van het bericht verbergt, maar ook de integriteit ervan verifieert.
Poly1305 is niet de enige optie, maar het is de meest gebruikelijke keuze wanneer ChaCha20 in moderne protocollen wordt gebruikt. Dat komt doordat ChaCha20‑Poly1305 is gestandaardiseerd door de IETF (RFC 8439) en breed wordt ondersteund in TLS, SSH, WireGuard en andere protocollen, dus het is de de facto standaard.
ChaCha20 in 2025: waar het in moderne systemen wordt gebruikt
ChaCha20 is een standaardkeuze geworden in veel beveiligingsgerichte toepassingen. In internetbeveiliging wordt het gebruikt in TLS-verbindingen, vaak samen met Poly1305, om HTTPS-verkeer te beschermen, vooral op apparaten zonder hardwareondersteuning voor AES. Grote browsers zoals Chrome en Firefox, en webservers zoals nginx en Apache, ondersteunen deze cipher suite.

Het wordt ook veel gebruikt in virtuele privénetwerken (VPN’s). Het WireGuard VPN-protocol, bijvoorbeeld, stelt ChaCha20‑Poly1305 in als standaard om gegevens te beveiligen en tegelijkertijd hoge prestaties te behouden op mobiele en embedded apparaten. Ondersteuning is ook ingebouwd in grote besturingssystemen, waaronder Linux, Android, iOS en Windows.
Samenvatting
ChaCha20 is een modern, softwarevriendelijk stream cipher, ontwikkeld door Daniel J. Bernstein als een snel en veilig alternatief voor AES, vooral op mobiele en energiezuinige apparaten zonder hardwareversnelling. Het versleutelt gegevens met een 256‑bit-sleutel, een unieke 96‑bit-nonce en een block counter om een pseudowillekeurige keystream te genereren, die met XOR wordt gecombineerd met de plaintext. Het ARX-ontwerp (Addition‑Rotation‑XOR) is eenvoudig, efficiënt en van nature bestand tegen timingaanvallen. ChaCha20 is symmetrisch (dezelfde sleutel voor versleuteling en ontsleuteling) en verschilt van block ciphers zoals AES en asymmetrische algoritmen zoals RSA, die doorgaans alleen worden gebruikt voor sleuteluitwisseling of authenticatie. Hoewel het als zeer veilig wordt beschouwd en breed wordt ingezet in TLS, VPN’s en grote platforms, moet ChaCha20 worden gebruikt met strikte nonce-uniciteit en een gegevenslimiet per sleutel/nonce-paar, en het biedt geen ingebouwde authenticatie—dus het wordt meestal gecombineerd met Poly1305 in de gestandaardiseerde ChaCha20‑Poly1305 AEAD-constructie om zowel vertrouwelijkheid als integriteit te bieden.
FAQ: veelgestelde vragen over ChaCha20
Gebruikt Google ChaCha20?
Ja. Google heeft ChaCha20 met Poly1305 in 2014 ingevoerd als onderdeel van zijn Transport Layer Security (TLS) / Secure Sockets Layer (SSL)-protocollen. Het doel was om de prestaties en beveiliging te verbeteren voor mobiele apparaten en servers die geen hardwareversnelling voor Advanced Encryption Standard (AES) hebben, waardoor beveiligde verbindingen in die omgevingen sneller en efficiënter worden.
Is ChaCha20 quantum-resistent?
Ja. Symmetrische cijfers, zoals ChaCha20, worden over het algemeen als kwantumveilig beschouwd, mits ze voldoende lange sleutels gebruiken (bijv. 256 bits).
Kan ChaCha20 worden gebruikt voor bestandsversleuteling?
Ja. ChaCha20 kan worden gebruikt in tools voor bestandsversleuteling om gevoelige gegevens die op apparaten zijn opgeslagen te beschermen. De snelheid en efficiëntie maken het geschikt voor zowel grote bestanden als apparaten met beperkte rekenkracht.
Kan ChaCha20 worden gekraakt?
Er zijn geen gepubliceerde aanvallen in de praktijk die het volledige 20-ronde ChaCha20-cijfer kraken. Beveiligingsexperts blijven het bestuderen, en wanneer het correct binnen de grenzen wordt gebruikt, wordt het als veilig beschouwd voor moderne versleutelingsbehoeften.