This page does not exist in English yet. You are reading the Dutch version.
Crack it yourself
In alle hoofdstukken hiervoor werkte alles. Je duwde op een knop en de wiskunde deed wat ze beloofde. Hier is alles stuk. Vier puzzels, en in elke zit een fout die iemand in het echt gemaakt heeft — in een app, in een wifi-standaard, in de databank van een website. Jij bent nu de aanvaller. Dat is het spel, en tegelijk de les: bij bijna elk lek dat het nieuws haalt is de wiskunde niet gebroken. Ze is verkeerd gebruikt.
Woorden die je zo nodig hebt
- Capture the flag (CTF)
- Een wedstrijd waarin je puzzels krijgt zoals deze. Je krijgt een bestand, een bericht of een website die iets verbergt, en je moet er zelf in breken. Wereldwijd, elk weekend, gratis, en je hoeft er niets voor te kunnen om te beginnen.
- Vlag
- Het korte stukje tekst dat in zo'n puzzel verstopt zit, meestal in de
vorm
vlag{iets}. Vind je de vlag, dan heb je bewezen dat je binnen was. In puzzel 1 hieronder zit er eentje. - Sleutelruimte
- Het aantal sleutels dat bestaat. Bij Caesar zijn dat er 25, bij AES256 zijn dat er 2256. Is de sleutelruimte klein genoeg, dan hoeft niemand slim te zijn: je probeert ze gewoon allemaal.
- Brute force
- Precies dat: alles proberen tot er iets uitkomt. Geen truc, geen inzicht, alleen rekentijd. Het is de aanval waar elk geheimschrift tegen moet kunnen, en de reden dat sleutels zo lang zijn.
- Woordenlijst
- Een bestand met wachtwoorden die mensen echt kiezen, op volgorde van
hoe vaak. De grootste die vrij rondslingeren tellen er honderden
miljoenen. Een aanvaller begint daar, niet bij
aaaa.
Puzzel 1 — 25 sleutels is geen slot
Iemand heeft een briefje laten vallen. Er staat onzin op, maar het is Caesar-onzin: elke letter een vast aantal plaatsen opgeschoven, zoals in hoofdstuk 4. Je kent het aantal plaatsen niet. Dat hoeft ook niet.
Kraak de Caesar
Alles gebeurt in je browser. Er wordt niets naar de server gestuurd.
- Klik Probeer alle 25 verschuivingen. De demo schuift de tekst 25 keer terug en zet alle uitkomsten onder elkaar.
- Loop de lijst af tot je Nederlands ziet. Noteer bij welke verschuiving dat was, en lees de vlag af.
- Klik Laat de computer kiezen. Nu leest niemand mee: de demo telt per regel hoe Nederlands de letters liggen en wijst er zelf een aan. Kijk of ze dezelfde kiest als jij.
- Versleutel er zelf iets mee. Typ gewone tekst in het vak, klik weer alle 25 en neem de regel die je wil. Verschuiving 11 heen is verschuiving 15 terug, want samen zijn ze 26.
Wat hier fout ging: een sleutelruimte van 25
Caesar heeft geen zwakke wiskunde. Het optellen klopt perfect. Er zijn alleen 25 mogelijke sleutels, en een computer probeert er 25 in minder tijd dan jij nodig hebt om ze te tellen. Dat heet brute force, en het is geen aanval op het geheimschrift maar op de maat ervan. AES256 uit hoofdstuk 4 doet exact hetzelfde soort werk als Caesar, met exact dezelfde openheid over hóé het werkt — alleen zijn er 2256 sleutels in plaats van 25, en daar loopt brute force op stuk.
Puzzel 2 — de databank van de sportclub
De site van een sportclub is gehackt. De ledenlijst staat online: naam en wachtwoordhash, meer niet. De club heeft het "goed" gedaan — er staan geen wachtwoorden in, alleen SHA-256 uit hoofdstuk 2. Vier leden.
sam:9970626666560a32465d4ce10d28f3233365af833e15eed59884d9477862c379
noor:89ebdcadc16b41410b4a4e9a5e023d2dda67b2cf9a2a75f8c8231140acfe173a
jules:51aa8f7f35a1d0a8da0f6f3479d68363ee8577b64b98760a4da3b175520def29
kaya:034d1698c7955a85170ebb5a79e6a5fb00ca15bea5a693195ea875a202783bbb
Laat een woordenlijst los op het lek
Alles gebeurt in je browser. Er wordt niets naar de server gestuurd. De demo leest de hashes hierboven rechtstreeks van deze pagina.
- Klik Kraak het lek. De demo hasht elk woord uit een lijst van een paar dozijn en vergelijkt met de vier hashes.
- Kijk hoeveel milliseconden dat kostte. Reken uit wat een lijst van honderd miljoen woorden zou kosten op een machine die duizend keer sneller is dan de jouwe.
- Eén lid overleeft het. Bekijk zijn hash: er is niets aan te zien. Wat hij anders deed, zit niet in de databank maar in zijn hoofd.
- Kraak hem alsnog. Zijn wachtwoord staat letterlijk als voorbeeld in hoofdstuk 3. Ga het halen, zet het in het vak Eigen woorden en klik opnieuw.
Wat hier fout ging: een hash zonder salt
De club heeft niets versleuteld en jij hebt niets ontsleuteld. Je hebt vooruit gerekend: van elk woord de hash genomen en gekeken of hij in de lijst stond. Dat werkt omdat dezelfde invoer altijd dezelfde hash geeft — en dat is precies de eigenschap die een hash nuttig maakt. Er is één ding dat deze aanval breekt, en dat is salt: dan hasht de site niet je wachtwoord maar een willekeurig stukje tekst plús je wachtwoord, voor elk lid een ander. Eén lijst volstaat dan niet meer; de aanvaller moet per lid helemaal opnieuw beginnen. Hoe dat werkt staat in hoofdstuk 3.
Dit is geen verzonnen scenario. In juni 2012 verscheen er van LinkedIn een bestand met 6,5 miljoen wachtwoordhashes op het internet: SHA-1, zonder salt. Binnen enkele dagen was het grootste deel gekraakt, op precies de manier die je hierboven zelf hebt uitgevoerd. Later bleek het lek veel groter dan die 6,5 miljoen.
Nog drie woorden
- Sleutelstroom
- De lange sliert willekeurig ogende bits die een geheimschrift uit de sleutel en de IV maakt. Je bericht wordt er met XOR bij opgeteld, en de ontvanger telt dezelfde sliert er weer af. Je zag het al onderaan hoofdstuk 4.
- Crib
- Een stuk tekst waarvan je vermoedt dat het in het bericht staat:
Hey,de, de naam van de ontvanger. Een gok dus, maar een goede. Crib dragging is die gok over elke plaats in het bericht schuiven en kijken waar hij past. - Token
- Het bewijsje dat een website in je browser achterlaat nadat je ingelogd bent. Bij elk volgend klikje stuurt je browser dat mee, en daaraan herkent de site wie je bent. Er staat in wie je bent en wat je mag.
Puzzel 3 — twee berichten, één sleutelstroom
Een chatapp versleutelt elk bericht met XOR: bericht ⊕ sleutelstroom. Op zich prima — zo werkt AES ook. Maar de programmeur heeft de IV één keer opgeschreven en laten staan. Zelfde sleutel, zelfde IV, dus bij elk bericht exact dezelfde sleutelstroom. Hier zijn twee berichten die de app verstuurde, in hex zoals je ze van de lijn plukt:
bericht 1: 851f2d4e191b20ecdeb03a575d4b296230250f331fdd349737cbeeb18c4aa7673598bf51eadea3227449
bericht 2: 851f2d4e191b20ecdebd34575041286a30370b7d5dc022c361cce9f4934eb5792ecce957f68cb768260b
Kijk naar het begin: 851f2d4e191b20ecde staat er twee keer.
Achttien hex-tekens, negen bytes, letter voor letter hetzelfde. Dat kan
alleen als de berichten daar hetzelfde beginnen én de sleutelstroom daar
hetzelfde is. Eén regel van de app heeft je dat verteld.
Haal de sleutelstroom weg
Alles gebeurt in je browser. Er wordt niets naar de server gestuurd. De twee cijferteksten worden van deze pagina gelezen; de klaarteksten staan nergens in de code — die komen er alleen uit als jouw gok klopt.
- Klik XOR ze op elkaar. Omdat beide berichten met dezelfde sleutelstroom versleuteld zijn, valt die stroom weg. Wat overblijft is bericht 1 ⊕ bericht 2.
- Tel de nullen vooraan. Waar twee berichten hetzelfde teken hebben, geeft XOR nul. Negen nullen betekent: negen tekens gelijk.
- Typ een gok voor bericht 1 en klik Leg mijn gok ernaast. Wat
je terugkrijgt is bericht 2 — als je gok klopt. Begin met
Hey Sam,en typ er telkens een woord bij. Leest de andere kant Nederlands, dan zit je goed; komt er rommel, dan zit je fout. - Vastgelopen? Klik Crib dragging. De demo schuift een lijst alledaagse woorden over elke plaats in de XOR en zet bovenaan wat er het meest als Nederlands uitkomt.
Wat hier fout ging: dezelfde IV twee keer
De sleutel is nergens geraden en nergens gebroken. Hij is weggevallen, omdat hij twee keer op dezelfde manier gebruikt werd. In hoofdstuk 4 staat dat de IV niet geheim hoeft te zijn, alleen nieuw. Dit is waarom. Eén IV te weinig en je hebt geen twee versleutelde berichten meer, maar twee klaarteksten die op elkaar liggen.
Bij AES-GCM, de stand die je berichtenapp echt gebruikt, is het nog erger. Daar levert hergebruik van de IV niet alleen dit op: een aanvaller kan er ook het zegel mee namaken en dus ongemerkt aan je berichten zitten. En AES waarschuwt je niet. Alles blijft er normaal uitzien.
In oktober 2017 lieten Mathy Vanhoef en Frank Piessens van de KU Leuven zien dat je een wifi-toestel kan dwingen zijn sleutel opnieuw te installeren, waardoor de teller die de IV levert op nul terugspringt en dezelfde sleutelstroom opnieuw begint. Die aanval heet KRACK, en ze werkte tegen WPA2 — het beveiligingsprotocol van zowat elk wifi-netwerk ter wereld op dat moment. De naam van hun paper zegt precies waar het over gaat: Forcing Nonce Reuse in WPA2.
Puzzel 4 — de handtekening die niemand controleert
Een schoolplatform geeft je bij het inloggen een token mee. Daarin staat wie
je bent en welke rol je hebt: leerling of beheerder.
De server ondertekent dat token met zijn privésleutel, zoals in
hoofdstuk 7.1, zodat niemand het kan vervalsen. De wiskunde
klopt, het sleutelpaar is echt, de handtekening is echt. Er is maar één
probleem: de server kijkt er niet naar.
Word beheerder
Alles gebeurt in je browser. Er wordt niets naar de server gestuurd. Het sleutelpaar wordt bij elke klik opnieuw gemaakt en verdwijnt als je het tabblad sluit.
- Klik Log in als leerling. De demo maakt een sleutelpaar (ECDSA op P-256, de kromme uit hoofdstuk 6.2) en ondertekent een token. Het verschijnt in het vak: drie stukken in base64url, gescheiden door punten. Ken je van hoofdstuk 1.
- Klik Controleer zoals het hoort. De publieke sleutel zegt: in orde, dit komt van de server.
- Klik Knoei: maak mij beheerder. Het middenstuk wordt
aangepast en in de kop komt
alg: nonete staan — "er is geen handtekening". Het derde stuk wordt leeggemaakt. - Klik Controleer zoals de lekke server. Je bent binnen als beheerder.
- Klik weer Controleer zoals het hoort. Geweigerd. Zelfde token, zelfde wiskunde, ander antwoord — het verschil zit volledig in wat de server doet met wat hij krijgt.
Wat hier fout ging: alg: none
Een handtekening die je niet controleert, is geen handtekening maar een versiering. Erger nog: deze server laat de aanvaller zélf in de kop van het token zetten hoe er gecontroleerd moet worden, en aanvaardt daar het antwoord "niet". Dat is de sleutelbos aan de deurklink hangen met een briefje erbij.
Op 31 maart 2015 publiceerde Tim McLean dat een hele reeks veelgebruikte
bibliotheken voor dit soort tokens precies dit deed: alg: none
binnenlaten als geldige keuze. In hoofdstuk 6 staat waarom dat zo
pijnlijk is — het hele punt van een publieke sleutel is dat iedereen kán
controleren. Hier had iedereen het gekund, en deed niemand het.
Dit is wiskunde: waarom één sleutel twee keer gebruiken alles sloopt
Neem puzzel 3 in symbolen. Bericht a en bericht b gaan allebei door dezelfde sleutelstroom k:
c1 = a ⊕ k
c2 = b ⊕ k
c1 ⊕ c2 = (a ⊕ k) ⊕ (b ⊕ k) = a ⊕ b
Die laatste regel is de hele puzzel. XOR mag je in eender welke volgorde doen, en k ⊕ k = 0 — dat is de regel uit hoofdstuk 4, hier twee keer toegepast. De sleutel valt weg. Wat overblijft bevat geen enkel bit geheim meer: het zijn twee berichten die elkaar afdekken, en Nederlands dekt Nederlands slecht af.
Het gekke is dat XOR met een sleutelstroom wiskundig perfect is zolang je hem één keer gebruikt. Claude Shannon bewees dat in 1949: is de sleutel even lang als het bericht, echt willekeurig en eenmalig, dan valt er niets uit de cijfertekst te halen. Niet "moeilijk" — niets. Dat heet een one-time pad, en het is het enige geheimschrift waarvan bewezen is dat het onbreekbaar is. Het woord one-time doet al het werk.
Dat is geen theorie gebleven. In 1942 maakte de Sovjetdrukkerij onder oorlogsdruk zo'n 35.000 dubbele bladzijden van zulke sleutelboekjes. Amerikaanse codekrakers merkten dat op en konden daardoor jarenlang berichten meelezen — het VENONA-project, dat op 20 december 1946 zijn eerste doorbraak had. Van honderdduizenden onderschepte berichten zijn er nog geen 3.000 geheel of gedeeltelijk gelezen, en dat was genoeg om spionagenetwerken bloot te leggen. Eén hergebruikte bladzijde per keer.
Dit is informatietheorie: het vak dat meet hoeveel informatie er écht in een bericht zit, ook opgericht door Shannon. Het legt uit waarom a ⊕ b te lezen valt en a ⊕ k niet — niet omdat de ene som moeilijker is, maar omdat Nederlandse tekst voorspelbaar is en willekeur niet.
Waar dit ophoudt. Wat je hier deed, doe je op je eigen spullen of in een omgeving die ervoor gemaakt is. Die omgevingen bestaan: de CTF-wedstrijden uit Over deze site zijn precies dit, maar dan een heel weekend en met honderden anderen. Op een systeem dat niet van jou is, is het strafbaar — in België artikel 550bis van het Strafwetboek, ingevoerd door de wet van 28 november 2000. Je hoeft er niets voor kapot te maken en niets te stelen: binnendringen waar je niet mag volstaat. Het verschil tussen de twee is geen kwestie van kunnen, maar van toestemming.