Toeval: waar sleutels vandaan komen
Denk aan een getal tussen 1 en 10. Niet hardop, gewoon in je hoofd. Je dacht aan 7. Of anders aan 3. Bijna niemand kiest 1 of 10, en 7 komt er veel vaker uit dan de ene keer op tien die je zou verwachten. Mensen zijn slecht in toeval, en dat is grappig. Computers zijn er ook slecht in, en dat is het niet: elk slot in de rest van deze site hangt aan één getal dat niemand mag kunnen raden.
Woorden die je zo nodig hebt
- Sleutel
- Het geheime getal waarmee je straks berichten op slot doet. In hoofdstuk 5 gebruik je hem voor het eerst. Hier gaat het alleen over de vraag waar dat getal vandaan komt.
- Toeval
- Iets waar geen regel achter zit. Gooi je een dobbelsteen, dan helpt geen enkele berekening je aan de volgende worp. Dat is precies wat je van een sleutel wil.
- Pseudotoeval
- Toeval dat er alleen zo uitziet. Een formule spuwt getallen uit die wild door elkaar springen, maar wie de formule kent, weet ze allemaal vooruit. "Pseudo" is Grieks voor "nep".
- Zaadje
- Het getal waarmee zo'n formule begint. Alles wat erna komt ligt er vanaf dat moment al in vast. Zelfde zaadje, zelfde reeks. Altijd.
- Entropie
- Een maat voor hoeveel er echt te raden valt, uitgedrukt in bits. Eén muntworp is 1 bit. Acht muntworpen zijn 8 bits, en dat zijn 256 mogelijkheden. Hoe meer bits, hoe hopelozer raden wordt.
Een formule die op toeval lijkt
Vrijwel elke programmeertaal heeft een knop die "een willekeurig getal" belooft. In de meeste gevallen zit daar iets achter dat er zo uitziet:
volgende = (vorige × 1103515245 + 12345) mod 2147483648
Meer is het niet. Neem het vorige getal, vermenigvuldig het met een groot getal, tel er iets bij op, en hou de rest over na deling door 231. De uitkomsten springen alle kanten op en zien er prima door elkaar geschud uit. Ze zijn het ook, voor een spelletje of een kleurtje op het scherm.
Maar kijk nog eens naar die regel. Er staat niets in dat je niet weet. Wie één getal uit de reeks ziet, vult het in en heeft het volgende.
Voorspel het volgende getal
Alles gebeurt in je browser. Er wordt niets naar de server gestuurd.
- Klik Vijf getallen. Kijk ernaar en probeer zelf te zien wat het zesde wordt. Dat lukt niet.
- Klik Voorspel het zesde. De demo vult de formule in met het vijfde getal en zet haar voorspelling naast het echte antwoord.
- Klik Echt toeval, en dan weer op Voorspel het zesde. Lees wat er dan gebeurt.
Waar echt toeval vandaan komt
Een computer kan uit zichzelf niets verzinnen. Wat hij wel kan, is meten aan
dingen die niemand kan naspelen: hoeveel microseconden er tussen twee van
jouw toetsaanslagen zitten, hoe warm de chip op dit moment is, wanneer
precies een pakketje van het netwerk binnenkomt. Dat is rommelige,
onherhaalbare ruis. Het besturingssysteem schept die ruis op één hoop, roert
erin, en geeft je er bytes uit. In de browser heet die kraan
crypto.getRandomValues(), en alles op deze site wat een sleutel
maakt, gebruikt hem.
Het verschil met de formule hierboven is niet dat de ene beter geschud is dan de andere. Het is dat er bij de kraan geen regel bestaat om in te vullen.
De sleutel die uit de klok kwam
Nu de fout die mensen echt gemaakt hebben. Je wil een sleutel, je hebt een formule, en je hebt een zaadje nodig om te beginnen. Wat neem je? Iets wat altijd voorhanden is en elke keer anders: de klok.
Dat klinkt redelijk. Tel even mee. Een sleutel van 128 bits heeft 340 282 366 920 938 463 463 374 607 431 768 211 456 mogelijkheden. Maar als hij uit de klok komt en de aanvaller weet binnen het uur wanneer je hem gemaakt hebt, dan zijn er nog 3600 mogelijkheden over. Niet 2128. Drieduizend zeshonderd.
Kraak een sleutel uit de klok
Alles gebeurt in je browser. Er wordt niets naar de server gestuurd.
- Klik Maak een sleutel. De demo kiest een moment in het afgelopen uur en maakt daar 16 bytes van. Je ziet er vier.
- Klik Zoek de rest. De demo probeert elke seconde van het afgelopen uur tot de eerste vier bytes kloppen.
- Kijk hoeveel pogingen het kostte, en vergelijk dat met het getal van 39 cijfers hierboven.
Dit is twee keer echt gebeurd. In 1995 zaaide Netscape, de browser van toen, zijn sleutels met de tijd en het nummer van het programma. Twee studenten in Berkeley, Ian Goldberg en David Wagner, hadden er minder dan een minuut rekentijd voor nodig. En in 2008 bleek dat iemand twee jaar eerder een regel uit de Debian-versie van OpenSSL had weggehaald die de ruis aanvoerde. Wat overbleef was het nummer van het programma: 32 768 mogelijkheden. Elke sleutel die in die twee jaar op zo'n machine gemaakt was, moest weg. De wiskunde was in allebei de gevallen in orde. Het zaadje niet.
Zelf een sleutel gooien
Je hebt geen computer nodig om aan echt toeval te komen. Een dobbelsteen doet het ook, en je kan uitrekenen hoeveel keer je moet gooien. Elke worp heeft zes uitkomsten, en zes mogelijkheden zijn log2(6) = 2,585 bits waard. Voor 128 bits heb je er dus 128 ÷ 2,585 ≈ 50 nodig.
Vijftig worpen
Alles gebeurt in je browser. Er wordt niets naar de server gestuurd.
- Klik Gooi en kijk hoe de teller bits bij elkaar sprokkelt.
- Klik een paar keer Gooi tien keer tot je aan 128 bits zit.
- Bekijk de sleutel die eruit komt. Dat is er een die je ook echt met een dobbelsteen op papier had kunnen maken, en die in hoofdstuk 9.2 nog van pas komt.
Dit is niet alleen een aardigheidje. Mensen die een sleutel bewaren waar echt iets van afhangt, gooien hem soms zo, op een computer die nooit aan een netwerk heeft gehangen. Een dobbelsteen heeft geen fabrikant die je moet vertrouwen.
Wat je hieruit meeneemt
| Waar het getal vandaan komt | Goed voor |
|---|---|
| Een formule met een zaadje | spelletjes, schudden van een speellijst, een kleurtje |
| Een formule gezaaid met de klok | niets waar een geheim aan hangt |
crypto.getRandomValues() | sleutels, wachtwoorden, alles op deze site |
| Een dobbelsteen, vijftig keer | sleutels, en je hoeft niemand te geloven |
Vanaf het volgende hoofdstuk gaan we sleutels gebruiken, en dan gaat het over hoe sterk ze zijn: 128 bits, 256 bits, getallen met tientallen cijfers. Hou dit hoofdstuk in je achterhoofd. Zo'n getal is precies zo sterk als het toeval waar het uit voortkomt, en geen bit sterker.
Dit is wiskunde: informatietheorie
De bits die je bij de dobbelsteen zag optellen, heten entropie, en je rekent ze uit met een logaritme: een keuze uit n even waarschijnlijke mogelijkheden is log2(n) bits waard. Daarom telt een muntworp voor 1 en een dobbelsteen voor 2,585. Claude Shannon schreef die formule op in 1948, in één artikel dat het hele vak informatietheorie opende. Hij bedacht hem niet voor geheimschrift maar voor telefoonlijnen: hoeveel kan je door een draad duwen voor de ruis het wint? Een jaar later liet hij zien dat dezelfde maat precies vertelt wanneer een geheimschrift onbreekbaar is. Dat resultaat kom je tegen in hoofdstuk 9.2. Informatietheorie zit vandaag in elk bestandsformaat dat inpakt, in elke foto die je verstuurt, en in de vraag hoeveel je eigenlijk niet weet.