You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
312 lines
18 KiB
312 lines
18 KiB
{% extends "base.html" %} {% block content %}
|
|
|
|
<h1>Encryptie & Signen</h1>
|
|
|
|
<p>Deze week gaan we nog een laagje dieper en kijken naar (a)symmetrische encryptie, sleutels, signen en PGP.</p>
|
|
|
|
<h2>Symmetrische encryptie</h2>
|
|
|
|
<p>Dat encryptie betekent dat je bestandjes of tekst versleuteld wist je waarschijnlijk al, maar wist je ook dat er twee soorten
|
|
encryptie zijn? Symmetrische en assymetrische encryptie zijn verschillende technieken die je beide in tandem kan gebruiken
|
|
om je bestanden, berichten en verbindingen te beveiligen.</p>
|
|
|
|
<p>Stel, Alice wil een geheim bericht versturen naar Bob. Alice kan het bericht geheim maken door het door een encryptiealgoritme
|
|
te halen. Dit neemt het bericht van Alice en een geheime sleutel als input. De sleutel is in dit geval een random string
|
|
die alleen Alice weet. Het algoritme encrypt het bericht naar een gecodeerde versie. Zonder de sleutel te hebben is het
|
|
onmogelijk om terug te rekenen wat het originele bericht was. Alice stuurt met een gerust hart dit gecodeerde bericht via
|
|
internet delen, zonder bang te zijn dat iemand het kan lezen.</p>
|
|
|
|
<img src="static/img/sym_encryptie.png">
|
|
|
|
<p>Alice wil het bericht aan Bob sturen, om ervoor te zorgen dat Bob het bericht kan ontcijferen heeft Alice hem de geheime
|
|
sleutel van tevoren gegeven. Bob kan het gecodeerde bericht samen met
|
|
<b>dezelfde</b> geheime sleutel die Alice heeft gebruikt door het bijbehorende decryptie algoritme halen om de originele data
|
|
weer terug te krijgen.</p>
|
|
|
|
<p>Bob kan op dezelfde manier ook berichten naar Alice sturen die Alice weer kan ontcijferen. Zolang de sleutel geheim blijft
|
|
kunnen Alice en Bob veilig met elkaar communiceren.</p>
|
|
|
|
<img src="static/img/sym_decryptie.png">
|
|
|
|
<p>We kunnen met OpenSSL (zie vorige week als je dat nog niet hebt geinstalleerd) ook encrypten en decrypten met verschillende
|
|
soorten encryptie algoritmes. Met onderstaande commando kunnen we bijvoorbeeld een bestand ontsleutelen.</p>
|
|
|
|
<code class="terminal">openssl enc -aes-256-cbc -base64 -d -in geheim.aes256 -out nietmeergeheim.txt</code>
|
|
|
|
<p>Een hele mond vol, laten we eens kijken wat alle argumenten betekenen:</p>
|
|
|
|
<ul>
|
|
<li>
|
|
<span class="argument">openssl</span> Het programma zelf</li>
|
|
<li>
|
|
<span class="argument">enc</span> Een command van OpenSSL waarmee we aangeven dat we data willen versleutelen of ontsleutelen</li>
|
|
<li>
|
|
<span class="argument">-aes-256-cbc</span> Het encryptie algoritme wat we gebruiken.
|
|
<ul>
|
|
<li>
|
|
<b>aes</b> staat voor
|
|
<a href="http://en.wikipedia.org/wiki/Advanced_Encryption_Standard" target="_blank">Advanced Encryption Standard</a>, een veel gebruikt algoritme.</li>
|
|
<li>
|
|
<b>256</b> is het aantal bits van de sleutel. OpenSSL vult je wachtwoord aan tot deze hoeveelheid bits.</li>
|
|
<li>
|
|
<b>cbc</b> staat voor
|
|
<a href="https://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29." target="_blank">Cipher-block chaining</a>. Een techniek om het lastiger te maken informatie af te leiden uit de versleutelde data.</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
<span class="argument">-base64</span> lees en schrijf de versleutelde data als
|
|
<a href="http://en.wikipedia.org/wiki/Base64" target="_blank">base64</a>. Dit maakt bestandjes groter, maar de data ook makkelijker te knippen/plakken in mailtjes of invoervelden
|
|
op websites.</li>
|
|
<li>
|
|
<span class="argument">-d</span> decryptie modus. Met dit argument geef je aan dat de invoer de versleutelde data is en de uitvoer de oorspronkelijke
|
|
data moet zijn. Als je deze optie niet mee geeft zit je in encryptie modus, de invoer is dan de oorspronkelijke data
|
|
en de uitvoer wordt dan de versleutelde data</li>
|
|
<li>
|
|
<span class="argument">-in geheim.txt</span> het invoerbestand</li>
|
|
<li>
|
|
<span class="argument">-out decrypted.txt</span> het uitvoerbestand</li>
|
|
</ul>
|
|
|
|
<img src="/static/img/encryptie.jpg" class="center-block" style="margin-top: 1em; margin-bottom: 1em">
|
|
|
|
<p>Een systeembeheerder heeft een geheim staan in dit
|
|
<a href="/static/geheim.aes256" target="_blank">bestandje</a> wat hij met aes-256-cbc heeft versleuteld. Helaas voor hem heeft hij een niet zo hele sterke sleutel gekozen:
|
|
<code>Ab12345</code>. Gebruik OpenSSL om dit bestandje te ontsleutelen.</p>
|
|
|
|
<div class="question">
|
|
<span class="question-string">Wat is de geheime code die in dit versleutelde bestandje staat?</span>
|
|
{% include "points.html" with points=answers.answer_encryption_decrypt.points max="10" %}
|
|
<input class="question-input" name="answer_encryption_decrypt" value="{{ answers.answer_encryption_decrypt.string }}"></input>
|
|
</div>
|
|
|
|
<p class="hint">Hint: Als je een bad decrypt error krijgt heb je waarschijnlijk een OpenSSL versie die lager is dan 1.1.0. In dat geval moet
|
|
je de optie `-md sha256` toevoegen.</code>
|
|
</p>
|
|
|
|
<div class="question">
|
|
<span class="question-string">Versleutel de tekst "
|
|
<em>Security Workshop</em>" met het aes-256-cbc algoritme in base64 mode. Plak de versleutelde tekst in het tekstveld, gebruik
|
|
<code>Ab12345</code> als wachtwoord.</span>
|
|
{% include "points.html" with points=answers.answer_encryption_encrypt.points max="10" %}
|
|
<textarea class="question-input" name="answer_encryption_encrypt">{{ answers.answer_encryption_encrypt.string }}</textarea>
|
|
</div>
|
|
|
|
<p class="hint">Hint: Je kan dit commando gebruiken:
|
|
<code class="terminal">openssl enc -aes-256-cbc -base64 -in plain.txt -out geheim.aes256.txt</code>
|
|
</p>
|
|
|
|
<h2>Asymmetrische encryptie</h2>
|
|
|
|
<p>Bij symmetrische encryptie gebruiken Alice en Bob allebei dezelfde sleutel om het bestand te versleutelen en te ontsleutelen.
|
|
Maar hun communicatie is alleen veilig als ze de sleutel in het geheim afspreken en zolang ze de sleutel geheim houden.
|
|
Dit probleem is opgelost bij asymmetrische encryptie algoritmes, waarbij je twee sleutels gebruikt. Eén publieke en één
|
|
privé sleutel.</p>
|
|
|
|
<p>Bij een asymmetrisch encryptiealgoritme kan je niet zelf een random sleutel kiezen, deze moet je genereren met een speciaal
|
|
key-generation algoritme. Deze geeft random twee sleutels terug die een opmerkelijke relatie met elkaar hebben. Om ze uit
|
|
elkaar te halen noemen we ze hier de groene en de rode sleutel, maar het maakt in de praktijk niet uit welke sleutel welke
|
|
is.
|
|
</p>
|
|
|
|
<img src="static/img/sleutels_genereren.png">
|
|
|
|
<p>Om een bestandje te versleutelen nemen we bijvoorbeeld de groene sleutel en gebruiken we die om het bestandje te versleutelen.
|
|
Maar we kunnen het bestand nu niet meer ontsleutelen met de groene sleutel.
|
|
<b>Met alleen de bijbehorende rode sleutel kan je nu het bestand ontsleutelen</b>. Andersom werkt ook, bestanden die je met
|
|
de rode sleutel versleuteld, zijn enkel en alleen met de groene sleutel te ontsleutelen.</p>
|
|
|
|
<img src="static/img/asym_encryptie.png">
|
|
|
|
<p>Dit lijkt allemaal wat omslachtig en onhandig, en asymmetrische encryptie is ook nog eens honderden keren langzamer dan symmetrische
|
|
encryptie. Waarom zouden we dit gebruiken?</p>
|
|
|
|
<p>Asymmetrische encryptie vormt de basis van het public-private key systeem. Nadat we een sleutel-paartje hebben gegenereerd
|
|
geven we één sleutel weg aan alles en iedereen, dat is de publieke sleutel die iedereen kan gebruiken. De andere bijbehorende
|
|
sleutel bewaren we op de geheimste plek die je maar kan bedenken en geef je onder geen enkele omstandigheid aan iemand
|
|
anders.
|
|
</p>
|
|
|
|
<img src="static/img/publicprivatekey.png">
|
|
|
|
<p>Als Alice nu een geheim bericht aan Bob wil versturen kan ze dit versleutelen door gebruik te maken van Bob's publieke sleutel.
|
|
Het versleutelde bericht is enkel en alleen te ontsleutelen met Bob's bijbehorende private sleutel. Alice weet dus zeker
|
|
dat alleen Bob het kan lezen.</p>
|
|
|
|
<img src="static/img/asym_alicebob.png">
|
|
|
|
<p>Als Alice het bericht met haar private key zou versleutelen ontstaat er een andere interessante eigenschap: Iedereen kan
|
|
het bericht ontsleutelen, dat is te doen met de bijbehorende publieke sleutel. Maar je weet dan wel zeker dat het bericht
|
|
van Alice afkomstig is, want alleen zij heeft de private sleutel waarmee het bericht in de eerste plaats versleuteld is.
|
|
|
|
|
|
<div class="question">
|
|
<span class="question-string">Hoe kan Alice één bericht naar Bob versturen zodat de volgende dingen tegelijkertijd gelden:
|
|
<ol>
|
|
<li>Alleen Bob kan het bericht lezen</li>
|
|
<li>Bob weet zeker dat het bericht van Alice is</li>
|
|
</ol>
|
|
Leg uit in welke volgorde Alice en Bob encrypten, decrypten en versturen en met welke sleutels. Je mag er van uit gaan dat
|
|
ze elkaars publieke sleutel weten en dat Bob niet de enige is met Alice's publieke sleutel.
|
|
</span>
|
|
{% include "points.html" with points=answers.answer_encryption_securesend.points max="10" %}
|
|
<textarea class="question-input" name="answer_encryption_securesend">{{ answers.answer_encryption_securesend.string }}</textarea>
|
|
</div>
|
|
|
|
<p class="hint">
|
|
<strong>Hint:</strong> het is natuurlijk mogelijk om een versleuteld bericht nog een keer te versleutelen.</p>
|
|
|
|
<img src="static/img/whatsapp.png" class="screenshot center-block" style="width: 70%">
|
|
|
|
<p>WhatsApp beweert dat alle berichten end-to-end versleuteld verstuurd worden. Daarmee zou niemand de berichten kunnen lezen
|
|
die via hun servers verstuurd worden, zelfs zij zelf niet. Alleen de afzender en de ontvanger kunnen de berichten lezen.</p>
|
|
|
|
<p>Om dat te controleren kan je bij de contactinformatie van elke chat klikken op 'Encryptie', je krijgt dan een QR code en
|
|
een lijst van cijfers. Als de cijfers allemaal hetzelfde zijn zou je zeker moeten weten dat berichtjes alleen door jou
|
|
en de andere persoon gelezen kunnen worden.</p>
|
|
|
|
<img src="static/img/whatsapp_qr.png" class="screenshot center-block" style="width: 50%">
|
|
|
|
<div class="question">
|
|
<span class="question-string">Zoek op internet welke informatie er in de QR code staat. Hoe kan WhatsApp met die informatie garanderen dat alleen jullie
|
|
twee de chat kan lezen?</span>
|
|
{% include "points.html" with points=answers.answer_encryption_whatsapp.points max="10" %}
|
|
<textarea class="question-input" name="answer_encryption_whatsapp">{{ answers.answer_encryption_whatsapp.string }}</textarea>
|
|
</div>
|
|
|
|
|
|
<h2>GPG</h2>
|
|
|
|
<p>Genoeg theorie, we gaan aan de slag met concrete encryptiealgoritmes. En wel met de
|
|
<a href="http://en.wikipedia.org/wiki/Pretty_Good_Privacy#OpenPGP" target="_blank">OpenPGP</a> (Pretty Good Privacy) standaard. Een veel gebruikt open source programma die deze standaard implementeert
|
|
is
|
|
<a href="http://en.wikipedia.org/wiki/GNU_Privacy_Guard" target="_blank">GPG</a> (GNU Privacy Guard). Met dit programma kunnen we sleutelparen maken, bestanden encrypten/decrypten en versleutelde
|
|
berichten versturen.</p>
|
|
|
|
<p>Om het makkelijker te maken om publieke sleutels uit te wisselen kan GPG gebruik maken van een
|
|
<b>keyserver</b>. Dit is een speciale server die een lijst van publieke sleutels bijhoud. Voor onderstaande opdrachten hebben
|
|
we onze eigen keyserver ingericht op websec.paulwagener.nl.
|
|
<b>Deze werkt niet als je de opdrachten thuis maakt</b>. De Avans firewall blokkeert poort 11371 waarop deze server werkt.</p>
|
|
|
|
<p>GPG kan je
|
|
<a href="http://www.gpg4win.org/" target="_blank">hier</a> voor Windows downloaden, na het installeren kan je in je CMD alle commando's typen. Als je Linux of Mac OS X
|
|
gebruikt hoef je niks te doen, GPG is standaard geïnstalleerd.</p>
|
|
|
|
<img src="static/img/gpg.png">
|
|
|
|
<code class="terminal">gpg --help</code>
|
|
|
|
<p>Met bovenstaande commando zie je alle dingen die je met GPG kan doen. We gaan niet meer alle commando's voorkauwen, je
|
|
bent inmiddels handig genoeg om die zelf te bedenken. Een paar handige opties om te onthouden:</p>
|
|
|
|
<ul>
|
|
<li>
|
|
<b>--gen-key</b> Maak een nieuw publiek/private sleutelpaar.</li>
|
|
<li>
|
|
<b>--list-keys</b> Bekijk alle sleutels die je lokaal hebt.</li>
|
|
<li>
|
|
<b>--sign</b> Gebruik je eigen private sleutel gebruiken om een bestand te encrypten.</li>
|
|
<li>
|
|
<b>--decrypt</b> Gebruik iemand anders publieke sleutel om een bestand te decrypten.</li>
|
|
<li>
|
|
<b>--encrypt</b> Gebruik iemand anders publieke sleutel om een bestand te encrypten.</li>
|
|
<li>
|
|
<b>--recv-keys --keyserver websec.paulwagener.nl
|
|
<i>sleutel-ID</i>
|
|
</b> Haal een publieke sleutel op van de onze keyserver</li>
|
|
<li>
|
|
<b>--send-keys --keyserver websec.paulwagener.nl
|
|
<i>sleutel-ID</i>
|
|
</b> Verstuur een publieke sleutel naar onze keyserver</li>
|
|
<li>
|
|
<b>--sign-key</b> Signeer een publieke sleutel met jouw eigen private sleutel</li>
|
|
<li>
|
|
<b>-a</b> Output in ASCII base64 formaat</li>
|
|
<p>
|
|
|
|
<p>Haal van de keyserver onze publieke sleutel op met sleutel-ID
|
|
<b>B69F77232CE5546445137725D555F2F5FA9E1C5A</b> (GPG noemt dit ook wel de user-ID). We hebben met onze private sleutel
|
|
een tekst versleuteld in
|
|
<a href="static/secret.txt.asc" target="_blank">dit bestand</a>. Gebruik de publieke sleutel om dit bestand te ontsleutelen.</p>
|
|
|
|
<div class="question">
|
|
<span class="question-string">Welke zin hebben we versleuteld?</span>
|
|
{% include "points.html" with points=answers.answer_encryption_decrypt_public_key.points max="5" %}
|
|
<input class="question-input" name="answer_encryption_decrypt_public_key" value="{{ answers.answer_encryption_decrypt_public_key.string }}">
|
|
</div>
|
|
|
|
<p>Gebruik onze publieke sleutel om zelf een tekstbestandje te versleutelen. Zorg ervoor dat ergens in de tekst van dit
|
|
bestandje de geheime code "555-0690" en je e-mailadres staat.</p>
|
|
|
|
<div class="question">
|
|
<span class="question-string">Plak de inhoud van het versleutelde bestand (inclusief begin en einde
|
|
<code>-----BEGIN PGP MESSAGE-----</code>)</span>
|
|
{% include "points.html" with points=answers.answer_encryption_encrypt_public_key.points max="5" %}
|
|
<textarea class="question-input" name="answer_encryption_encrypt_public_key">{{ answers.answer_encryption_encrypt_public_key.string }}</textarea>
|
|
</div>
|
|
|
|
<p class="hint">
|
|
<strong>Hint:</strong> Het is met GPG mogelijk om meerdere ontvangers op te geven. Dat hoeft voor deze opdracht niet. Als
|
|
je alle (1 dus) ontvangers hebt opgegeven moet je een lege regel opgeven om aan te geven dat je verder wil gaan.</p>
|
|
|
|
<p class="hint">
|
|
<strong>Hint:</strong> Gebruik onze sleutel-ID (ook wel user-id) die we eerder al hebben genoemd.</p>
|
|
|
|
<p class="hint">
|
|
<strong>Hint:</strong> Krijg je een binair bestand? Dan ben je waarschijnlijk vergeten om de ASCII base64 optie aan te zetten
|
|
(zie lijst van opties hierboven)</p>
|
|
|
|
<p>Tijd om je eigen sleutels te gebruiken! Maak je eigen publieke/private sleutelpaar en verstuur de publieke sleutel
|
|
naar de websec.paulwagener.nl keyserver.
|
|
<b>Gebruik je e-mailadres voor het e-mailveld</b>.</p>
|
|
|
|
<p>Vergeet niet om je publieke sleutel naar de websec.paulwagener.nl keyserver te sturen zodat anderen die kunnen opzoeken
|
|
en geheime berichten naar je kunnen sturen (en zodat wij de opdrachten kunnen nakijken, anders krijg je de punten
|
|
voor onderstaande opdracht niet!)</p>
|
|
|
|
<div class="question">
|
|
<span class="question-string">Versleutel een bestandje met de tekst "Security 2" met je eigen private sleutel. Plak de versleutelde tekst in het
|
|
tekstveld (inclusief begin en einde
|
|
<code>-----BEGIN PGP MESSAGE-----</code>)</span>
|
|
{% include "points.html" with points=answers.answer_encryption_encrypt_with_own_private.points max="5" %}
|
|
<textarea class="question-input" name="answer_encryption_encrypt_with_own_private">{{ answers.answer_encryption_encrypt_with_own_private.string }}</textarea>
|
|
</div>
|
|
|
|
<h3>Web of Trust</h3>
|
|
|
|
<p>Probleempje: elke mafketel kan sleutels aanmaken en daar elke naam bij zetten die hij maar wil. Hoe zorgen we ervoor
|
|
dat de naam en e-mailadres die bij een sleutel staan ook echt klopt? Dit probleem heeft GPG opgelost door het mogelijk
|
|
te maken om met jouw private sleutel een
|
|
<b>handtekening</b> (signature) te maken voor een publieke sleutel van iemand anders. Je geeft daarmee aan dat je gecontroleerd
|
|
hebt dat de naam die bij een sleutel staat klopt en dat je die persoon vertrouwd.</p>
|
|
|
|
<p>Op die manier ontstaat er een web van vertrouwensrelaties. En als jij Tony vertrouwd, en Tony vertrouwd Steve. Dan
|
|
kan je indirect ervan uitgaan dat de naam van de sleutel van Steve klopt. Op die manier kan je indirect een hele
|
|
hoop sleutels vertrouwen. Op onze keyserver zie je bijvoorbeeld
|
|
<a href="http://websec.paulwagener.nl:11371/pks/lookup?op=vindex&search=0XB69F77232CE5546445137725D555F2F5FA9E1C5A" target="_blank">wie er allemaal direct onze sleutel vertrouwd.</a>
|
|
</p>
|
|
|
|
<img src="static/img/web_of_trust.gif">
|
|
|
|
<p>Als je je eigen sleutel wil gebruiken om andere sleutels te ondertekenen/vertrouwen doe je dat door eerst een publieke
|
|
sleutel te downloaden van de keyserver, dan deze lokaal te ondertekenen met je eigen sleutel en vervolgens de publieke
|
|
sleutel weer opnieuw te versturen naar de keyserver.</p>
|
|
|
|
<div class="question">
|
|
<span class="question-string">Gebruik je eigen sleutel om onze sleutel (sleutel-ID: B69F77232CE5546445137725D555F2F5FA9E1C5A) en de sleutel van
|
|
drie medestudenten te ondertekenen. Upload je ondertekening terug naar de keyserver. Plak je eigen sleutel-ID als
|
|
antwoord hier.</span>
|
|
{% include "points.html" with points=answers.answer_encryption_sign_keys.points max="5" %}
|
|
<input class="question-input" name="answer_encryption_sign_keys" value="{{ answers.answer_encryption_sign_keys.string }}">
|
|
</div>
|
|
|
|
<p class="hint">
|
|
<strong>Hint:</strong> Handtekeningen worden pas verstuurd als je de sleutel die je hebt ondertekend weer terugstuurt naar
|
|
de server.</p>
|
|
|
|
<p>Heb je de smaak te pakken? Dan kan je je eigen publieke sleutel ook doorsturen naar andere
|
|
<a href="http://en.wikipedia.org/wiki/Key_server_%28cryptographic%29" target="_blank">keyservers</a> en laten ondertekenen bij hippe
|
|
<a href="http://en.wikipedia.org/wiki/Key_signing_party" target="_blank">key signing parties</a>.</p>
|
|
|
|
<a href="http://xkcd.com/364/" target="_blank">
|
|
<img src="http://imgs.xkcd.com/comics/responsible_behavior.png">
|
|
</a> |