Symmetrische encryptie
Julius Caesar schreef zijn brieven aan zijn generaals in geheimschrift: elke
letter een paar plaatsen verder in het alfabet. A wordt
D, B wordt E. Wie wist hoeveel
plaatsen, kon lezen. Wie het niet wist, zag onzin. Dat "hoeveel plaatsen" is
de sleutel — en tweeduizend jaar later is dat idee nog
altijd de basis van hoe je berichtjes beveiligd zijn.
Woorden die je zo nodig hebt
- Sleutel
- Het geheim dat je nodig hebt om te versleutelen én te ontsleutelen. Bij Caesar een getal van 1 tot 25. Bij moderne systemen een reeks van 256 willekeurige bits. Wie de sleutel heeft, kan lezen. Wie niet, niet.
- Symmetrisch
- Dezelfde sleutel sluit én opent. Zoals de sleutel van je fietsslot: één sleutel, en die moet je delen met iedereen die het slot mag openen.
- Klaartekst en cijfertekst
- Klaartekst is je gewone bericht. Cijfertekst is wat eruit komt na het versleutelen: voor iedereen zonder sleutel gewoon ruis.
- AES
- Het geheimschrift dat vandaag bijna alles gebruikt: je wifi, je berichtjes, je bankapp. Sinds 2001 de wereldstandaard, en in al die jaren heeft niemand er een gat in gevonden. Er bestaan drie maten — AES128, AES192 en AES256 — en dat getal is de lengte van de sleutel in bits. De demo hieronder gebruikt AES256.
Dezelfde sleutel, allebei de kanten op
Dit is de kern van dit hoofdstuk. Versleutelen en ontsleutelen gebruiken dezelfde sleutel. In formules:
cijfertekst = AES(sleutel, klaartekst)
klaartekst = AES−1(sleutel, cijfertekst)
Bovenste regel: bericht erin, cijfertekst eruit. Onderste regel: precies omgekeerd — AES−1 is de terugweg, zoals ÷ 3 de terugweg is van × 3. Maar kijk naar wat er in allebei de regels staat: sleutel. Hetzelfde woord, dezelfde waarde. Eén sleutel die sluit én opent, zoals de sleutel van je fietsslot.
Straks in de demo zie je dat terug: één wachtwoordveld, dat je zowel bij Versleutelen als bij Ontsleutelen gebruikt. Daar komt een gevolg uit:
| Wie | Wat die moet hebben |
|---|---|
| Jij, om te versleutelen | de sleutel |
| Je vriend, om te ontsleutelen | exact dezelfde sleutel |
| De afluisteraar | alles behalve de sleutel — en dan komt hij nergens |
Vóór jullie één bericht kunnen uitwisselen, moeten jullie allebei al hetzelfde geheim kennen. Dat klinkt vanzelfsprekend als je vriend naast je op de bank zit. Het is het niet, en onderaan dit hoofdstuk zie je waarom.
Wat er in 2000 jaar veranderd is
Caesar had 25 mogelijke sleutels. Die probeer je met de hand allemaal uit in een kwartier. AES256 heeft 2256 mogelijke sleutels. Zet alle computers op aarde samen aan het werk, en ze zijn nog bezig als de zon uitdooft. Het principe is hetzelfde; alleen de wiskunde onder de motorkap is onvergelijkbaar slimmer.
Dat ene idee hierboven — één sleutel, twee richtingen — is dus al tweeduizend jaar hetzelfde gebleven. Wat er in de praktijk bij komt kijken om het waterdicht te maken, zie je na de demo.
Probeer het zelf
Alles gebeurt in je browser. Er wordt niets naar de server gestuurd.
- Klik Versleutelen. Het versleutelde pakket verschijnt in het onderste vak — onleesbaar.
- Klik Ontsleutelen. Je bericht komt terug.
- Verander nu één letter in het wachtwoord en klik weer Ontsleutelen. Geen bericht, alleen een weigering.
- Zet het wachtwoord terug. Klik Klap één bit om — de demo verandert één enkele 0 in een 1 in het pakket. Klik Ontsleutelen. Het zegel is gebroken.
- Versleutel hetzelfde bericht twee keer. Vergelijk de twee pakketten.
Twee verbeteringen die erbij gekomen zijn
Alles hierboven geldt al sinds Caesar. Maar met alleen "één sleutel, twee richtingen" ben je er nog niet: twee keer hetzelfde bericht zou er twee keer hetzelfde uitzien, en je zou niet merken dat iemand onderweg aan je cijfertekst gezeten heeft. Daar zijn twee dingen voor bijgekomen, en je vindt ze allebei terug in het pakket dat de demo je net gaf.
Twee woorden erbij
- IV (initialisatievector)
- Een willekeurig getal dat bij elk bericht anders is, zodat twee keer hetzelfde bericht met dezelfde sleutel toch twee verschillende cijferteksten geeft. Anders zou een meelezer zien: "hé, dat bericht heeft hij gisteren ook gestuurd".
- Zegel (GCM)
- Een controlegetal van 16 bytes dat achter de cijfertekst hangt, berekend mét de sleutel. Verandert er onderweg één bit, dan klopt het zegel niet meer en weigert het ontsleutelen. GCM is de naam van de AES-stand die zo'n zegel maakt.
Wat er in dat pakket zit
Het pakket in het onderste vak is niet alleen je versleutelde bericht. Het zijn vier stukken achter elkaar, en de demo toont je de eerste twee apart:
| Stuk | Geheim? | Waarvoor |
|---|---|---|
| Salt | nee | Om van je wachtwoord een sleutel te maken. Ken je van hoofdstuk 3 — zelfde truc, zelfde reden. |
| IV | nee | Zorgt dat hetzelfde bericht er elke keer anders uitziet. |
| Cijfertekst | ja | Je bericht, versleuteld. Het enige stuk dat iets verbergt. |
| Zegel | nee, maar onvervalsbaar | Breekt zodra er één bit aan de cijfertekst verandert. |
In formules. Let op de tweede regel: dit is de versleutelformule van hierboven, nu met de IV erbij.
sleutel = PBKDF2(wachtwoord, salt)
cijfertekst = AES(sleutel, IV, klaartekst)
zegel = GCM(sleutel, IV, cijfertekst)
De IV: hetzelfde bericht, elke keer anders
Kijk naar de tweede formule. AES krijgt niet alleen de sleutel en je bericht, maar ook de IV. Gebruik je elke keer dezelfde IV, dan geeft hetzelfde bericht met dezelfde sleutel altijd exact dezelfde cijfertekst. Dat is het probleem van de salt uit hoofdstuk 3, in een ander jasje:
| Bericht | IV | Cijfertekst |
|---|---|---|
| Ik zit achter de sporthal… | 0a1b2c3d… | 5d4c29d39a38… |
| Ik zit achter de sporthal… | 0a1b2c3d… (dezelfde) | 5d4c29d39a38… (dezelfde!) |
| Ik zit achter de sporthal… | 9d8e7f6a… (nieuw) | 276598dfaf7f… |
Rij één en twee: wie meeleest, ziet twee keer hetzelfde pakket voorbijkomen. Hij weet niet wát je stuurde, maar wel dat je hetzelfde stuurde als gisteren — en soms is dat al genoeg. Rij drie: nieuwe IV, en er is niets meer te herkennen. Daarom trekt de demo bij elke klik op Versleutelen een verse IV, en daarom zag je bij stap 5 twee compleet verschillende pakketten. De IV hoeft niet geheim te zijn. Hij moet alleen nieuw zijn.
Het zegel: één bit fout en de deur blijft dicht
De derde formule maakt het zegel: een berekening over de hele cijfertekst, met de sleutel erin verwerkt. De ontvanger doet die berekening opnieuw en vergelijkt. Klopt het zegel, dan wordt er ontsleuteld. Klopt het niet, dan komt er helemaal niets uit — geen "bijna juist", geen rommel, gewoon een weigering. Dat zag je bij stap 4.
Waarom kan een knoeier het zegel niet gewoon zelf herberekenen nadat hij een bit veranderd heeft? Omdat de sleutel in de formule zit. Zonder sleutel kan hij wél bits omklappen, maar geen zegel maken dat klopt. Zo krijg je twee dingen tegelijk: niemand kan lezen wat erin staat, én niemand kan er ongemerkt aan zitten. Dat tweede heeft Caesar nooit gehad.
Het probleem dat Caesar ook al had
Caesar kon zijn generaal de sleutel influisteren voor hij vertrok. Jij kan dat ook: fluister het wachtwoord, of schrijf het op een papiertje dat je doorgeeft. Maar hoe doe je dat met een website in Amerika die je nog nooit gezien hebt, en die je binnen de seconde een beveiligde verbinding moet geven?
Je kan de sleutel niet gewoon meesturen — dan leest de afluisteraar hem mee en is alles voor niets. En je kan hem ook niet versleuteld meesturen, want waarmee dan? Daarvoor zou je alweer een sleutel nodig hebben die jullie allebei al kennen. Je draait in een kring.
Dit heet het sleuteluitwisselingsprobleem, en het leek eeuwenlang onoplosbaar. Tot in 1976 twee wiskundigen iets bedachten dat klinkt als een goocheltruc. Dat is het volgende hoofdstuk.
Dit is wiskunde: een bewerking die zichzelf ongedaan maakt
Waarom kan één sleutel beide kanten op? Door een bewerking die je maar één keer hoeft te leren: XOR, geschreven als ⊕. Ze werkt op losse bits en de hele tabel past hier:
| a | b | a ⊕ b |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
Verschillend geeft 1, gelijk geeft 0. Neem nu een bit en XOR er twee keer hetzelfde bij: 1 ⊕ 1 = 0, en dan 0 ⊕ 1 = 1 — terug bij af. Probeer het met alle vier de rijen en het klopt altijd:
(a ⊕ b) ⊕ b = a
Dáár zit je antwoord. AES maakt uit de sleutel en de IV een lange sliert bits die volstrekt willekeurig oogt, en je cijfertekst is je bericht XOR die sliert. Ontsleutelen is dezelfde sliert er nog eens bij XOR'en. Niet een omgekeerde bewerking — dezelfde. Vandaar één sleutel, twee richtingen.
Dit is Booleaanse algebra: rekenen met waar en onwaar in plaats van met getallen, bedacht door George Boole rond 1850, ruim voor er één computer bestond. Elke chip ter wereld is eruit opgebouwd.