Cryptografie speelt al heel lang een belangrijke rol in de uitwisseling van informatie. Ook het breken van de code heeft een belangrijke rol gespeeld. In de tweede wereldoorlog zijn cruciale slagen gewonnen door de geallieerden doordat ze versleuteling van informatie door de Japanners en de Duitsers gebroken hadden. Hoe veilig is moderne cryptografie? Wanneer goed toegepast veilig, maar ook in deze tijd zijn er nog vele aandachtspunten die in het oog gehouden moeten worden.
Er zijn diverse methoden om in te breken in een uitwisseling van versleutelde informatie, een aantal voorbeelden, die vaak in combinatie worden gebruikt:
- Brute Force; botweg alle mogelijke sleutels proberen. Een zeer langdurig proces, maar als bijvoorbeeld de sleutels slecht gekozen zijn dan is het met moderne middelen zomaar haalbaar. Voor asymmetische algoritmes kan zowel de versleutelde informatie onderworpen worden aan een Brute Force, maar het is wellicht sneller om te zien welke private key er bij de public key, die berekend is op basis van de private key, zou passen;
- Zoeken naar “defecten” de algoritmes. Bij goede versleuteling ziet de versleutelde data er altijd uit als een volledig willekeurige (random) set van bits. Echter het kan zijn dat onder bepaalde omstandigheden, bijvoorbeeld met een bepaalde opeenvolging van letters het resultaat van de versleuteling niet helemaal willekeurig is. Deze patronen kunnen dan doelgericht ingezet worden om een klein stukje data te ontsleutelen. Dit levert vervolgens weer kennis over het algoritme en gebruikte sleutels op, wat weer gebruikt kan worden om de rest van de informatie te ontsleutelen. Een terugkerende zorg hier is dat defecten ook doelbewust ingebouwd kunnen zijn. Zo zijn er beschuldigingen geweest aan het adres van de NSA dat zij algoritmes met een achterdeur verspreid hebben.
- Statistische analyse op de versleutelde data en die correleren met een statistische analyse op de gebruikte taal. Hoewel dit niet direct leidt tot het ontsleutelen van data, kan het aanknopingspunten bieden, zowel over de inhoud van het versleutelde bericht als andere manieren om de informatie te ontsleutelen.
- De belangrijkste en in punt 1 al aangehaald; gebruik maken van fouten tijdens het versleutelproces. De fouten die gemaakt kunnen worden zijn divers.
“Electronic Codebook”
Cryptografie goed toepassen is moeilijker dan het lijkt. Stel, ik wil het Tesorion logo versleuteld verzenden. Om dat te doen gebruik ik AES met een blokgrootte van 256 bits. Deze sleutel kies ik volledig willekeurig. Ik deel het plaatje op in een aantal blokken met data en versleutel deze met AES. Vervolgens verstuur ik het plaatje. Klinkt goed en veilig toch? Dit is wat er met het plaatje gebeurde door de encryptie:
Na het versleutelen is het plaatje nog herkenbaar! Dit komt doordat het plaatje structuur bevat. Deze structuur heeft herhalende elementen. Als dit element versleuteld wordt, komt
er steeds hetzelfde resultaat uit. Het maakt niet uit waar het blokje blauwe of witte pixels staat, de versleuteling van het blokje geeft iedere keer hetzelfde resultaat.
Deze manier van versleutelen heet overigens “Electronic Codebook” (ECB). Als we het plaatje goed willen versleutelen, zullen we het algoritme dus op een andere manier moeten toepassen.
Schematisch gezien gebeurde er net het volgende:
Dit is eenvoudig te veranderen in:
Waarbij we voor de encryptie van ieder blok eerst een berekening maken waarbij we het te versleutelen blok gebruiken en het versleutelde resultaat van het vorige blok. Deze manier van versleutelen heet “Cipher Block Chaining” (CBC). Naast deze methode bestaan er ook nog een aantal anderen als “Cipher Feedback” (CFB) en “Output Feedback” (OFB). In ons geval ziet het resultaat er nu zo uit:
Bij het versturen van versleutelde berichten kan een derde partij niet zien wat de inhoud van het bericht is, maar hij kan wel de activiteiten observeren die bij beide partijen
plaatsvinden. Bijvoorbeeld, een partij kan een versleuteld berichtje versturen om een bepaalde vlag te hijsen. Een derde partij ziet het versleutelde bericht en ziet dat de vlag gehesen wordt.
Als de volgende keer dat dit bericht verstuurd wordt de vlag weer gehesen wordt, dan kan de derde partij wel raden wat er in het bericht stond en daar de volgende keer op anticiperen, of zelf het versleutelde bericht sturen om de actie uit te lokken. Dit laatste noemen we een “Replay Attack”. Het “opnieuw afspelen” van een versleuteld bericht om een bepaalde reactie te bewerkstelligen. Bij deze aanval is het dus niet nodig om te weten hoe het bericht ontsleuteld moet worden!
Het is dus belangrijk dat bij het versleutelen van een tekst er een maatregel wordt genomen die ervoor zorgt dat het versleutelen iedere keer een ander resultaat heeft.
Rekenkundig is dit eenvoudig te regelen. In de CBC-methode wordt iedere keer de waarde van het vorige blok gebruikt. Voor het eerste blok is er geen vorige waarde. Deze kunnen we dus zelf kiezen. Deze waarde heet dan de “Initialisatie Vector” (IV).
De IV wordt meestal willekeurig gekozen. Wanneer beide partijen afspreken een IV maar één keer te gebruiken, wordt er ook wel gesproken van een “nonce” (number used once). De IV of nonce kan onderling gecommuniceerd worden, maar kunnen ook afspraken gemaakt worden over hoe de IV of nonce te bepalen, bijvoorbeeld op basis van het berichtnummer of de tijd.
Het is belangrijk om de IV onvoorspelbaar/willekeurig te bepalen. Er zijn in het verleden aanvallen geweest
die de voorspelbaarheid van de IV gebruikten om aannames over de versleutelde data te testen. Een voorbeeld hiervan is de BEAST-aanval tegen het TLS protocol dat gebruikt wordt in https. Een vraag aan een webserver, het eerste blok in de CBC keten, begint bijna altijd op dezelfde manier. De gebruiker zal wel om een
bepaalde pagina vragen. Neem hierbij een voorspelbare IV en de aanvaller heeft een aantal gegevens die hij kan gebruiken bij het kraken van de verbinding.
“Willekeurige getallen”
Willekeurige getallen worden nogal eens gebruikt bij versleuteling, voor het bepalen van de sleutels, voor het bepalen van de IV of nonce en als salt voor een hash.
Als computers iets slecht kunnen, is het het noemen van een willekeurig getal. Zelfs een mens kan dat niet goed. Als een aanvaller kan voorzien hoe een computer een willekeurig getal kiest, dan kan hij een heleboel sleutels/IV/nonce/Salt uitsluiten in zijn poging om de communicatie te kraken.
Maar hoe kiest een computer een willekeurig nummer? Simpel, met een formule in combinatie met iets dat hij kan meten. Dat kan de tijd zijn, een stukje data op een bepaalde plaats van de harddisk, of de laatste beweging van de computermuis. Een veelgebruikte formule is:
Xn+1= ( a* Xn+ b ) mod m
Waarbij a, ben mgrote
gehele getallen zijn en Xeen reeks van getallen, waarbij het volgende getal bepaald wordt aan de hand van het laatst berekende getal.
De eerste keer dat we de formule gebruiken hebben we nog niets voor X; Xn=0is onbekend. Het eerste getal in de reeks wordt vaak gekozen op iets dat de computer kan meten en heet de seed (het zaadje).
Het resultaat is natuurlijk alleen maar ogenschijnlijk willekeurig daarom spreken we bij een computer meestal van een Pseudo Random Number Generator (PRNG) in plaats van een Random Number Generator (RNG). We gebruiken de formule met een aantal waardes voor a, b, m en de seed om het probleem met de PRNG aan te tonen.
De tabel laat het probleem duidelijk zien. Kiezen we a, b en mte klein dan is er geen sprake van een willekeurig getal. Zelfs wanneer we de getallen groter kiezen zien we nog een herhalende reeks getallen. Pas in de laatste kolom is er geen herhaling zichtbaar in de eerste 10 getallen.knip
De formule in combinatie met de in het voorbeeld gekozen getallen levert geen goede PRNG op. Omdat de getallen niet mooi verdeeld zijn spreken we van een slechte entropie. Een goede
PRNG heeft geen makkelijk observeerbare periode en heeft een homogene verdeling van willekeurige nummers, ofwel een goede entropie.
Wanneer een PRNG een slechte entropie heeft, kan een aanvaller aannames gaan doen over de getallen die gebruikt worden in bijvoorbeeld een sleutel. Dan kan het zomaar haalbaar worden om binnen een niet al te lange tijd een sleutel te raden!
De zwakste schakel
In de voorbeelden die top op heden in deze blog genoemd worden lijken misschien zorgelijk, maar meestal gaat het op een nog veel eenvoudigere manier mis.
Bijvoorbeeld; een website moet voorzien worden van een certificaat. Die kun je bij een TTP op het Internet aanschaffen. De TTP heeft een goede dienstverlening en bied met een druk op de knop de private key en het certificaat ter download aan. Hoe heeft de TTP die private key gegenereerd, waar heeft hij deze allemaal opgeslagen? Heeft de TTP voldoende maatregelen genomen om een cyber inbraak te detecteren?
Private keys moeten altijd door de persoon of organisatie zelf gegenereerd worden. De TTP hoeft alleen de certificaat aanvraag met de publieke sleutel te zien. Onder andere banken nemen dit zo serieus dat ze speciale apparaten hebben voor het afhandelen van de versleuteling van de gevoeligste informatie, ook wel Hardware Security Module (HSM) genoemd, zodat de (private) keys altijd veilig gegenereerd kunnen worden en opgesloten zitten.
Een ander simpel voorbeeld; hoe langer een sleutel in gebruik is, hoe meer versleutelde data beschikbaar is voor een aanvaller om statistische analyses op te doen. Des te langer je dezelfde sleutel gebruikt, des te groter de kans dat hij uitlekt door zo’n analyse. Daarom moeten sleutels, regelmatig gewisseld worden. Dit is iets dat nogal eens vergeten wordt. Net zoals het opstellen van procedures wat er moet gebeuren als het vermoeden bestaat dat een sleutel is uitgelekt.
Weet u waar u allemaal gebruik maakt van encryptie en waar de sleutels bewaard worden?
“Stay tuned”voor het volgende deel van deze blog waarin
eindelijk de blockchain aan bod komt!
Behandelde begrippen:
- BEAST-aanval: Aanval op TLS waarbij gebruik gemaakt wordt van een slecht gekozen IV.
- Cipher Block Chaining: Manier van versleutelen waarbij bij de versleuteling van ieder blok het resultaat van de versleuteling van het blok ervoor gebruikt wordt. Dit voorkomt dat patronen die aanwezig zijn in de brondata ook in de versleutelde data te zien zijn.
- Electronic Codebook (ECB): Manier van versleutelen waarbij ieder blok data individueel versleuteld wordt.
- Entropie: Mate van willekeurigheid van een set getallen of gegevens. Als iets volledig willekeurig is, dan heeft het een goede Entropie. Als iets niet volledig willekeurig is, heeft het een slechte Entropie.
- Initialisatie Vector (IV): Getal of gegevens die gebruikt worden voor de versleuteling van het eerste blok data in een conversatie.
- Nonce: Een IV die maar éénmaal gebruikt wordt.
- PRNG: Pseudo RNG. Een stukje programmatuur dat een RNG nabootst.
- Replay Attack: Aanval waarbij de aanvaller een stuk (versleutelde) data opnieuw verstuurd om zo een bepaalde reactie te bewerkstelligen. De aanvaller hoeft hierbij niet perse te weten wat de inhoud van de data is.
- RNG: Generator voor willekeurige getallen
- Seed: Getal of input waarmee een PRNG geïnitialiseerd wordt.