1 Introductie Informatie coderen en kraken een cryptografie workshop door Ben van Werkhoven en Peter Peerdeman In dit practicum cryptografie raak je bekend met een aantal simpele vormen van cryptografie waar je eerst nog geen computer bij nodig hebt, daarna leer je met het programma openssl in een commandline omgeving cryptografische commando s uit te voeren en tot slot leer je alles over public key cryptography met GPG. Het programma openssl is in de praktijk aanwezig in iedere UNIX/Linux omgeving en GPG kan eenvoudig geïnstalleerd worden. Ook voor windows zijn beide programma s te downloaden. 1 1.1 Cryptografie Een van de belangrijkste doelen van cryptografie is ervoor zorgen dat een vertrouwlijk bericht voor niemand anders leesbaar is dan voor degene voor wie het bericht bedoelt is. Al in de oudheid maakte men gebruik van deze vorm van cryptografie en een van de bekendste voorbeelden is Caesar substitutie. In Caesar substitutie worden alle letters van het alfabet een vast aantal plaatsen verschoven, zodat een versleuteling onstaat. De sleutel waarmee het bericht ontcijferd of gedecodeerd kan worden is het aantal waarmee de letters zijn opgeschoven. Een voorbeeld van een Caesar substitutie is: a b c d e f g h i j k l m n o p q r s t u v w x y z x y z a b c d e f g h i j k l m n o p q r s t u v w In bovenstaand voorbeeld zijn alle letters in het onderste alfabet 3 plaatsen verschoven. Als we nu Vrije Universiteit willen versleutelen krijgen we Sofgb Rkfsbopfqbfq. Opgave 1 versleutel je eigen naam: Je kan je voorstellen dat een dergelijke versleuteling niet bepaald goed genoeg is voor het digitale tijdperk. Zelfs zonder computer is het niet moeilijk om de originele tekst te achterhalen, door bijvoorbeeld naar de lengte van een woord of de herhaling van bepaalde letters te kijken. Opgave 2 ontcijfer het volgende bericht: Tqj lqhibqkjqbqd lmd qqd nqhuotj ui mbbqqd pudleb mbi pq lqhibqkjqbpq jqaij duqj jq edouvrqhqd ui pedpqh ibqkjqb. Hoeveel plaatsen zijn alle tekens opgeschoven? Caesar substitutie is niet het enige bekende voorbeeld uit de oudheid, maar wel een van de simpelste monoalfabetische substituties. Een moeilijker voorbeeld van een mono-alphabetische substitutie is gegeven door de coderingtabel: a b c d e f g h i j k l m n o p q r s t u v w x y z u f y p v n i m j c q k a b o g w d t r z l e x h s Waarin een iedere letter vervangen is door een willekeurige andere. Een handig hulpmiddel bij het ontcijferen van deze code is de frequentie analyse. Iedere taal heeft zijn eigen frequenties voor het voorkomen van bepaalde letters, in het Engels zijn de drie meest voorkomende letters e, t en a, in het Nederlands zijn dat de e, n en a. 1 Openssl: http://www.slproweb.com/products/win32openssl.html GPG: http://www.gnupg.org/download/index.en.html 1
Opgave 3 ontcijfer het volgende bericht (Hint: de originele tekst is in het Engels) Qfgrjnsfbrxg co fihiffiz bdlnoj ieqdpocuidg jn iaqfgrjcna, wxcqx co jxi rfnqioo nh qnauifjcas nfzcabfg cahnflbjcna, jxi rdbcajiej, cajn pacajiddcscydi scyyifcox, jxi qcrxifjiej. Ziqfgrjcna co jxi fiuifoi, lnucas hfnl jxi pacajiddcscydi qcrxifjiej ybqm jn rdbcajiej. B qcrxif co b rbcf nh bdsnfcjxlo wxcqx qfibji jxi iaqfgrjcna baz jxi fiuifocas ziqfgrjcna. Jxi zijbcdiz nrifbjcna nh b qcrxif co qnajfnddiz ynjx yg jxi bdsnfcjxl baz ca ibqx caojbaqi yg b mig. Jxco co b oiqfij rbfblijif, czibddg manwa nadg jn jxi qnllpacqbajo, hnf b oriqchcq lioobsi ieqxbasi qnajiej. Om het nog niet al te moeilijk te maken is de frequentietabel van bovenstaande ciphertext gegeven: a b c d e f g h i j k l m n o p q r s t u v w x y z 34 29 46 19 07 34 13 08 59 46 00 10 03 32 21 04 26 17 11 00 05 03 00 26 09 10 2 Openssl In de jaren 70 werd DES (Data Encryption Standard) ontwikkeld door de Amerikaanse overheid. Door DES werd het tijdperk van de blok vercijferingen ingeluid. In blok vercijfering wordt een bericht eerst in stukken opgedeeld om daarna per blok versleutelt te worden. De simpelste manier om van deze blokken weer een compleet bericht te maken is ze achter elkaar zetten, deze methode wordt ook wel ECB (electronic codebook) genoemd en wordt niet gebruikt in de praktijk omdat het te simpel is. In de volgende opgave gaan we zien waarom ECB niet echt handig is, maar daarvoor moet je eerst nog wat over openssl weten. Als voorbeeld kijken we even naar het volgende commando, je hoeft het nog niet in te voeren. openssl enc -e -nosalt -des-ecb -in plaintext -k 9 Dit commando wordt zal als volgt geïnterpreteerd worden: start het programma openssl voor encryptie, -e voor encryptie, -nosalt om geen extra cryptografische functies te gebruiken, -des-ecb betekent dat we DES encryptie willen gebruiken met ECB als methode om van de versleutelde blokken een compleet bericht te maken, -in plaintext geeft aan dat we het bestand plaintext als input willen gebruiken, -k 9 geeft aan dat we als sleutel het getal 9 gebruiken. Opgave 4 Voer het volgende commando uit (Hint: gebruikt copy/paste): echo "Bla Bla Bla Bla " > plaintext Je hebt nu een bestand aangemaakt met als "Bla Bla Bla Bla " als inhoud. Zoals je ziet bevat de inhoud het bestand plaintext nogal veel herhaling. Voer nu het openssl commando uit: openssl enc -e -nosalt -des-ecb -in plaintext -k 9 wat krijg je als resultaat? Valt je iets op? Het resultaat van een versleuteling wordt ciphertext genoemd en het origineel plaintext. De ciphertext die zojuist op het scherm verscheen is zoals je ziet niet beperkt tot de letters van het alfabet, zoals bij Caesar Substitutie. Openssl heeft de plaintext als een reeks van nullen en enen (een binaire reeks) geïnterpreteerd en de ciphertext is dus ook een binaire reeks, die vervolgens door het scherm omgezet wordt naar leesbare tekens, die niet persee tot het alfabet behoren. Naast de vreemde tekens is, als het goed is, ook de herhaling van deze tekens opvallend. Een van de grootste problemen van de ECB methode is dat gelijke blokken plaintext gelijke blokken ciphertext opleveren. Door deze 2
herhaling geven we informatie weg over het originele bericht en dat is nu juist iets dat we probeerde te voorkomen. Een betere manier om blokken ciphertext achter elkaar te zetten is CBC (Cipher Block Chaining). Met de CBC methode wordt het resultaat van het vorige blok ciphertext meegenomen in het volgende blok. Omdat het eerste blok dat je wilt versleutelen geen voorganger heeft, wordt daarvoor een willekeurig blok gegenereerd. Dit gegenereerde blok noemen we de IV (Input Vector). Opgave 5 Versleutel het bestand met CBC. Door het commando openssl enc -h uit te voeren krijg je meer informatie over de mogelijkheden van Openssl. Zoek uit welk commando gebruikt moet worden om het vorige bericht, met dezelfde sleutel, DES encryptie, maar met CBC, te versleutelen. Kies zelf een getal voor de IV, Wat is het juiste commando? 3 Public key cryptography Tot nu toe hebben we het gehad over zogenaamde symmetric key encryption. Dit houdt in dat zowel het versleutelen als het ontsleutelen gebeurt met een en dezelfde sleutel, een shared secret tussen twee de twee partijen die een bericht willen oversturen. Een andere vorm van encryptie is public key cryptography. Public key cryptography maakt gebruik van asymmetrische versleuteling: dit houdt in dat voor de versleuteling en de ontsleuteling van een bericht verschillende sleutels gebruikt worden. In public key cryptography heeft iedere partij heeft twee sleutels, een public key en een private key. De public key is openbaar en wordt gebruikt om berichten te versleutelen. De private key houdt elke partij geheim, deze wordt gebruikt om berichten te ontsleutelen. De werkwijze van deze vorm van encryptie wordt weergegeven in Figure 3. Bob wil een bericht versturen naar Alice. Dit bericht ( Hallo Alice! ) versleuteld Bob met de public key van Alice. Deze sleutel heeft Alice op haar website gepubliceerd en is zichtbaar voor iedereen. Als Alice het versleutelde bericht van Bob ontvangt ontsleuteld ze deze met haar geheime private key. Het grote voordeel van deze methode is dat er geen expliciete afspraak (het delen van een geheime sleutel) gemaakt hoeft te worden voordat er veilige communicatie plaats kan vinden. Hello Alice! Alice Hello Alice! Bob Encrypt 6EB69570 08E03CE4 Decrypt Alice's public key Alice's private key Figure 1: Public Key Encryption schema In de volgende opgave gaan we een versleuteld bericht ontcijferen met een private key. Voordat we dit kunnen doen moet je weten hoe het programma GPG (GNU Privacy Guard) werkt. GPG is een versleutelings/ontsleutelings programma dat gebruik maakt van public key cryptography. Voordat we een bericht kunnen ontsleutelen moeten we eerst de private key importeren. Dit is een textbestand dat er ongeveer zo uitziet, alleen is er voor het gemak een stuk uit het midden vandaan gehaald (waar nu de puntjes staan): 3
-----BEGIN PGP PRIVATE KEY BLOCK----- Version: GnuPG/MacGPG2 v2.0.12 (Darwin) lqo+berjyt8bcadvrlk2tfzv3ddqy/4gy/iyqatwaair+qea5mgiijxeas5vjtv6 znhl4z4rv+kddux51vp0s3z56gmhc8hnpknpa5a/9lekflhdu+hfy5gbtwdmi77x 9zRyHkgPQ9ORpj2YB8xPxi9/GmPIgbrs8gXl7gKdmiwX0mAaAqdQGHT1iI1kmekj 2E837QrZxXfc7po7aZjVjSrvKcXT0ootfGnmkcrXA7ahvpuh3ZRInDdFQ5XeocaO... vv7wvnlp0nhfqekpu2kdiudaddpfjaifkkcq5k+vgohczcs6zlqxpupwr0orbk+q +Cpp46GkWxtWwV6a57xrzuTu/7uxBaW6o4WYDfIKnFQpXzRUXs8hVREXr5/i0Fke M1jIypkQ0isUt+T0h+RSxhnAQ62BBSaWpapZYywWx7NSr0cjG+sCHpG+T0wgcAsL D4w2Bn7KwZE3jgWH2p/WtmD0LWgjqBA= =xr6s -----END PGP PRIVATE KEY BLOCK----- Dit bestand is bij het practicum document geleverd en heet practicumkey-private.txt Je kan deze sleutel importeren in het GPG programma met het commando: gpg --import practicumkey-private.txt Vervolgens kan je met het commando: gpg --list-secret-keys kijken of het gelukt is om de geheime sleutel te importeren. Als dit gelukt is ben je klaar om berichten te ontsleutelen met het commando gpg -o [Output File] [Input File] In dit commando geeft je zowel een nieuwe output file aan, bijvoorbeeld output.txt als de invoer file encrypted.txt waarin het versleutelde bericht staat. Tijdens het ontsleutelen wordt er nog gevraagd naar een passphrase, dit is een wachtwoord waarmee de private key is beveiligd. Om na het ontsleutelen te kijken wat het ontsleutelde bestand bevat gebruik je het commando cat [Output File] We gaan nu zelf een zogenaamd keypair maken, een paar dat bestaat uit een private key die je geheim houdt om berichten te ontsleutelen en een public key die je eventueel kan publiceren op een website of kan emailen naar iemand die berichten naar jou wil versleutelen. Met het volgende commando kan een keypair gegenereerd worden: gpg --gen-key Vervolgens worden er door het programma een aantal vragen gesteld. De eerste vraag gaat over het type sleutel, waarbij we kiezen voor optie 1, DSA and Elgamal voor een volledig keypair. Hierna wordt gevraagd om het aantal bits dat de key moet worden, waarbij de defaultwaarde 2048 bits is. Met een grotere keysize is de versleuteling sterker, maar duurt deze ook langer. De volgende vraag gaat over de zogenaamde expiration date, oftewel de houdbaarheids datum van de sleutel. Om het kraken van de sleutel te voorkomen kan je bijvoorbeeld kiezen voor een sleutel die na een week verloopt, waarna je weer een verse nieuwe sleutel aanmaakt en de krakers weer van voor af aan moeten beginnen. In ons geval kiezen we voor het gemak voor de oneindig houdbare sleutel, optie 0. Na een verificatiecheck waarop we y antwoorden wordt ons gevraagd om onze volledige naam, een commentaar (geen vereiste) en een emailadres, om de sleutel te kunnen identificeren. Na een allerlaatste check waarop we optie O (voor Okay) kiezen geven we een passphrase op om de sleutel te beveiligen. Nu wordt de sleutel gegenereerd op basis van random data die wordt geput uit de op de computer werkende processen, keyboard input en muis input. Je kan checken of het keypair goed is toegevoegd met het commando gpg --list-secret-keys Nu je een keypair hebt gegenereerd wil je natuurlijk iemand anders je public key geven zodat diegene een encrypted bericht naar jou kan sturen. We moeten dus eerst de publieke sleutel exporteren naar een textfile. Dit doen we met het volgende commando, waarin volledige naam de volledige naam is die je bij het genereren hebt ingevuld. 4
Opgave 6 Importeer de gegeven private key practicumkey-private.key en ontsleutel daarmee de volgende geheime versleutelde email (Hint: de passphrase voor de gegeven private key is practicumkey101) -----BEGIN PGP MESSAGE----- Version: GnuPG v1.4.6 (GNU/Linux) hqema3byv3xkshjdaqf+ii6japcyc/qmvlnhgs/3retkg7db4t8rpi0nudfxpo/q xgzwgvvyvc6gsqdxocovsij+oe94tq+itqbtdhfzdff5r5qy2cbqjzd5qk9zetfw brzl4m1cphz+bxlurioiazwl4traf6w84esvysbpnvc8vyaggah9sndbu4tyj3hm zcbs6e8k/9wpmpd0oahpf1oiig6njffnmbj6n8jgnc7cmcdovb2qo/qoypswqhrp gboa247afjg0w7vgoe5x2khijchact7d1szyitnkqltly0lrzsppnsvktsooiejx 7zP7RyusnbUWWGDOWHORXRxNXJoBlerhCg9YrYtbitKDAXl+bbblGsfbTrdg9B+2 qvidneceue71vwdgozh7cvmacmchj6xzf8qs5wusqccuphjbmvx9qle+bx4losac Dk10GJlB4TYE0reQrc5XUwk9NHR0Nv3Tknd7ayMoLpO3SpAK8zAbelVZS7fOFl0x F0z0Z4aFLCoFRLsJsbQllKX8L3Q= =DHwi -----END PGP MESSAGE----- wat staat er in de geheime email? Opgave 7 Maak voor jezelf een keypair aan. Wat voor informatie over jouw sleutel wordt er getoond als je bekijkt of je sleutel goed is toegevoegd? gpg --export -a [volledige naam] > mijnpublickey.txt Het tekstbestand mijnpublickey.txt dat zojuist is aangemaakt bevat jouw zelfgemaakte public key. Deze kan je nu bijvoorbeeld op je internetpagina zetten, rond emailen of op een usb stick zetten om hem te verspreiden. Om de private key te exporteren gebruiken we het volgende commando gpg --export-secret-key -a [volledige naam] > mijnprivatekey.txt Op dit textbestandje moet je heel zuinig zijn, zet hem dus op bijvoorbeeld een usb stick. Als je nu een versleutelde email ontvangt kan je deze ontsleutelen met de private key in dit textbestand in combinatie met de passphrase die je eerder hebt opgegeven. Als je dit thuis wilt doen zul je thuis eerst GPG moeten installeren en je private key moeten importeren. 5
Opgave 8 Geef/email je public key aan een andere practicum deelnemer en laat diegene een bericht voor je versleutelen, en ontsleutel deze zelf met je eigen private key (Hint: Je kan natuurlijk met het commando echo "text text" > textfile.txt een textbestand aanmaken, maar je kan ook elke andere willekeurige file versleutelen, probeer bijvoorbeeld eens een foto, mp3 of een pdf document!) Wat is naar jou idee het grootste beveiligings risico van public key cryptografie? Om een bericht of file te versleutelen gebruik je het volgende commando, waarbij de volledige naam ontvanger de volledige naam is die bij de public key van de ontvanger hoort, en Input File de file is die je wil versleutelen gpg -e -r [volledige naam ontvanger] [Input File]. Opgave 9 Ontvang van een andere practicum deelnemer zijn of haar public key, importeer deze sleutel in GPG, versleutel een bericht en stuur dit bericht naar diegene op. Waarom zou jij public key cryptografie wel of niet gebruiken? Voor de veiligheid van je eigen geheime sleutel kan je deze ter afsluiting van deze workshop verwijderen uit het GPG programma met het volgende commando gpg --delete-secret-key [volledige naam] 6