Skip to content

GPG

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.

Installatie

  1. 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.

  2. Dubbelklik op het gedownloade bestand "gpg4win-x.x.x.exe" om het te installeren. De default instelling zijn telkens goed.

  3. 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.

  4. 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:

    PowerShell Session
    PS C:\Users\martijn> gpg --version
    gpg (GnuPG) 2.4.3
    libgcrypt 1.10.2
    Copyright (C) 2023 g10 Code GmbH
    License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    
    Home: C:\Users\martijn\AppData\Roaming\gnupg
    Supported algorithms:
    Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
    Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
            CAMELLIA128, CAMELLIA192, CAMELLIA256
    Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
    Compression: Uncompressed, ZIP, ZLIB, BZIP2
    

Genereren van een public/private sleutelpaar

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!

PowerShell Session
PS C:\Users\martijn> gpg --gen-key
gpg (GnuPG) 2.4.3; Copyright (C) 2023 g10 Code GmbH
This 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 Saelens
Email address: martijn.saelens@hogent.be
You selected this USER-ID:
    "Martijn Saelens <martijn.saelens@hogent.be>"

Change (N)ame, (E)mail, or (O)kay/(Q)uit? O
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator 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]
      5C7C231C0093DF5A159A27F8C00BAB1FF13FE7A0
uid                      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.

Jouw publieke sleutel verspreiden

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.

PowerShell Session
PS C:\Users\martijn> gpg --output pubkey.gpg --armor --export 5C7C231C0093DF5A159A27F8C00BAB1FF13FE7A0

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:

Text Only
-----BEGIN PGP PUBLIC KEY BLOCK-----

mDMEZSkXAhYJKwYBBAHaRw8BAQdAFw9KQKS/w0InrokGujBsjnhw7jTjp31A1dAa
BMWkiZe0K01hcnRpam4gU2FlbGVucyA8bWFydGlqbi5zYWVsZW5zQGhvZ2VudC5i
ZT6ImQQTFgoAQRYhBFx8IxwAk99aFZon+MALqx/xP+egBQJlKRcCAhsDBQkFo5qA
BQsJCAcCAiICBhUKCQgLAgQWAgMBAh4HAheAAAoJEMALqx/xP+eg47IBANfzjseP
ukxnJO8T54+OqmlA2ScjiUlmzuGEX9DmWiToAP98ej72G6CMkacphIkcX8P5VL3t
AgTl+yFoKeKzB583ALg4BGUpFwISCisGAQQBl1UBBQEBB0Aum8UjuaEzrdh/tRr0
lWwT9ULbxvrpf6DAmKgTwDwKDAMBCAeIfgQYFgoAJhYhBFx8IxwAk99aFZon+MAL
qx/xP+egBQJlKRcCAhsMBQkFo5qAAAoJEMALqx/xP+eg6t4BAJW0BORPzn9Km3Sn
N6iN5nGV2ESoWNwlU/cqTb1i9ruOAP45Z96vuvB592WoFI+NOxWmEay5oZDRCPqa
j8fKY91IAQ==
=XrUR
-----END PGP PUBLIC KEY BLOCK-----

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.

PowerShell Session
PS C:\Users\martijn> gpg --output privkey.gpg --armor --export-secret-keys 5C7C231C0093DF5A159A27F8C00BAB1FF13FE7A0
PS C:\Users\martijn> cat .\privkey.gpg
-----BEGIN PGP PRIVATE KEY BLOCK-----

lIYEZSkXAhYJKwYBBAHaRw8BAQdAFw9KQKS/w0InrokGujBsjnhw7jTjp31A1dAa
BMWkiZf+BwMCLFpMqryLApDO7n2AbZqRmt/+ESdH7U+a0Mqr9+IKyeo/XaftySPt
8AdGUr1XSmkO01KJqBczLV5CNROPQpSLbc0rJ7606HYuy+AfpaDi+bQrTWFydGlq
biBTYWVsZW5zIDxtYXJ0aWpuLnNhZWxlbnNAaG9nZW50LmJlPoiZBBMWCgBBFiEE
XHwjHACT31oVmif4wAurH/E/56AFAmUpFwICGwMFCQWjmoAFCwkIBwICIgIGFQoJ
CAsCBBYCAwECHgcCF4AACgkQwAurH/E/56DjsgEA1/OOx4+6TGck7xPnj46qaUDZ
JyOJSWbO4YRf0OZaJOgA/3x6PvYboIyRpymEiRxfw/lUve0CBOX7IWgp4rMHnzcA
nIsEZSkXAhIKKwYBBAGXVQEFAQEHQC6bxSO5oTOt2H+1GvSVbBP1QtvG+ul/oMCY
qBPAPAoMAwEIB/4HAwIV4nJc+ND85c4xGrlrcHyyMo5SaGuG8cyTA4uHfGR2ADAM
VPnroV/rveBvoJgxOIFu7JNp8YY2vweK8wx+gHNZhcwDZoquoo5rSQMUv4lGiH4E
GBYKACYWIQRcfCMcAJPfWhWaJ/jAC6sf8T/noAUCZSkXAgIbDAUJBaOagAAKCRDA
C6sf8T/noOreAQCVtATkT85/Spt0pzeojeZxldhEqFjcJVP3Kk29Yva7jgD+OWfe
r7rwefdlqBSPjTsVphGsuaGQ0Qj6mo/HymPdSAE=
=j7s7
-----END PGP PRIVATE KEY BLOCK-----

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!

Importeer een publieke sleutel

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.

  1. Download de publieke sleutel.
  2. Importeer de sleutel met de --import optie:

    PowerShell Session
    1
    2
    3
    4
    5
    PS C:\Users\martijn> gpg --import test-public-key.asc
    gpg: key 1B001C49CE3133E9: public key "Test" imported
    gpg: can't connect to the gpg-agent: IPC connect call failed
    gpg: Total number processed: 1
    gpg:               imported: 1
    
  3. Dubbelcheck met de --list-keys optie, deze toont de publieke sleutels op ons systeem:

    PowerShell Session
    PS C:\Users> gpg --list-keys
    gpg: checking the trustdb
    gpg: marginals needed: 3  completes needed: 1  trust model: pgp
    gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
    gpg: next trustdb check due at 2026-10-12
    [keyboxd]
    ---------
    pub   ed25519 2023-10-13 [SC] [expires: 2026-10-12]
        5C7C231C0093DF5A159A27F8C00BAB1FF13FE7A0
    uid           [ultimate] Martijn Saelens <martijn.saelens@hogent.be>
    sub   cv25519 2023-10-13 [E] [expires: 2026-10-12]
    
    pub   rsa3072 2020-11-22 [SC]
        FCEC724109785C50F47E270D1B001C49CE3133E9
    uid           [ unknown] Test
    sub   rsa3072 2020-11-22 [E]
    

    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:

    PowerShell Session
    1
    2
    3
    4
    5
    6
    7
    PS C:\Users\martijn> gpg --list-secret-keys
    [keyboxd]
    ---------
    sec   ed25519 2023-10-13 [SC] [expires: 2026-10-12]
        5C7C231C0093DF5A159A27F8C00BAB1FF13FE7A0
    uid           [ultimate] Martijn Saelens <martijn.saelens@hogent.be>
    ssb   cv25519 2023-10-13 [E] [expires: 2026-10-12]
    

    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.

Bestanden encrypteren en decrypteren

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:

PowerShell Session
1
2
3
PS C:\Users\martijn> echo "Dit is een Test!" > test.txt
PS C:\Users\martijn> cat test.txt
Dit 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.

PowerShell Session
PS C:\Users\martijn> gpg --encrypt --output encrypted.gpg --recipient FCEC724109785C50F47E270D1B001C49CE3133E9 test.txt
gpg: 506F586D6F3410CA: There is no assurance this key belongs to the named user

sub  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 10CA

It is NOT certain that the key belongs to the person named
in 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) y
PS C:\Users\martijn> cat encrypted.gpg
…ŒPoXmo4Ê
Ÿ#Ú½ŒæÁgI'piÓ
’b5`¾¹Ö³h&Dt2`9›¼€µ]¸eü£ž´Ìã‡5 6¨ènjqö÷ÖY+ÄŸ2D¡»|úý)öí £…Âð[(ýã¨qz_«Kj5›;|AïÝo{ÚiV–Œ-„y¢`8³Ÿ¢HÎÖ½:«ÈÎwøLRóWÒq
Ú0—ªa¼L6u‹9#Z€LéT õÉ’5ðe/þðï’<bnk]²t•ñŸe|´°÷kcC<£‹ªÝ‘ô
n}÷áÚjÄ|°Ç7˜7äimÈH–™ Fûcµx¯Þf’Ä¢ðY@•¡)ÕÅh+k†Æ`)äv
ø#Ò›ˆþ<ö°¹¥Y Sc¨dŸ†ä}J2Ù\=Ýó.ÕW6
£I ©S
?|¨(ÇÐ3¬¸Ðz_FEMÎá¦Ê÷¹!nÜUA?'÷+Ð>ŸA÷ â6Å|ûÕNVŒ?G^9WL+¼ì.æBê
A¶Øu4¾q¦K–Ú×¹:`ÒaÚd¦žâ»åÕ›{'{ÍrË•½Ÿ`äU[´ÆŸK¡a¨¥¦FÁñkùçú>l<ñ³L¼HaW¦Þø¸Úa¹¥ñæêv¾Ç^}f-FvæV}
<õ¼HÅô‘Î(

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.

PowerShell Session
1
2
3
4
5
PS C:\Users\martijn> gpg --decrypt --output decrypted.txt encrypted.gpg
gpg: encrypted with rsa3072 key, ID 506F586D6F3410CA, created 2020-11-22
      "Test"
gpg: public key decryption failed: No secret key
gpg: 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:

PowerShell Session
PS C:\Users\martijn> gpg --encrypt --output encrypted.gpg --recipient FCEC724109785C50F47E270D1B001C49CE3133E9 --recipient 5C7C231C0093DF5A159A27F8C00BAB1FF13FE7A0 test.txt
gpg: 506F586D6F3410CA: There is no assurance this key belongs to the named user

sub  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 10CA

It is NOT certain that the key belongs to the person named
in 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) y
PS C:\Users\martijn> gpg --decrypt --output decrypted.txt encrypted.gpg
gpg: 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.txt
Dit 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.

Oefening

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?

Meer info

Wil je meer weten? Dan kan je de officiële handleiding vinden op https://www.gnupg.org/gph/en/manual.html .