GPG is de tool voor cyberspecialisten om asymmetrische encryptie op te zetten en te gebruiken. Op Mac en Linux wordt dit vaak gedaan met het gpg commando op de command line. Op windows kunnen we hiervoor Gpg4win downloaden met een GUI. Gpg is vrij geavanceerd, dus leggen we hier enkel de basis uit om berichten te encrypteren en te decrypteren.
Download Gpg4win via https://www.gpg4win.org/download.html . Er wordt gevraagd of je wil doneren: dit mag, maar hoeft niet. Klik op "$0" en dan op "Download". Vergeet na het downloaden niet de SHA256 te controleren.
Dubbelklik op het gedownloade bestand "gpg4win-x.x.x.exe" om het te installeren. De default instelling zijn telkens goed.
Je kan nu kiezen om gpg op de command line te gebruiken, of om de GUI genaamd "Kleopatra" te gebruiken. Wij gaan voor de commandline. Vink Run Kleopatra uit.
Open een PowerShell venster en typ het commando gpg --version in, je zal de versie en informatie van de geïnstalleerde GPG software te zien krijgen:
Alvorens we gebruik kunnen maken van asymmetrische encryptie, moeten we eerst onze publieke en private sleutel genereren. Gebruik hiervoor het commando gpg --gen-key en vul je eigen informatie in. Tijdens de installatie wordt er gevraagd om een wachtwoord of passphrase aan jouw sleutel te geven. Dit wordt sterk aangeraden en versterkt de veiligheid van jouw sleutelpaar! Als iemand jouw apparaat steelt met daarop jouw sleutels, kan deze de sleutel nog steeds niet gebruiken zonder wachtwoord. Gebruik een lang wachtwoord of passphrase!
PS C:\Users\martijn> gpg--gen-keygpg (GnuPG) 2.4.3; Copyright (C) 2023 g10 Code GmbHThis is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.Note: Use "gpg --full-generate-key" for a full featured key generation dialog.GnuPG needs to construct a user ID to identify your key.Real name: Martijn SaelensEmail address: martijn.saelens@hogent.beYou selected this USER-ID: "Martijn Saelens <martijn.saelens@hogent.be>"Change (N)ame, (E)mail, or (O)kay/(Q)uit? OWe need to generate a lot of random bytes. It is a good idea to performsome other action (type on the keyboard, move the mouse, utilize thedisks) during the prime generation; this gives the random numbergenerator a better chance to gain enough entropy.We need to generate a lot of random bytes. It is a good idea to performsome other action (type on the keyboard, move the mouse, utilize thedisks) during the prime generation; this gives the random numbergenerator a better chance to gain enough entropy.gpg: revocation certificate stored as 'C:\\Users\\martijn\\AppData\\Roaming\\gnupg\\openpgp-revocs.d\\5C7C231C0093DF5A159A27F8C00BAB1FF13FE7A0.rev'public and secret key created and signed.pub ed25519 2023-10-13 [SC] [expires: 2026-10-12] 5C7C231C0093DF5A159A27F8C00BAB1FF13FE7A0uid Martijn Saelens <martijn.saelens@hogent.be>sub cv25519 2023-10-13 [E] [expires: 2026-10-12]
De sleutel is nu klaar. Je krijgt op het einde ook de fingerprint te zin (5C7C231C0093DF5A159A27F8C00BAB1FF13FE7A0 in het voorbeeld). Dit is een hash waarde van de publieke sleutel, wat het makkelijker maakt om sleutels te vergelijken via bijvoorbeeld telefoon.
Opdat anderen berichten naar jou berichten kunnen encrypteren, moeten ze aan jouw publieke sleutel kunnen geraken. Daarom moeten we de publieke sleutel exporteren en verspreiden. Dit kan met de --export optie waarbij je het e-mailadres of de fingerprint dat hoort bij sleutel opgeeft. Je merkt dat je hiervoor geen paswoord moet opgeven, het is immers compleet veilig om jouw publieke sleutel te verspreiden.
We gebruiken hier ook de --armor optie om ervoor te zorgen dat het bestand leesbaar is met een texteditor (bv. kladblok, Visual Studio Code, ...). Dit is niet per se nodig, maar kan handig zijn als je de sleutel op een leesbare maniuer wil tonen. Dit zorgt er ook voor dat we eens kunnen kijken naar de inhoud van de publieke sleutel:
Let goed op de woorden PUBLIC in de sleutel: controleer steeds of hier PUBLIC of PRIVATE staat alvorens je met deze sleutel iets doet! Je zou niet de eerste zijn die per ongelijk zijn private sleutel online gooit en zijn encryptie zo compleet onveilig maakt. Hier staat er public, dus deze sleutel mag verspreid worden.
Je kan de publieke sleutel nu doorsturen via e-mail, chat, ... of online plaatsen op jouw website. Zo kunnen anderen die iets geëncrypteerd naar jou willen sturen jouw publieke sleutel daarvoor gebruiken. Je kan de sleutel doorsturen als bestand, of gewoon de inhoud (de tekst) ergens plaatsen (in een e-mail, op een website, ...).
Indien gewenst kan je ook jouw private sleutel exporteren (bv. als backup). Gebruik hiervoor de --export-secret-keys optie. Het kan zijn dat je hier jouw wachtwoord moet opgeven indien je een had ingesteld bij het genereren van de sleutel.
Bewaar deze kopie op een veilige plaats aangezien deze jouw private sleutel bevat! Verspreid deze NIET. De private sleutel wordt hier enkel getoond voor demonstratie doeleinden. Deze sleutel is dus niet meer veilig en is ondertussen verwijderd. Toon zelf NOOIT jouw private sleutel aan iemand anders, anders is jouw sleutelpaar niets meer waard en compleet onveilig!
Om berichten te versturen, hebben we natuurlijk een publieke sleutel nodig van de ontvanger. We demonstreren dit aan de hand van de publieke sleutel test-public-key.asc.
PS C:\Users\martijn> gpg--importtest-public-key.ascgpg: key 1B001C49CE3133E9: public key "Test" importedgpg: can't connect to the gpg-agent: IPC connect call failedgpg: Total number processed: 1gpg: imported: 1
Dubbelcheck met de --list-keys optie, deze toont de publieke sleutels op ons systeem:
We zien dat de test sleutel met als fingerprint FCEC724109785C50F47E270D1B001C49CE3133E9 succesvol is geïmporteerd. We hebben nu 2 publieke sleutels. Idealiter contacteer je de eigenaar van de key om de fingerprint te verifiëren (in het echt of via telefoon), zo vermijd je dat een Man in the Middle attack je een vervalste sleutel heeft gegeven.
Als we de --list-secret-keys optie gebruiken, toont deze slechts 1 private sleutel op ons systeem:
Dat klopt, wij hebben slechts 1 sleutelpaar gemaakt (publieke + private sleutel) en als we iemands sleutel importeren zal dat steeds diens publieke sleutel zijn, nooit zijn private sleutel! Anders kan iedereen met die private sleutel die persoon zijn berichten decrypteren en lezen. Je kan dit testen aan de hand van de overeenkomstige private key test-private-key-empty-password.asc.
Nu we de publieke key hebben geïmporteerd van de ontvanger kunnen we een bericht naar de ontvanger encrypteren en versturen. Maak een bestand test.txt aan met als inhoud Dit is een test!. Je kan dit doen met eender welke text editor of met volgende commando's:
PS C:\Users\martijn> echo "Dit is een Test!">test.txtPS C:\Users\martijn> cat test.txtDit is een test!
Nu encrypteren we het bestand met behulp van de --encrypt optie. We geven ook de --recipient optie met de fingerprint van de sleutel van de ontvanger: zo weet gpg voor wie het bestand geëncrypteerd moet worden. Het resulterende bestand encrypted.gpg is nu compleet onleesbaar.
Let op! Aangezien het geëncrypteerd enkel met de sleutel van de ontvanger geëncrypteerd is, is het geëncrypteerde bestand encrypted.gpg ook voor jou (de verzender) niet meer te lezen. Decrypteren gebeurt met de optie --decrypt.
PS C:\Users\martijn> gpg--decrypt--outputdecrypted.txtencrypted.gpggpg: encrypted with rsa3072 key, ID 506F586D6F3410CA, created 2020-11-22 "Test"gpg: public key decryption failed: No secret keygpg: decryption failed: No secret key
Indien je het geëncrypteerde bestand ook zelf nog wil kunnen lezen, zal je het ook moeten encrypteren met je eigen sleutel:
PS C:\Users\martijn> gpg--encrypt--outputencrypted.gpg--recipientFCEC724109785C50F47E270D1B001C49CE3133E9--recipient5C7C231C0093DF5A159A27F8C00BAB1FF13FE7A0test.txtgpg: 506F586D6F3410CA: There is no assurance this key belongs to the named usersub rsa3072/506F586D6F3410CA 2020-11-22 Test Primary key fingerprint: FCEC 7241 0978 5C50 F47E 270D 1B00 1C49 CE31 33E9 Subkey fingerprint: 6950 B5EE F1D4 EC65 AD8A E2B0 506F 586D 6F34 10CAIt is NOT certain that the key belongs to the person namedin the user ID. If you *really* know what you are doing,you may answer the next question with yes.Use this key anyway? (y/N) yPS C:\Users\martijn> gpg--decrypt--outputdecrypted.txtencrypted.gpggpg: encrypted with cv25519 key, ID FC9673623EF7A847, created 2023-10-13 "Martijn Saelens <martijn.saelens@hogent.be>"gpg: encrypted with rsa3072 key, ID 506F586D6F3410CA, created 2020-11-22 "Test"PS C:\Users\martijn> cat decrypted.txtDit is een test!
Het kan zijn dat je jouw wachtwoord moet opgeven bij het decrypteren van bestanden die voor jou bestemd zijn, indien je een had ingesteld bij het genereren van de sleutel.
Nu iedereen in de klas een eigen sleutel heeft aangemaakt: encrypteer een bestand en geef deze samen met jouw publieke sleutel (of plaats deze op een website) aan een medestudent. Kan de medestudent het bestand decrypteren en jij het bestand van de medestudent?