Tips en Trucs 2014

GPG bestandsversleuteling

Vandaag gaan we een bestand versleutelen met GnuPG. Dit kan je gebruiken om een bestand met wachtwoorden of persoonlijke informatie veiliger te bewaren.

GNU Privacy Guard (GnuPG of GPG) is een alternatief met een GPL licentie voor de cryptografische software PGP. GnuPG volgt dezelfde IETF standaard RFC 4880 als OpenPGP. Daardoor zijn de PGP versies (en Veridis Filecrypt) en GnuPG en OpenPGP systemen compatibel en uitwisselbaar.

Deze software wordt veel gebruikt in mail programma's waardoor je berichten kunt tekenen en versleutelen bij het verzenden en ontvangen. Wij concentreren ons op terminalopdrachten om een bestand te versleutelen.

Versleutelen met een symmetrische sleutel

Dit is de eenvoudigste manier en gebruikt een wachtwoord om een bestand te versleutelen, met hetzelfde wachtwoord kan je het bestand terug ontcijferen. De sleutel is een gedeeld geheim tussen twee of meer personen om persoonlijke gegevens privé te houden. In de praktijk hangt de veiligheid van dit systeem af van het gekozen wachtwoord (veilig wachtwoord mag niet te achterhalen zijn). Dit systeem wordt bijvoorbeeld gebruikt om via e-mail een versleuteld bericht te versturen en via een ander communicatiemiddel het wachtwoord mee te delen (telefoon, instant message, chat).

Om als voorbeeld te gebruiken, maak ik het bestand mijngeheimdocument.txt aan met de tekst geheim 1234:

dany@linux-att3:~> echo "geheim 1234" >  mijngeheimdocument.txt
dany@linux-att3:~> cat mijngeheimdocument.txt
geheim 1234

Nu gebruiken we de gpg optie -c (of --symmetric) om te versleutelen met een wachtwoord of wachtzin. De standaard gebruikte versleutelmethode is CAST5 en kan je aanpassen met de optie --cipher-algo:

dany@linux-att3:~> gpg -c mijngeheimdocument.txt 
gpg: directory `/home/dany/.gnupg' created
gpg: new configuration file `/home/dany/.gnupg/gpg.conf' created
gpg: WARNING: options in `/home/dany/.gnupg/gpg.conf' are not yet active during this run
gpg: keyring `/home/dany/.gnupg/pubring.gpg' created

Tijdens dit proces moet je in een dialoogvenster tweemaal een wachtzin (wachtwoord) opgeven (tweede maal als controle op tikfouten).
GPG wachtwoord ingeven
Bij het eerste gebruik van gpg op een computer wordt de verborgen map .gnupg aangemaakt en worden daarin enkele bestanden aangemaakt. De actieve map bevat nu ook een versleutelde versie van mijn bestand:

dany@linux-att3:~> ls -alrt mijngeheimdocument.txt*
-rw-r--r-- 1 dany users 12 15 mrt 14:35 mijngeheimdocument.txt
-rw-r--r-- 1 dany users 69 15 mrt 14:44 mijngeheimdocument.txt.gpg

Om de versleuteling te controleren, kan je de inhoud weergeven. Het versleutelde bestand krijgt standaard dezelfde bestandnaam als het originele bestand aangevuld met .gpg.

dany@linux-att3:~> cat mijngeheimdocument.txt.gpg

Waarbij schijnbaar willekeurige tekens verschijnen.

Nu kan je het versleutelde bestand houden en het onversleutelde verwijderen. Om de inhoud van het versleutelde bestand terug leesbaar weer te geven, gebruik je de volgende opdracht:

dany@linux-att3:~>gpg -d mijngeheimdocument.txt.gpg 
gpg: keyring `/home/dany/.gnupg/secring.gpg' created
gpg: CAST5 encrypted data
gpg: encrypted with 1 passphrase
geheim 1234
gpg: WARNING: message was not integrity protected

Gpg schrijft de uitvoer standaard naar het scherm (standaard uitvoerapparaat), om het naar een bestand te schrijven, gebruik je de optie -o bestandsnaam:

dany@linux-att3:~> gpg -o mijnontcijfertdocument.txt -d mijngeheimdocument.txt.gpg 
gpg: CAST5 encrypted data
gpg: encrypted with 1 passphrase
gpg: WARNING: message was not integrity protected
dany@linux-att3:~> ls -l mijn*
-rw-r--r-- 1 dany users 12 15 mrt 14:35 mijngeheimdocument.txt
-rw-r--r-- 1 dany users 69 15 mrt 14:44 mijngeheimdocument.txt.gpg
-rw------- 1 dany users 12 15 mrt 15:14 mijnontcijfertdocument.txt

Versleutelen met een publieke sleutel

GPG kan ook gebruik maken van een publieke-private sleutel. Het voordeel van het systeem met een publieke-private sleutel is dat je de publieke sleutel openbaar kunt bewaren en gebruiken om bestanden te versleutelen. Met een publieke sleutel versleutelde bestanden kunnen enkel met behulp van de bijhorende private sleutel ontcijfert worden.

De private sleutel moet exclusief in de handen van de eigenaar van het certificaat blijven. De eigenaar gebruikt deze sleutel om bestanden die hij (of zij) ontvangt te ontcijferen.

De publieke sleutel mag iedereen op de wereld kennen. Deze wordt enkel gebruikt om bestanden bestemt voor de eigenaar van het certificaat te versleutelen. Enkel de bezitter van de bijhorende private sleutel kan het bestand ontcijferen.

De publieke sleutel mag dus zonder enige controle verspreid worden. Zelf als de sleutel in handen komt van personen met slechte bedoelingen vormt dit geen enkel risico. Je moet dus enkel zorgen dat de private sleutel exclusief eigendom van eigenaar blijft.

Eerst genereren we een een publiek/privaat sleutelpaar met de --gen-key optie van gpg:

dany@linux-att3:~> gpg --gen-key
gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096
Requested keysize is 4096 bits
Please specify how long the key should be valid.
         0 = key does not expire
        = key expires in n days
      w = key expires in n weeks
      m = key expires in n months
      y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
Is this correct? (y/N) y

GnuPG needs to construct a user ID to identify your key.

Real name: Dany Pinoy
Email address: dany.pinoy@pindanet.be
Comment: 
You selected this USER-ID:
    "Dany Pinoy "

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
You need a Passphrase to protect your secret key.

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.
                       
GHFEZGHJGFJT  FZB CBCIYUI YIÉUY9+8+95694VEG7QEC9878esighgvnfybvy"ay"tbfihu,65+4+589+65+659+
ggfgdsjgfjgfyuyucgyufyugfucbbuydgdihdfuihd54564684984987494894azrfhazghfjzbafagfy"gfyubafbfihfoinkncc cé         ucou hfigfigfi764f874g7g9g48g76gh747g9v84vz79h798h9z'h4h68z798z7h68r49zh h7b'7b 98z74 v7g9a7487b98"79^[OR^[OP b^[[D^[[C^[[Atz^[[Hb^[[Hgb^[[C^[[A^[[Hg^[[A^[[Hb^[[5~^[[Hb^[[5~e§/bg4e687 9'ag997tf/g^[[5~g^[[Aa^[[Htg^[[5~/(g(9 7gvg8a7f9g9a7tb9/y9/y^[[5~^[[5~§^[[6~h*//ét     gt/ath/ a^[[5~g/^[[5~/gah*y&^[OQf^[[5~/ b§nyh9//&gv9av7g9gpg: /home/dany/.gnupg/trustdb.gpg: trustdb created
gpg: key ED86F197 marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
pub   4096R/ED86F197 2014-03-15
      Key fingerprint = 2612 4750 E6CB 6CFF 9F10  CA92 77F0 B512 ED86 F197
uid                  Dany Pinoy 
sub   4096R/728DCC70 2014-03-15

Geef de gevraagde gegevens op. In het voorbeeld hebben we een RSA sleutel met 4096 bits aangemaakt voor de gebruiker met een naam en een e-mailadres zonder commentaar (beschrijving). De sleutels kan je controleren met de opties --list-keys en list-secret-keys:

dany@linux-att3:~> gpg --list-keys
/home/dany/.gnupg/pubring.gpg
-----------------------------
pub   4096R/ED86F197 2014-03-15
uid                  Dany Pinoy 
sub   4096R/728DCC70 2014-03-15

dany@linux-att3:~> gpg --list-secret-keys
/home/dany/.gnupg/secring.gpg
-----------------------------
sec   4096R/ED86F197 2014-03-15
uid                  Dany Pinoy 
ssb   4096R/728DCC70 2014-03-15

Versleutelen met de publieke sleutel

Nu kan je een bestand versleutelen met onze publieke sleutel, in reële omstandigheden verspreidt je de publieke sleutel via e-mail of op een website zodat anderen er gebruik van kunnen maken:

dany@linux-att3:~> rm mijngeheimdocument.txt.gpg 
dany@linux-att3:~> gpg -e -r dany.pinoy@pindanet.be mijngeheimdocument.txt

Weer wordt een mijngeheimdocument.txt.gpg aangemaakt, maar deze keer is het bestand veel groter. De gebruikte opties staan voor:
-e Versleutel de gegevens (Encrypt data).
-r Voor de gebruiker. Indien GnuPG niet weet welke gebruiker (sleutels) gebruikt moeten worden, wordt ernaar gevraagd.

Ontcijferen met de private sleutel

Om een bestand te ontcijferen, gebruikt je zoals voorheen de opties -d en -o:

dany@linux-att3:~> rm mijnontcijfertdocument.txt
dany@linux-att3:~> gpg -o mijnontcijfertdocument.txt -d mijngeheimdocument.txt.gpg 

You need a passphrase to unlock the secret key for
user: "Dany Pinoy "
4096-bit RSA key, ID 728DCC70, created 2014-03-15 (main key ID ED86F197)

gpg: encrypted with 4096-bit RSA key, ID 728DCC70, created 2014-03-15
      "Dany Pinoy "

Het bestand mijnontcijfertdocument.txt bevat nu de leesbare originele tekst.

Nieuwe sleutels importeren

Om bestanden voor andere personen te kunnen versleutelen, moet je hun publieke sleutels aan uw sleutelbos (keyring) toevoegen:

gpg --import KEYFILE

Daarna moet je zorgen dat gpg de sleutel vertrouwd. Anders krijg je meldingen in de aard van:

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)

Om een sleutel te vertrouwen, voer je de volgende opdracht uit:

gpg --edit-key NAME

GPG toont wat informatie, een regel zoals:

trust: undefined     validity: unknown

Er verschijnt een opdracht omgeving, waar je de volgende opdracht uitvoert:

Command> trust 
Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)

  1 = I don't know or won't say
  2 = I do NOT trust
  3 = I trust marginally
  4 = I trust fully
  5 = I trust ultimately
  m = back to the main menu

Your decision? 5
Do you really want to set this key to ultimate trust? (y/N) y

Voer daarna de opdracht quit uit. Nogmaals de opdracht gpg --edit-key NAME uitvoeren, toont een regel met vertrouwen:

trust: ultimate      validity: ultimate