Hoe werkt encryptie?

Stan Hulsen

Encryptie zorgt ervoor dat alles wat jij aan data verstuurt, niet zomaar door anderen is in te lezen. Maar hoe werkt dat nou?

Het is hét onderwerp van de discussie tussen de FBI en Apple: moet Apple de FBI helpen zodat het de encryptie van een iPhone kan omzeilen? Ook in politieke discussies in allerlei landen kwam het het afgelopen jaar veelvuldig naar boven: moeten er geen achterdeurtjes in de encryptie worden gebouwd?

Een steeds groter deel van ons internetverkeer is versleuteld, waardoor derden (lees: inlichtingendiensten en criminelen) niet makkelijk mee kunnen kijken met welke sites we bezoeken of welke berichten we versturen. Ook de inhoud van smartphones is steeds vaker standaard versleuteld. En in besturingssystemen van computers zit de optie om de volledige harde schijf te versleutelen tegenwoordig ingebakken.

Bewust en onbewust beschermen we onze data beter dan ooit te voren. Niet gek, nu we steeds meer gevoelige data (bijvoorbeeld op het gebied van gezondheid en financiën) digitaal opslaan en versturen. Maar hoe werkt encryptie nu precies? Een basiscursus.

De basis van encryptie

Stel, je hebt een vertrouwelijk document op je harde schijf. Het is niet de bedoeling dat de inhoud daarvan door iedereen zomaar gelezen kan worden. Daarom versleutel je het bestand met een algoritme dat de inhoud van de tekst omzet naar gebrabbel. In de cryptografie wordt dat het omzetten van de plaintext naar een ciphertext genoemd.

De combinatie van de twee algoritmes, waarvan de één het bericht versleutelt en de ander het bericht weer ontcijfert, heet een cipher. Er zijn ciphers in alle soorten en maten. Eenvoudige algoritmes veranderen een letter bijvoorbeeld in een andere letter (elke A wordt bijvoorbeeld een C, elke B een D, enzovoort), vergelijkbaar met de geheimtaal die je misschien wel gebruikte als kind. Complexere algoritmes kunnen letters ook in een uitgebreidere combinatie van tekens omzetten (elke A wordt bijvoorbeeld e9G$c2). Als een algoritme op deze manier werkt, wordt dat substitutie (‘vervanging’) genoemd. Een eenvoudig voorbeeld:

          Hallo > Jcnnq

Naast substitutie kan een algoritme ook werken op basis van permutatie. Daarbij verwisselt het algoritme de volgorde van tekens. Bijvoorbeeld zo:

          Hallo > loaHl

Om een cipher veiliger te maken, kan het algoritme ook verschillende rondes van versleuteling uitvoeren. Hoe meer rondes uitgevoerd worden, hoe ingewikkelder het wordt om van ciphertext terug te gaan naar de plaintext als je niet weet welke handeling uitgevoerd moet worden. Hieronder staat bijvoorbeeld een cipher met twee rondes. Eerst voert hij een permutatie uit, daarna een substitutie:

          Hallo > loaHl > nqcJn

Door algoritme omgekeerd uit te voeren, wordt de ciphertext weer omgezet in plaintext en is je bericht dus leesbaar voor jezelf en de ontvanger.

De sleutel

Bij elk algoritme hoort een sleutel. Door deze sleutel in het algoritme te ‘injecteren’, wordt  boodschap versleuteld of ontcijferd.

Advanced Encryption Standard (AES) is, zoals de naam doet vermoeden, tegenwoordig de standaard op het gebied van encryptie. Het is de moderne opvolger van de Data Encryption Standard, die in 1990 werd gekraakt. AES is een block cipher. Dat betekent dat het algoritme bestanden in blokken van bits versleutelt, wat sneller gaat dan bit voor bit versleutelen. AES codeert en decodeert berichten in blokken van 128 bits. De plaintext wordt dus een ciphertext van 128 bits.

Daarvoor gebruikt hij een sleutel met een lengte van 128, 192 of 256 bits. Theoretisch is een langere sleutel een stuk veiliger. Je kunt een cipher namelijk kraken door elke mogelijke sleutel te proberen: brute forcing. Praktisch gezien is een sleutel van 128 bits momenteel echter al veilig genoeg. Er zijn namelijk 2^128 mogelijk combinaties van die key. Dat zijn meer dan 340 hexiljoen (36 nullen!) mogelijkheden. Voorlopig betekent dat de encryptie praktisch gezien niet te kraken is door middel van bruteforcing. Uit voorzorg zie je desondanks dat er voor de zekerheid al voor een een sleutel van 256 bits wordt gekozen.

Moderne encryptie

Laten we het nog wat ingewikkelder maken. Grofweg bestaan er namelijk twee soorten manieren om een boodschap te versleutelen: symmetrische en a-symmetrische encryptie.

Bij symmetrische encryptie hebben zender en ontvanger van een bericht allebei de sleutel om het bericht enerzijds te versleutelen en anderzijds weer te ontcijferen. Dat betekent ook dat iemand die het bericht onderschept én de sleutel kent, het bericht kan ontcijferen. Dat maakt symmetrische encryptie soms een risicovolle manier om te communiceren. De sleutel moet altijd op de een of andere manier bij je partner terechtkomen, met daarbij het risico dat de sleutel onderschept kan worden. Als dat gebeurt, is je beveiliging niets meer waard, want iedereen die de beschikking heeft over de sleutel kan de boodschap vervolgens ontcijferen.

Bij a-symmetrische encryptie worden twee sleutels gebruikt om boodschappen te versturen. Allereerst gebruikt de verzender een sleutel om een bericht de versleutelen. De ontvanger gebruikt een een andere, daar aan gekoppelde, sleutel om het bericht weer te ontcijferen. De ontvanger gebruikt in dat geval een sleutel die alleen hij kent: een privésleutel. Aan die sleutel is een andere sleutel gekoppeld die openbaar wordt gemaakt. Het voordeel daarvan is dat de ontvanger de enige persoon is die de sleutel heeft om de boodschap te ontcijferen, maar dat iedereen bestanden naar die persoon versleuteld kan versturen. De ontvanger is namelijk de enige persoon die de privésleutel kent en de boodschap daarmee kan ontcijferen. Daardoor loop je, zoals bij communicatie van symmetrische encryptie, niet het risico dat iemand anders de sleutel kan onderscheppen.

Andersom werkt ook: met de privésleutel kan je informatie ook versleutelen. De ontvanger kan de boodschap vervolgens met de publieke sleutel ontcijferen (wat iedereen kan doen, want iedereen heeft immers toegang tot de publieke sleutel van de zender). Werkt deze combinatie, dan weet de ontvanger dat de informatie daadwerkelijk van de persoon afkomt. Op die manier kun je bijvoorbeeld identiteitsfraude tegengaan.

Een symmetrische encryptie is niet per se veiliger dan een asymmetrische encryptie of andersom. De veiligheid van de encryptie staat of valt namelijk bij de sleutel. Encryptie met geheime en publieke sleutels worden zowel naast als door elkaar gebruikt.

Hash-algoritmes

Dan hebben we ook nog hashing, dat wordt gebruikt voor authenticatie en controle. Hashing houdt in dat een bepaalde plaintext wordt omgezet in een ciphertext van een bepaalde lengte. De plaintext kan één woord zijn, of een compleet boek, maar de ciphertext – de hashcode – zal hetzelfde aantal tekens hebben. Veilige hashes zijn bovendien zo opgebouwd, dat zelfs de kleinste verandering in de plaintext, zoals een extra spatie, ervoor zorgt dat de hashcode er compleet anders uitziet. Ook wordt de hashcode vaak uitgebreid met tekens die helemaal niet gebaseerd zijn op de plaintext.

          kat > 0MeF8ronY21o31Wxn

          de hond dook in het warme water > Uc9twVxC4aBmtIz68

          de hond dook  in het warme water > b2hNw7mMe48rGap0v

Hashing voor wachtwoorden

Hash algoritmes worden vaak gebruikt voor het matchen van wachtwoorden. Stel, je logt in bij je maildienst met het wachtwoord hallo123. Op de mailserver staat niet het wachtwoord hallo123 opgeslagen, maar wel de bijbehorende hashcode.

          hallo123 > Hash algoritme > a93mb2An2Xmo1nB0PbrR2

Zodra je inlogt met jouw wachtwoord, checkt de sever of de hashcode die daar staat, overeenkomt met de hashcode die het algoritme – op basis van jouw ingevoerde wachtwoord – genereert.

Dit betekent dat als een hacker in theorie toegang zou krijgen tot zo’n database met wachtwoorden, hij daar helemaal niets mee kan. Een hashcode kun je namelijk niet terugdraaien naar de plaintext. Je bent in dat geval alsnog veilig, zelfs als jouw gebruikersnaam bij de hashcode staat.

Een veilige hashcode is gebaseerd op een aantal voorwaarden. Zo moet andere plaintext altijd een verschillende hashcode genereren. Stel dat het wachtwoord 456doei dezelfde hashcode genereert als jouw wachtwoord: dan zou iemand met zowel hallo123 als 456doei kunnen inloggen op jouw account.

Daarom is het voor een veilige hash ook belangrijk dat het onmogelijk is om het bericht zo te manipuleren dat dat resulteert in een bepaalde hashcode. Dat hangt deels samen met de vorige voorwaarde. Als dat namelijk mogelijk is, zou iemand die toegang heeft tot de database van hashcodes, een corresponderende plaintext (wachtwoord) kunnen genereren. Die persoon zou dan een ander wachtwoord kunnen invoeren, maar alsnog matchen met de hashcode van jouw wachtwoord en dus toegang krijgen tot jouw gegevens.

Hashing voor authenticatie

De hashcode die bij een bepaalde plaintext hoort, kan ook gebruikt worden om te controleren of het bestand van iemand komt wie hij beweert te zijn en om te controleren dat er niet met het bestand geknoeid is.

Stel, je ontvangt een bestand met gevoelige informatie per e-mail. Vervolgens ontvang je een hashcode die met het bestand zou moeten matchen. Als er tussendoor iemand met bestand geknoeid heeft, is de hashcode compleet anders. Immers:

          de hond dook in het warme water > Uc9twVxC4aBmtIz68

          de hond dook  in het warme water > b2hNw7mMe48rGap0v

Maar als de hashcode die je van je bron ontvangt, bijvoorbeeld Uc9twVxC4aBmtIz68, overeenkomt met de hashcode die je zelf genereert door het bestand door het hash algoritme te halen, weet je dat het bestand hetzelfde is. In dat geval kun je er zeker van zijn dat de hond in het warme water dook.

Deze vorm van versleuteling beschermt de zender en ontvanger dus van de tussenkomst van een derde partij. Het systeem is compleet gebaseerd op vertrouwen tussen de zender en ontvanger.

Voor hashing zijn verschillende standaarden in omloop. In het verleden werd meestal de MD5-hashfunctie gebruikt. Die wordt tegenwoordig echter als onveilig beschouwd. Daarom wordt steeds vaker een versie van het Secure Hash Algorithm (SHA) gebruikt.

Encryptie over netwerken

Om informatie tussen een server en browser veilig te verzenden, werd Secure Socket Layer (SSL) ontworpen. SSL is de voorganger van het later ontworpen Transport Layer Security (TLS). Deze techniek wordt bijvoorbeeld gebruikt om HTTP-verbindingen met servers te versleutelen tot HTTPS en de server waarmee verbinding wordt gemaakt te authenticeren. Als je informatie over het internet verstuurt, wil je namelijk niet dat iemand anders dan de ontvanger deze informatie kan lezen. Ook wil je niet dat je de informatie in werkelijkheid naar een andere partij verstuurt. Dat geldt helemaal als het gaat om fraudegevoelige data, bijvoorbeeld voor het doen van online bankieren.

In het geval van bijvoorbeeld internetbankieren of online aankopen, beantwoordt SSL/TLS de vraag of jij inderdaad een verbinding hebt met bank of shop waarmee jij een transactie doet. Is diegene die jouw gegevens ontvangt inderdaad de ING, of Bol.com?

Certificaatautoriteit

Dat proces werkt met asymmetrische encryptie: er is dus zowel een privé- als publieke sleutel in het spel. Om te kunnen controleren of degene daadwerkelijk is wie hij zegt te zijn, treedt een derde partij op: de certificaatautoriteit (CA). Het doel van zo’n CA is garant staan dat de publieke sleutel van een persoon organisatie ook echt hoort bij die persoon of organisatie.

Je zou het certificaat dat een CA uitgeeft ook als een fysiek exemplaar van een certificaat kunnen zien. Op dat digitale vel papier staat aan welke persoon of organisatie het certificaat is verleend, zijn publieke sleutel en een geldigheidsduur. De certificaatautoriteit ‘ondertekent’ dat pakketje vervolgens door het te versleutelen met zijn geheime sleutel. En omdat de publieke sleutel openbaar is, kan iedereen controleren dat het certificaat inderdaad is versleuteld door de certificaatautoriteit.

Zodra jij verbinding maakt met de server van de bank, ontvang jij het certificaat. Jouw browser controleert of dat certificaat klopt. Als dat zo is, zal hij dat aangeven: er verschijnt een groen slotje en de HTTPS-verbinding wordt zichtbaar doordat in plaats van het http-protocol https wordt gebruikt. Daarna maakt jouw browser een geheime sleutel. Die wordt beveiligd met de publieke sleutel van de bank. Alleen de bank kan deze sleutel dus inzien door het met zijn eigen geheime sleutel te openen. Omdat de bank dan toegang heeft tot de geheime sleutel, kan hij die gebruiken om het versleutelde dataverkeer dat jij verstuurt te lezen.

Trouwens: mocht er iets niet kloppen aan het certificaat dan geeft je browser een melding dat je verbinding mogelijk niet veilig is.

Google probeert steeds actiever af te dwingen dat voor al het internetverkeer HTTPS wordt gebruikt. Sites die een beveiligde verbinding ondersteunen krijgen voorrang in de zoekresultaten. En in Gmail wordt voortaan expliciet aangegeven wanneer je mailt naar een server die geen HTTPS ondersteunt.

Encryptie bij wifi-verbindingen

De moderne standaardbeveiliging op wifi-verbindingen heet WPA2. Dit protocol werd in 2004 geïntroduceerd als opvolger van de inmiddels niet meer zo veilige WEP en WPA.

WPA2 kent twee varianten: WPA2 Personal, geschikt voor thuisnetwerken, en het beter beveiligde WPA2 Enterprise, voor bijvoorbeeld bedrijfsnetwerken. Met Enterprise heeft iedereen die verbinding wil maken een eigen inloggegevens nodig en kun je bijvoorbeeld ook gasten toegang geven tot het netwerk.

Bij WPA2 Personal heeft iedereen die beschikt over het wachtwoord toegang tot de verbinding. In principe is het wachtwoord dus een symmetrische key: zodra je met je telefoon, tablet of laptop verbinding wil maken met wifi, controleert zowel het apparaat als de toegangspoort op je router of het wachtwoord overeenkomt.

Dat zou echter ook betekenen dat iedereen die het wachtwoord in zijn bezit heeft ook jouw internetverkeer kan inzien. Diegene heeft immers toegang tot de sleutel. Gelukkig is dat niet het geval.

Om te voorkomen dat derden mee kunnen lezen met alle data die jij thuis verstuurt, zorgt WPA2 ervoor dat de verbinding elke keer opnieuw wordt versleuteld. Nadat je verbinding maakt met het netwerk, wordt er een algoritme uitgevoerd dat het wachtwoord (de plaintext) omzet in een ciphertext van 256 bits.

Dat gaat zo: het wachtwoord wordt door een hash-algoritme bewerkt tot onleesbaar gebrabbel. Om de ciphertext complexer te maken, worden er extra tekens aan toegevoegd. Dat wordt salt genoemd. In WPA2 wordt voor de salt de netwerknaam daarvoor gebruikt. Vervolgens worden er 4096 rondes van het algoritme SHA-1 (Secure Hash Algorithm 1) uitgevoerd. Het resultaat is een sleutel van 256 bits. Omdat dit bij elke sessie gebeurt, worden er telkens nieuwe tijdelijke sleutels aangemaakt, waardoor het enorm lastig wordt om de data af te lezen.

Encryptie in hardware

Wat je steeds meer ziet gebeuren is dat encryptie fysiek wordt ingebakken in chips. Hierdoor is het namelijk ongelofelijk lastig om encryptie te kraken of te omzeilen. Een concreet voorbeeld is de iPhone: bij het versleutelen van alle data op het toestel wordt de pincode van het toestel gebruikt, maar ook een een zogenaamde unique idenitifier in de hardware van het toestel dat eigenlijk fungeert als een extra sleutel. Mocht je de opslagchip uit de iPhone slopen, kun je hem niet meer decrypten, omdat je de unique identifier mist.

Bij mobiele betalingen gebeurt hetzelfde. De betaalindustrie heeft een standaard afgesproken, het Secure Element, dat wordt ingebouwd in bijvoorbeeld smartphones en zorgt voor een hardwarematige beveiliging van mobiele betalingen.

Met de opkomst van Internet of Things en de toenemende groei van de rekenkracht van computers groeit de vraag naar sterkere encryptie en in het bijzonder ook van encryptie die ingebouwd zit in de hardware. Alleen op die manier is het risico op zowel grote als kleine criminaliteit en/of afluisteren door nieuwsgierige overheden te voorkomen.

Foto via Pexels