In deze aflevering bespreken we de verschillende typen van versleuteling: eenrichtingsalgoritmen, symmetrische en asymmetrische tweerichtings algoritmen.
Inhoud:
1. Cryptografische veiligheid
In een computer-omgeving zijn er typisch twee soorten van veiligheid:
- Netwerkveiligheid. Hieronder valt het inbreken, afluisteren, kopiëren, wissen enz. door onbevoegden op uw computer, telefoon of website via een netwerk (lokaal netwerk, wifi, kabel, (a)dsl, telefoon, Internet).
- Cryptografische veiligheid. Dat is de veiligheid van te verhinderen dat iemand (de aanvaller) die achter uw computer zit uw versleutelde berichten. plaatjes, video’s, en geluidsfragmenten tegen uw wil in kan decoderen. De aanvaller beschikt over immense rekenfaciliteiten en kan rekenen op de medewerking van honderden mede-aanvallers.
Bescherming tegen netwerkcriminaliteit is een kwestie van discipline. Het raden van sterke wachtwoorden via het netwerk is een ondoenlijke zaak wegens de (relatieve) gigantische traagheid van een netwerkverbinding. Het populaire SSL protocol – ondersteund door de OpenSSL bibliotheken – kan helpen tegen aanvallen via een netwerk. Websites die in de adresbalk van de browser “https” hebben staan in plaats van “http” ondersteunen het SSL protocol.
Cryptografische veiligheid is heel anders. Uw harde schijf kan met duizelingwekkende snelheid onderzocht worden en geen enkel door u geïnstalleerd computerprogramma kan dat tegenhouden. Het gissen van sleutels of wachtwoorden kan parallel gedaan worden door honderden processoren op een gigantisch rekencentrum waarheen de aanvallers uw computer getransporteerd zouden kunnen hebben.
Onze cursus is bedoeld om u cryptografische veiligheid te verschaffen.
2. Beproefde algoritmen
Iemand die iets af weet van wiskunde kan een rekenmethode (algoritme) bedenken die teksten kan versleutelen en ook weer kan decoderen. Waarom gebruikt niet iedereen zijn eigen algoritme? Het antwoord is: dat werkt nooit. Binnen de kortste keren is die methode gekraakt. Dè manier om een nieuw algoritme geaccepteerd te krijgen, is het te publiceren in een vakblad. Vervolgens zullen letterlijk duizenden wetenschappers wereldwijd hun best doen om dat algoritme te kraken. Als dat na twintig jaar nog niet gelukt is, raakt de gemeenschap ervan overtuigd dat het wel eens een goed algoritme zou kunnen zijn.Een beperking van het gebruik van beproefde algoritmes is dat deze gepatenteerd kunnen zijn.
3. Eenrichtingscodering
Voor een aantal doeleinden wil men kunnen beschikken over versleutelprogramma’s die maar naar een kant werken: dat wil zeggen men kan een tekst coderen, maar niemand kan de geproduceerde cijfertekst decoderen. Het coderen is consistent: hetzelfde algoritme geeft op dezelfde tekst dezelfde uitkomst. Er worden geen sleutels gebruikt. Als je de oorspronkelijke tekst het “bericht” noemt dan geeft het eenrichtingsprogramma een uitkomst die men de “berichtstempel” (message digest) noemt.
Eenrichtingscodering wordt gebruikt om wachtwoorden op te slaan in een gegevensbestand. Het wachtwoord van een gebruiker die inlogt, wordt “gestempeld” door het eenrichtingsalgoritme en de berichtstempel wordt vergeleken met de stempel van het echte wachtwoord in het bestand. Iemand die inbreekt in de database kan geen wachtwoorden genereren, omdat de stempels zijn gemaakt met een eenrichtingsalgoritme.
3.a. Voorbeelden van eenrichtingscodering
De Engelse term voor een dergelijk algoritme is “hash”. De bekendste “hash-algoritmes” zijn MD2, MD4, MD5, MDCC2, SHA1 en RIPEMD-160. MD5 is erg populair (voor wachtwoorden bij websites bijvoorbeeld), maar voor algemene doeleinden zijn SHA1 en RIPEMD-160 beter. Wij raden SHA1 aan omdat het populairder is (dus meer getest).
4. Echtheidscontrole van bericht
Als u een bericht ontvangt van iemand dan kan het van groot belang zijn om zeker te zijn van de echtheid van het bericht. Een populaire manier om de echtheid vast te stellen is de MAC (Message Authentification Code). Met een MAC-algoritme wordt een MAC-stempel van een bericht meegezonden. De ontvanger genereert zelf van het bericht een MAC-stempel en vergelijkt deze met de meegezonden MAC-stempel. Komen die overeen dan is het bericht echt. De werking van de MAC rust op twee principes: (i) ontvanger en zender delen een geheime sleutel (dat is natuurlijk weer een groot getal en (ii) het toepassen van een eenrichtingsalgoritme. Er zijn verschillende vormen van MAC’s, maar allemaal hebben ze gemeen dat ze op een voorgeschreven, ingewikkelde wijze het bericht en de geheime sleuteld mengen en een paar keer een hash maken om tot de uiteindelijke MAC-stempel te komen.
Een fraudeur kan nooit de goede MAC-stempel genereren omdat hij de geheime sleutel niet heeft. De OpenSSL heeft de meest populaire MAC geimplementeerd, de zgn HMAC. Bij een MAC-implementatie heeft de gebruiker nog altijd de keuze welk eenrichtingsalgoritme hij wil gebruiken in de MAC. Uit de vele mogelijkheden van de OpenSSL kiezen we weer SHA1.
5. Symmetrisch of asymmetrisch versleutelen?
Coderen en decoderen gebeurt met sleutels. Een sleutel is een groot getal. In het algemeen geld: hoe groter het getal hoe moeilijker om de sleutel te raden. De grootte van de sleutel wordt aangegeven met het aantal bits: 1 bit betekent dat de sleutel 0 of 1 is. Een sleutel die twee 2 bits groot is, heeft vier mogelijkheden: 00, 01, 10, of 11. Sleutelgrootten die in de praktijk worden gebruikt variëren van 48 bits tot 4048 bits. Voor 48 bits is het aantal mogelijke sleutels 281.474.976.710.656 (getal bestaande uit 15 cijfers) en voor 4048 bits bestaat de sleutel uit 616 cijfers.
In een symmetrische codeermethode is de sleutel om te coderen dezelfde als de sleutel om te decoderen. In een asymmetrische methode is de sleutel om te coderen een andere sleutel dan die om te decoderen. Bij een asymmetrische methode heeft men twee sleutels: het grootste getal, de privé-sleutel, en een kleiner getal de publieke sleutel. De publieke sleutel is af te leiden van de privé-sleutel, maar niet andersom.
Bij het gebruiken van codeerprogramma’s kunt u kiezen uit het direct invoeren van de door uzelf gekozen of gegenereerde sleutels of kunt u gebruik maken van wachtwoorden. Gebruik met wachtwoorden is eenvoudiger, omdat het programma dan zelf de nodige sleutel(s) genereert. Het gebruik en de veiligheid van wachtwoorden zullen we in een aparte aflevering in enig detail bespreken. Om didactisch redenen gaan we er voorlopig vanuit dat we de echte sleutels zelf willen genereren
5.a. Symmetrisch versleutelen
Symmetrisch versleutelen is snel, veel sneller dan asymmetrisch versleutelen. Symmetrisch versleutelen heeft een aantal nadelen, waaronder kwetsbaarheid en schaalbaarheid. Een advocaat die tien cliënten heeft, moet of tien sleutels gebruiken of toestaan dat de cliënten elkaars berichten kunnen lezen.
Een kwetsbaarheid is dat patronen in de uitkomst herkend kunnen worden door een aanvallende computer omdat dezelfde tekst met dezelfde sleutel dezelfde cijfertekst oplevert. Deze kwestbaarheid wordt opgeheven door gebruik te maken van een “beginvector” (initialization vector) (IV). Deze beginvectoren behandelen we verderop.
5.a.1. Voorbeelden van symmetrische algoritmes
Er zijn maar een paar symmetrische algoritmes die betrouwbaar worden geacht. Deze worden allemaal door OpenSSL ondersteund. Het betreft: Blowfish, CAST5, DES, 3Des (Triple DES), IDEA, RC2, RC4, en RC5. Vanaf OpenSSL versie 0.9.7 wordt ook AES ondersteund.
Gezien onze voorkeur voor veiligheid boven snelheid zouden wij 3DES aanraden. DES gebruikt 64 bit sleutels. In 3DES wordt de tekst gecodeerd met DES-sleutel-1 en “gedecodeerd” met DES-sleutel-2 en gecodeerd met DES-sleutel-3. OpenSSL ondersteunt 3DES. Het (didactische) nadeel van 3DES is dat de sleutels in een speciale vorm moeten worden aangeleverd aan het algoritme. Indien u uw sleutels altijd zelf wilt genereren is AES de aangewezen weg.
5.a.2. Beginvectoren (Initialization Vectors – IV)
We gebruiken de symmetrische algoritmes altijd in blokmodus (block mode – CBC). Dat wil zeggen dat de ongecodeerde tekst in blokken van gelijke grootte wordt gehakt na eventueel op een standaardmanier uitgevuld te zijn. Een nadeel is dat een aanvaller patronen kan proberen te herkennen. Een brief begint al gauw met “Beste” of “Hallo”. Om deze aanvallen heel moeilijk te maken wordt er gebruik gemaakt van een beginvector (Initialization Vector) meestal aangeduid als IV. Deze IV is een korte streng, typisch qua lengte een gedeelte van de sleutel (als u een te lange IV gebruikt, gaat OpenSSL klagen). De beginvector hoeft niet geheim te blijven en daarvoor kan altijd dezelfde gebruikt worden. Zonder kennis van de IV kan er niet gedecodeerd worden. Later zullen we een IV gebruiken in ons voorbeeld.
5.b. Asymmetrisch versleutelen
Een bestand kan worden versleuteld met een bepaalde publieke sleutel en de cijfertekst kan dan alleen maar worden gedecodeerd met de bijbehorende privé-sleutel. Ook kan de omgekeerde procedure worden gebruikt: versleutelen met de privé-sleutel en decoderen met de publieke sleutel. Deze omgekeerde procedure vindt toepassing in een MAC, zoals we later zullen uitleggen. Belangrijk is dat voor decoderen altijd de andere sleutel nodig is.
Asymmetrisch versleutelen is minder kwetsbaar en kan makkelijk opgeschaald worden. Het grootste nadeel is dat het veel trager is dan symmetrisch versleutelen. In dagelijkse, niet al te kritische, communicatie wordt over een communicatie-kanaal eerst gecommuniceerd met asymmetrische codering. Dan wordt een tijdelijke symmetrische sleutel gecommuniceerd waarna de versleuteling veel sneller gaat door die symmetrische versleuteling te gebruiken. Dit dubbele principe wordt gebruikt bij websites die via het SSL protocol communiceren.
Wij geven niet om snelheid. Alle cliënten van een advocaat hebben een eigen privé-sleutel en de publieke sleutel van de advocaat. Zij versleutelen hun berichten naar de advocaat met de publieke sleutel van de advocaat. Zo een bericht kan alleen maar gedecodeerd worden door iemand die de privé-sleutel van de advocaat heeft en dat is de advocaat zelf. Het antwoord dat de advocaat stuurt naar een cliënt codeert hij met de publieke sleutel van de cliënt en dat kan alleen maar worden gedecodeerd door iemand die bijbehorende privé-sleutel heeft en dat is precies de bedoeling want dat is de cliënt.
Ons advies is dat een advocaat of notaris met zijn cliënten regelt dat de cliënten zelf privé-sleutels genereren en de publieke sleutel aan de advocaat meedelen. Die cliënten kunnen hun eigen publieke sleutel meedelen aan wie ze maar willen zonder dat er afluistergevaar dreigt.
Later zullen we terugkomen op de mogelijke organisatie en de controle op de echtheid van de publieke sleutel. Het hele communicatie-proces is gebaseerd op het vertrouwen in de echtheid van de publieke sleutel. Want misschien krijgt de cliënt wel een gecodeerd bericht dat na decodering claimt van de advocaat te komen. Maar mogelijkerwijs was dat gecodeerde bericht wel afkomstig van een misdadige organisatie. Een oplossing is dat cliënten alleen maar publieke sleutels accepteren van advocaten of notarissen als ze die sleutel persoonlijk overhandigd krijgen door de advocaat of notaris zelf. Een betere procedure zulle we later bespreken.
5.b.1. Voorbeelden van asymmetrische algoritmes
De twee bekendste algoritmes die met publieke sleutels werken zijn DSA en RSA. Hiervoor kan alleen RSA gebruikt worden voor encryptie en decryptie. De enige keuze die we hebben is de grootte van de prive-sleutel. Daarvoor geldt hoe meer bits, hoe meer veiligheid en hoe trager de encryptie en decryptie. Conservatief als we zijn, kiezen we of 2024 bits of 4048 bits.
6. Echtheid bericht vaststellen met asymmetrische algoritmen
Hierboven hebben we beschreven hoe eenrichtingsalgoritmes kunnen worden gebruik om de echtheid van een bericht vast te stellen. Dit kan ook geschieden met asymmetrische versleuteling en deze vorm is heel populair. We kunnen zowel DSA als RSA hiervoor gebruiken.
Iemand heeft een privé-sleutel en heeft de corresponderende publieke sleutel al eerder uitgedeeld aan de geadresseerde. Van het bericht dat wordt verzonden, wordt tevens de versie meegezonden die gecodeerd is met de privé-sleutel. De ontvanger decodeert deze cijfertekst en vergelijkt deze gedecodeerde tekst met de meegezonden tekst. Indien ze gelijk zijn, is het bericht authentiek. Omdat asymmetrisch versleutelen traag is, wordt vaak een versnelling ingevoerd: van het oorspronkelijke bericht maakt de zender een (korte) stempel met een snel symmetrisch algoritme (Bijv. SHA1). Deze korte stempel wordt vervolgens gecodeerd met de privé-sleutel. De ontvanger scheidt het bericht van de gecodeerde stempel. Hij decodeert de stempel. Dan genereert hij van het oorspronkelijke bericht een stempel met hetzelfde algoritme dat de zender gebruikt heeft. Nu kan hij de twee stempels vergelijken. Als die overeenkomen is de boodschap echt.
WIJ AANVAARDEN GEEN ENKEL RISICO VOOR EVENTUELE SCHADE OF ANDERE NEGATIEVE GEVOLGEN DOOR HET GEBRUIK VAN DOOR ONS GEADVISEERDE OF GEDISTRIBUEERDE SOFTWARE
De volgende aflevering van de Cursus “Veilig digitaal communiceren” zal heten: “Maken van sleutels”.
- Zeer amusante, leerzame columns van de guru:
Schneier on Security * - Goedkoop en heel praktisch:
Secure TCP/IP Programming with SSL: Developer’s Guide** - Network Security with OpenSSL ***
- Secure Programming Cookbook for C and C++: Recipes for Cryptography, Authentication, Input Validation & More ***
- Definitieve gids van de guru:
Applied Cryptography: Protocols, Algorithms, and Source Code in C, Second Edition **
Niveau: *: geen voorkennis, **: beginnend programmeur, ***: ervaren programmeur