PGP & E-mail – Pretty Good Privacy
PGP staat voor Pretty Good Privacy. Raar eigenlijk dat dit pas de eerste keer is dat ik hier een post aan wijd. PGP is een encryptiemethode welke toegepast kan worden om e-mails, bestanden, directories en zelfs partities te versleutelen en ontsleutelen. PGP kan eveneens gebruikt worden om de “ondertekenen” ofwel signen. Dit gebruiken we vaak in met e-mail communicatie. In deze post ga ik in op de methode waarbij PGP meestal wordt toegepast, namelijk bij e-mail. Met PGP kunnen 2 personen die onderling met elkaar communiceren over, per definitie onveilige e-mail toch veilig en versleuteld communiceren. Een voorwaarde hiervoor is wel dat de verzender beschikt over de publieke sleutel van de ontvanger. Wil je begrijpen hoe PGP mail echt werkt… lees dan gezellig mee.
Pretty Good Privacy is in 1991 bedacht en ontwikkeld door Phil Zimmermann, een Amerikaanse computer onderzoeker en cryptografie expert. De naam “PGP” is bedacht n.a.v. de naam van een lokale supermarkt, namelijk “Ralph’s Pretty Good Grocery”. Phil Zimmerman is het meest bekend om PGP maar was ook verantwoordelijk voor verschillende VOIP versleutelingsprotocollen zoals “ZRTP” en “Zfone”. Phil Zimmermann is een van de bekendste cryptografische experts. Zijn bekende “law”, de zogenaamde “Zimmerman’s law” welke antwoord op de bekende “Moore’s law” luidt “The natural flow of technology tends to move in the direction of making surveillance easier, and the ability of computers to track us doubles every eighteen months,”.
OpenPGP is een afgeleide van PGP en is ontwikkeld door de OpenPGP Working Group van de IETF (Internet Engineering Task Force). De eerste OpenPGP versies waren geënt op de RFC 2440 standaard. Latere OpenPGP versies zijn gebaseerd op de RFC 4880 standaard. OpenPGP wordt o.a. in Linux gebruikt door GNU Privacy Guard (GnuPG ofwel GPG) welke een niet gepatenteerd alternatief is voor OpenPGP maar wel gestoeld is op de OpenPGP principes. GPG wordt binnen Linux gebruikt voor de veilige uitwisseling van gegevens. OpenPGP gebruikt is net als PGP en vorm van asymmetrische cryptografie. Bij asymmetrische cryptografie zijn twee sleutels vereist waarbij één sleutel gebruikt wordt voor het versleutelen (encrypten) van de gegevens en de andere sleutel voor het ontsleutelen (decrypten) van de gegevens.
Asymmetrische encryptie is langzamer dan symmetrische cryptografie maar in essentie wel veiliger. Asymmetrische versleuteling werkt in essentie als volgt:
- Er wordt een sleutelpaar aangemaakt met een private key en een public key
- De private key blijft geheim en wordt alleen verstrekt aan de personen die versleutelde content moeten kunnen lezen
- De public key wordt verschaft (vaak openbaar gemaakt) aan de personen die data moeten kunnen versleutelen welke naar de houders van bijbehorende private key gestuurd wordt
- Wanneer data versleuteld moet worden zal de afzender hiervoor de publieke sleutel gebruiker
- De ontvanger kan met zijn private key deze data decrypten en lezen / gebruiken
Dit betekend dus dat dit vooral eenrichtingsverkeer is en dat private keys op een veilige manier gedistribueerd moeten worden om de veiligheid van het proces te blijven waarborgen. Ook wordt nog niet geverifieerd dat de afzender is wie hij beweerd te zijn. Als de ontvanger van de content ook een versleuteld bericht wil sturen naar de verzender zal de ontvanger hetzelfde proces moeten ondergaan en dus moeten beschikken over de public key van de verzender.
Symmetrische versleuteling werkt anders. Symmetrische versleuteling werkt met slechts 1 sleutel. Bijvoorbeeld:
- Zowel de verzender als de ontvanger beschikken over “de geheime sleutel”
- Content wordt versleuteld met de geheime sleutel en verzonden naar ontvanger
- De ontvanger ontvangt de tekst en kan deze met de geheime sleutel decoderen en lezen / gebruiken
Symmetrische versleuteling is meestal sneller maar wel onveiliger. Met symmetrische versleuteling beschikken meerdere partijen over de “geheime sleutel” en dus is de kans aanzienlijk groter dat deze gecomprimeerd wordt.
In veel gevallen wordt symmetrische versleuteling gebruikt om een unieke sleutel te delen. Deze sleutel wordt vervolgens gebruikt om een asymmetrische verbinding / versleuteling op te zetten. Dit noemen we hybride versleuteling. PGP lijkt in eerste instantie een asymmetrische versleuteling (en qua core functionaliteit is dit ook zo) maar als je kijkt naar de eigenschappen van PGP kunnen we stellen dat ook PGP een hybride versleuteling is. Dit komt omdat PGP ook gebruik maakt van een extra eenmalige sessiesleutel. Wanneer je met PGP iets versleuteld werkt dit als volgt:
In eerste instantie comprimeert PGP eerst de “platte” content. Door de content eerst te comprimeren wordt het uiteindelijke pakket kleiner en dus makkelijker te versturen maar het versterkt ook de cryptografische beveiliging omdat de meeste cryptografische analysetechnieken gebruik maken van patronen in de “platte” content om de versleuteling te kraken. Compressie vermindert deze patronen en dus de kans om de versleuteling te kraken. Let wel, bestanden die te kort zijn om te comprimeren of die niet goed gecomprimeerd kunnen worden, worden niet gecomprimeerd).
Vervolgens maakt PGP een eenmalige (geheime) sessiesleutel. Deze sessiesleutel is een willekeurig getal dat wordt gegenereerd op basis van de willekeurige bewegingen van uw muis en de toetsaanslagen die u typt. Deze sessiesleutel werkt met een zeer veilig, snel conventioneel coderingsalgoritme om de platte tekst te coderen. Het resultaat is de zogenaamde ciphertext. Nadat de gegevens zijn gecodeerd, wordt de sessiesleutel vervolgens gecodeerd met de openbare sleutel van de ontvanger. De ontvanger ontvangt vervolgens het pakketje, decrypt de sessiesleutel met zijn private key en kan de ciphertext met deze eenmalige sleutel decoderen en lezen.
Hoewel PGP nog steeds een zeer veilige versleuteling is kent het ook diverse nadelen. Denk o.a. aan:
- Het beschermt tegen “lekken” en waarborgt de integriteit van de data maar niet de identiteit van de afzender
- Compatibiliteitsproblemen tussen de vele verschillende versies en gebruikte technieken
- Complex en vereist kennis en een specifieke setup
- Wanneer sleutels verloren gaan zijn ze niet meer te herstellen (in mijn opinie essentieel bij goede versleuteling maar dit kan soms een probleem opleveren in een legitieme situatie)
- Lange sleutels. Het is lastig om een lange sleutel makkelijk te delen door deze b.v. op je businesskaartje te zetten. Er zijn momenteel kortere sleuteld maar ook deze zijn nog relatief fors
- Alle keys alsmede de ciphertext wordt bewaard binnen 1 systeem. Dit betekent dat eventuele berichten makkelijk terug te lezen zijn v.a. de “master” computer. Dit probleem kennen we bij veel meer versleutelingstechnieken
- Er is geen centrale beheerder van de sleutels en dus ook geen “trusted authority”. Dit kan een nadeel zijn maar is in sommige opzichten natuurlijk ook een voordeel. Het grootste nadeel is dat PGP key management slecht en decentraal geregeld is
Nog even voor de duidelijkheid, PGP, OpenPGP en GNU zijn allemaal gebaseerd op PGP maar hebben hun eigen implementatie en standaarden. Dit betekend dat een bericht versleuteld met OpenPGP niet ge-decrypt kan worden door een GNU ontvanger. Sommige implementaties zijn ook beter uitgevoerd dan andere.
Een ander nadeel was dat de gebruiker van een public key de uitgever hiervan niet kon verifiëren. Sommige specifieke aanbieders hebben dit opgelost door de mogelijkheid om de public PGP key te laten ondertekenen ofwel door “adresverificatie” toe te passen. Adresverificatie zorgt ervoor je de openbare sleutels van andere PGP ontvangers die je persoonlijk hebt geverifieerd digitaal kunt ondertekenen. Deze vertrouwde openbare sleutels worden vervolgens veilig opgeslagen in je “gecodeerde contacten” adresboek.
Is PGP dan een 100% veilige methode van versleuteling? Nee 100% veiligheid bestaat niet. Encryptie is een momentopname en kan op een bepaald moment sterk of zwak zijn. De sterkte van encryptie wordt gemeten in de tijd en middelen die nodig zijn om de platte tekst te herstellen zonder bijbehorende sleutel. Sterke encryptie kan op dit moment niet door de krachtigste supercomputers (over een tijdsbestek van vele jaren) gekraakt worden. Volgens Bruce Schneier is PGP “de encryptie die het dichtst in de buurt komt van militaire codering”. Ook Edward Snowden gebruikte PGP om bestanden naar Glenn Greenwald te sturen. Op dit moment kunnen we concluderen dat PGP een aardig veilige versleutelingsmethode is.
Maar hoe zit dat nu met een PGP versleutelde e-mail?
PGP E-mail
PGP bij e-mails werkt uiteraard exact hetzelfde. Belangrijk om te weten is dat alleen de body van een e-mail versleuteld wordt (en eventuele bijlagen). De header en subject line worden niet versleuteld. Zet dus nooit geen gevoelige gegevens in de subjectline.
Om versleuteld te mailen heeft iedere vendor zijn eigen oplossing. Apple mail heeft een eigen implementatie. Voor Microsoft Outlook zijn diverse plugins en voor Linux wordt vaak gebruik gemaakt van de Thunderbird e-mail cliënt (apt-get install thunderbird) met de Enigmail plugin (apt-get install enigmail). In dit voorbeeld maken we gebruik van Linux en dus van Thunderbird en Enigmail. Let op, ook GnuPG2 moet geïnstalleerd zijn (apt-get install gnupg2).
Om te verifiëren of Enigmail goed geïnstalleerd is controleer je om Enigmail aanwezig is in het Thunderbird menu of controleer je de Thunderbird “plugin” tab.
De volgende actie die ondernomen moet worden is het aanmaken van een sleutelpaar. Hiervoor vindt je onder de Enigmail tab een setup wizard. Klik deze aan en doorloop deze om het sleutelpaar aan te maken.
Als je al in het bezit bent van sleutels dan kun je deze uiteraard ook toepassen. Het is dan niet nodig om nieuwe sleutels te configureren.
Vervolgens het verstandig dat je een backup maakt van je sleutels via de Enigmail Preferences – Export Settings and Keys button of via Enigmail Key Management.
Vervolgens is het aan te raden om een revocation certificate aan te maken (recht klikken op je sleutel binnen Enigmail Key Management) zodat je later altijd je certificaat weer in kunt trekken.
Nu dat gedaan is (en je dit certificaat veilig opgeslagen hebt) kun je bij het maken van een nieuwe e-mail ervoor kiezen om versleuteling in te schakelen.
Binnen de preferences van je e-mailaccount kun je er overigens ook voor kiezen om e-mails altijd te versleutelen:
Vervolgens is het zaak om je public key te delen als je wilt dat een andere gebruiker content versleuteld op kan sturen naar jou. Je kunt ervoor kiezen om de public key op te slaan op een USB drive, hem te publiceren op een openbare keyserver of om de public key te mailen. Om deze te mailen maak je binnen Thunderbird een nieuwe e-mail en je kiest vervolgens in het menuitem van Enigmail voor de optie “Attach My Public Key”. De ontvanger kan nu deze public key importeren en versleutelde berichten naar je versturen. Als je samen veilig en versleuteld wilt e-mailen moeten zowel de ontvanger als de verzender bovenstaande proces (het delen van de public keys) uitvoeren.
In bovenstaande screenshot staan nog een aantal interessante zaken:
OpenPGP ID
het ID is een afgeleide van de “fingerprint” van het publieke certificaat. Elk certificaat beschikt over een fingerprint en deze is uniek per certificaat. Deze fingerprint is echter erg lang (128 of 160 bits). De fingerprint wordt gegenereerd middels een hash functie van het publieke certificaat en wordt gebruikt voor maintence taken. Een fingerprint is al leesbaarder dan het gehele certificaat. Echter is dit nog steeds lastig te lezen. Daarom wordt er gewerkt met een ID. Hierin zijn 2 verschillen, een long ID en een Short ID.
de Long ID bestaat uit de laagste 64 bits van de fingerprint. Nog vaker wordt de Short ID gebruikt die wordt gevormd door de laagste 32 bits van de fingerprint. De Short ID is het makkelijkst hanteerbaar maar heeft de grootste kans op dubbelingen.
Fingerprint: 0D69 E11F 12BD BA07 7B37 26AB 4E1F 734D B5DD 12A8 Long key ID: 4E1F 734D B5DD 12A8 Short key ID: B5DD 12A8
Sign Messages
Message Signing wordt vaak verward met encryptie. Message signing zorgt ervoor dat de ontvanger kan verifiëren dat het bericht integer is (niet mee geknoeid) en dat het bericht authentiek is en dus afkomstig is van de persoon die claimt het bericht te versturen. Belangrijk dus… en eigenlijk helemaal niet zo moeilijk want we gebruiken hiervoor 2 dingen:
- Het PGP sleutelpaar
- Hashing functionaliteit
Als een bericht ge-signed wordt dan wordt de content van het bericht (nadat het versleuteld is) ge-hashed (meestal met SHA-1). Deze hash is dus een unieke waarde welke veranderd als er slechts 1 bit binnen de content veranderd. Vervolgens wordt deze hash versleuteld met de PRIVATE key van de gebruiker en onder de e-mail geplakt.
De ontvanger zal het ondertekende bericht proberen te verifiëren. Om dit te doen neemt hij de versleutelde hash en hij kan deze decrypten met de (publiekelijk) beschikbare “public key”. Als dat lukt dan is de authenticiteit van de verzender vastgesteld. Wie ander kan het bericht versleutelen met de geheime private key?
Vervolgens blijft de hash over. De content van het bericht wordt nu opnieuw gehashed. Als de hashes identiek zijn betekend dit dat de content onaangetast en dus integer is.
Versleutelde berichten worden vrijwel altijd “ge-signed” omdat deze extra vertrouwelijkheid geven aan het bericht.
Use PGP/MIME by default
PGP/MIME is de methode die gebruikt wordt om het bericht te versleutelen en de tegenhanger van PGP/Inline. De PGP/Inline variant versleuteld alle onderdelen separaat zoals de body en de attachments. Dit heeft als voordeel dat de ontvanger elke onderdeel separaat kan decrypten (eventueel met externe tools als de e-mail cliënt geen PGP/Inline decrypting ondersteund). Het nadeel bij deze methode is dat artifacts / metadata over de content zoals attachements niet versleuteld is en dus nog steeds leesbaar is. Een ander nadeel is dat PGP/Inline alleen plain-tekst en geen HTML opmaak ondersteund.
Dit is waar PGP/MIME voor gebruikt wordt. PGP/MIME versleutelt het bericht als een geheel waardoor HTML opmaal mogelijk is en er geen metadata vrijgegeven wordt van de content. De meeste e-mail cliënts ondersteunen PGP/MIME. Het enige nadeel van PGP/MIME encryptie is dat het hele bericht ge-decrypt moet worden om b.v. alleen de content te lezen. Dit kost meer processorkracht en potentieel meer tijd.
S/MIME
Zoals je kon zien staat de default encryptiemethode op Enigmail (PGP). S/MIME staat voor “Secure/Multipurpose Internet Mail Extensions”. S/MIME is zeer vergelijkbaar met PGP. Zo is S/MIME een asymmetrische encryptiemethode welke net als PGP signing van berichten toestaat. S/MIME is afgeleid van het PKCS # 7-gegevensformaat voor de berichten en het X.509v3-formaat voor certificaten. PGP-codering maakt gebruik van een seriële combinatie van hashing, gegevenscompressie, symmetrische sleutelcryptografie en openbare sleutelcryptografie. Bij het gebruik van PGP heeft een gebruiker de mogelijkheid om direct een openbare sleutel aan een andere gebruiker te geven/sturen of kan de tweede gebruiker de openbare sleutel van de eerste gebruiker verkrijgen. PGP stelt geen beleid voor het creëren van vertrouwen. Bij PGP wordt de chain-of-trust door de gebruikers bepaald en S/MIME maakt hiervoor gebruik van een certificate authority. S/MIME is superieur aan PGP omdat het betrouwbaarder is (dit is wel discutabel want een certificate authority is immers toch een derde partij) en omdat S/MIME vaak makkelijker is voor de gebruiker om toe te passen. Persoonlijk denk ik dat er voor PGP en S/MIME beide vele toepassingen te bedenken zijn waarin de kracht van ieder het beste benut wordt.
PGP Versleutelde E-mails
Om te zien hoe dit eruit ziet gaan we een paar e-mails versleutelen en onderteken:
E-mail verzonden vanuit Thunderbird met publieke sleutel. Deze e-mail is onversleuteld verzonden:
E-mail welke alleen versleuteld is met PGP:
E-mail welke versleuteld en gesigned is met PGP:
E-mail welke versleuteld en gesigned is met PGP/Inline:
Conclusie
Tot zover PGP en met name het gebruik van PGP binnen e-mail toepassingen. Zoals je ziet is PGP een methode die niet nieuw is en nog steeds de tand-des-tijd heeft doorstaan. Hopelijk geeft deze post je een beter inzicht in deze methode en wellicht is dit een mooi moment om zelf het gebruik van PGP te overwegen.
Als je deze post leuk of interessant vond, schroom dan niet om deze post te liken of weder te delen op je sociale kanalen of website. Een leuk berichtje is ook altijd welkom. Deze kleine moeite geeft me de motivatie om nog meer posts te maken en om kennis te blijven delen op een duidelijke manier. THANKS! Tot de volgende post…