Symmetrische encryptie

Eén sleutel tussen twee identieke, gespiegelde hangsloten die er allebei naar toe openen.

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:

WieWat die moet hebben
Jij, om te versleutelende sleutel
Je vriend, om te ontsleutelenexact dezelfde sleutel
De afluisteraaralles 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.

  1. Klik Versleutelen. Het versleutelde pakket verschijnt in het onderste vak — onleesbaar.
  2. Klik Ontsleutelen. Je bericht komt terug.
  3. Verander nu één letter in het wachtwoord en klik weer Ontsleutelen. Geen bericht, alleen een weigering.
  4. 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.
  5. 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:

salt16 B · openIV12 B · opencijfertekstgeheimzegel16 B · controle
StukGeheim?Waarvoor
SaltneeOm van je wachtwoord een sleutel te maken. Ken je van hoofdstuk 3 — zelfde truc, zelfde reden.
IVneeZorgt dat hetzelfde bericht er elke keer anders uitziet.
CijfertekstjaJe bericht, versleuteld. Het enige stuk dat iets verbergt.
Zegelnee, maar onvervalsbaarBreekt 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:

BerichtIVCijfertekst
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:

aba ⊕ b
000
011
101
110

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.