PGP

De Wiki - kr[HACK]en
Sauter à la navigation Sauter à la recherche

Introduction

Sécuriser et certifier ses échanges devient un besoin de plus en plus nécessaire. Même si de plus en plus de services mail utilisent le chiffrement TLS, ce chiffrement empêche uniquement un observateur externe d'accéder aux données transmises. Le propriétaire du service a tout le loisir de récupérer et de traiter ces informations. Anecdotique ? Rappelons que Google enregistre plus de 1,5 milliards de comptes actifs[1] (octobre 2018) et qu'en acceptant les conditions d'utilisation chacun lui a consentit le droit de récupérer et d'analyser toutes les données transitant par gmail.

Heureusement pour vous, il existe OpenPGP ! Open Pretty Good Privacy est un standard pour le chiffrement et la signature des données (voir Wikipedia pour plus d'infos) qui a fait ses preuves et est aujourd'hui mondialement utilisé !

Nous allons voir ici comment générer des clefs PGP et comment certifier les clefs des autres.

Fonctionnement de PGP

Le standard PGP est basé sur un système de paires clef publique - clef privée. Dans l'idée, chacun possède une clef privée confidentielle et distribue sa clef publique aux autres. On utilise cette clef publique pour chiffrer un message et seule la clef privée associée permet de le déchiffrer. Pour assurer la provenance du message on le signe grâce à une clef privée ; quiconque possède la clef publique peut vérifier la signature. Mais comment être sûr qu'une clef appartient bien à la personne mentionnée sur cette clef ? En utilisant le système de certification : si vous connaissez le possesseur de la clef et voulez attester de son identité, vous pouvez signer cette clef avec votre propre clef privée. Par exemple :

La clef d'Alice est signée par Bob. La clef de Bob est signée par Carole. Maintenant, Carole veut communiquer avec Alice mais ne connait pas sa clef. Elle récupère sur Internet une clef attribuée à Alice et vérifie les signatures. Carole voit que cette clef est signée par Bob et lui fait confiance, elle en déduit donc que la clef attribuée à Alice lui appartient bien. Bien entendu, ceci suppose que Bob est gentil et n'a pas généré une clef au nom d'Alice. C'est pourquoi plus une clef est signée par des personnes différentes, plus elle est fiable.

En pratique, une clef PGP est constituée d'une paire primaire et d'une ou plusieurs paires secondaires (on parle de sous-clefs). La clef primaire est associée à une (ou plusieurs) identité(s) (Nom, Prénom, adresse mail) et sert généralement à la certification. Les clefs secondaires sont signées par la clef primaire (donc associées à celle-ci) et servent au chiffrement et à la signature des messages.

Lorsque l'on certifie la clef d'un autre, on signe sa clef primaire. Ainsi, si l'on ajoute une nouvelle sous-clef à une clef déjà signée cette nouvelle sous-clef bénéficiera de la certification. Cette mécanique sera abordée plus loin dans ce wiki.

Logiciels nécessaires

Ce wiki donne les étapes pour créer des clefs avec GNUPG (abrégé GPG), une implémentation libre du standard OpenPGP.

Windows

Si vous êtes sous Windows je vous suggère d'utiliser GPG4Win. L'installateur inclut le logiciel Kleopatra, un gestionnaire de clefs en mode graphique ; GpgEX, une extention de l'explorateur de fichier qui s'affiche dans le menu contextuel (clic droit) permettant de chiffrer, déchiffrer, signer, vérifier rapidement des fichiers ; et GpgOL; un plugin pour Microsoft Outlook. Bien sur vous pouvez choisir ce que vous voulez installer.

MacOS

Si vous êtes sur MacOS, utilisez GPG Tools.

Linux

Si vous êtes sur Linux, assurez vous que le paquet gnupg est installé.

Création des clefs

Les deux premières paires

Ouvrez un terminal et entrez :

$ gpg --full-gen --expert

Cela vas permettre une génération de clefs avec un contrôle total. Nous obtenons quelque-chose dans ce goût là:

gpg (GnuPG) 2.2.19; Copyright (C) 2019 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.

Sélectionnez le type de clef désiré :
   (1) RSA et RSA (par défaut)
   (2) DSA et Elgamal
   (3) DSA (signature seule)
   (4) RSA (signature seule)
   (7) DSA (indiquez vous-même les capacités)
   (8) RSA (indiquez vous-même les capacités)
   (9) ECC et ECC
  (10) ECC (signature seule)
  (11) ECC (indiquez vous-même les capacités)
  (13) Clef existante
  (14) Existing key from card
Quel est votre choix ?

Je vais faire la suite de ce wiki avec des clefs de type RSA car c'est une technologie fiable et éprouvée, mais vous pouvez utiliser une autre méthode si vous avez une préférence. Nous entrons donc 1.

les clefs RSA peuvent faire une taille comprise entre 1024 et 4096 bits.
Quelle taille de clef désirez-vous ? (2048)

La taille de clef par défaut est de 2048 bits. Les clefs de 1024 bits sont aujourd'hui cassables et celles 2048 deviennent dépréciées. Mettons donc 4096.

les clefs RSA peuvent faire une taille comprise entre 1024 et 4096 bits.
Quelle taille de clef désirez-vous pour la sous-clef ? (2048)

On crée une deuxième paire de clef d'un coup, nous répondons donc à nouveau 4096.

Veuillez indiquer le temps pendant lequel cette clef devrait être valable.
         0 = la clef n'expire pas
      <n>  = la clef expire dans n jours
      <n>w = la clef expire dans n semaines
      <n>m = la clef expire dans n mois
      <n>y = la clef expire dans n ans
Pendant combien de temps la clef est-elle valable ? (0)

On nous demande maintenant la durée de validité de cette clef. On conseille généralement 2 ans, mais vous pourrez repousser la date limite si la clef est toujours saine arrivée à cette date. Nous répondons alors 2y.

La clef expire le 01/15/22 18:24:31 Paris, Madrid
Est-ce correct ? (o/N)

On confirme, o.

GnuPG doit construire une identité pour identifier la clef.

Nom réel :

Le Nom réel est un nom qui apparaitra sur la clef. Entrez votre nom (et prénom) ou tout autre pseudo que vous voulez voir associé avec cette clef. Pour l'exemple je rentre John Doe.

Adresse électronique :

De même, l'adresse mail associée à la clef. Je rentre john.doe@example.com

Commentaire :

Laissez vide si vous ne savez pas quoi mettre.

Vous avez sélectionné cette identité :
    « John Doe <john.doe@example.com> »

Changer le (N)om, le (C)ommentaire, l'(A)dresse électronique
ou (O)ui/(Q)uitter ?

Si vous êtes satisfait, entrez O.

La génération de clefs RSA demande de choisir des nombres premiers aléatoirement, d'où le message suivant :

De nombreux octets aléatoires doivent être générés. Vous devriez faire
autre chose (taper au clavier, déplacer la souris, utiliser les disques)
pendant la génération de nombres premiers ; cela donne au générateur de
nombres aléatoires une meilleure chance d'obtenir suffisamment d'entropie.

GPG vous demande un mot de passe pour sécuriser votre clef privée. Entrez en un fort, c'est la seule protection qu'il vous resterai si quelqu'un récupérait votre clef privée.

gpg: clef 4BD7506023C87EB0 marquée de confiance ultime.
gpg: revocation certificate stored as '~/gnupg/openpgp-revocs.d\E4E7FA4250F61F1A6CF586EB4BD7506023C87EB0.rev'
les clefs publique et secrète ont été créées et signées.

pub   rsa4096 2020-01-16 [SC] [expire : 2022-01-15]
      E4E7FA4250F61F1A6CF586EB4BD7506023C87EB0
uid                      John Doe <john.doe@example.com>
sub   rsa4096 2020-01-16 [E] [expire : 2022-01-15]

Nous remarquons deux suites hexadécimales : 4BD7506023C87EB0 et E4E7FA4250F61F1A6CF586EB4BD7506023C87EB0. Comme nous pouvons le voir, le premier nombre est la fin du second. Ce premier nombre, 4BD7506023C87EB0, est appelé identifiant de la clef (key-id en anglais). Il permet d'identifier la clef dans le trousseau local uniquement. En effet, on sait générer des clefs possédant le même identifiant. Le code source de cette méthode est d'ailleurs disponible sur GitHub. Pour plus d'infos voir le site https://evil32.com dédié à cette faille. Le second nombre, E4E7FA4250F61F1A6CF586EB4BD7506023C87EB0, est appelé empreinte de la clef (fingerprint en anglais). Celui-ci est sûr et peut être utilisé pour identifier une clef sur Internet. Voyez l'identifiant comme le couple (prénom, date de naissance) : il y a peu de chance que quelqu'un de votre entourage ait le même, mais c'est en revanche très probable à l'échelle du monde. L'empreinte peut être vue comme le quadruplet (nom, prénom, date de naissance, ville de naissance). Il est très très très très improbable que quelqu'un d'autre dans le monde ait le même.

Étudions cette partie :

pub   rsa4096 2020-01-16 [SC] [expire : 2022-01-15]
      E4E7FA4250F61F1A6CF586EB4BD7506023C87EB0
uid                      John Doe <john.doe@example.com>
sub   rsa4096 2020-01-16 [E] [expire : 2022-01-15]

Première ligne :

  • pub : Clef publique primaire
  • rsa4096 : de type RSA de 4096 bits
  • 2020-01-16 : créée le 20 janvier 2020
  • [SC] : utilisée pour Signer et pour Certifier
  • [expire : 2022-01-15] : trivial.

Deuxième ligne:

  • uid : User-ID, identifiant utilisateur. Notez qu'il peut y avoir plusieurs identifiants utilisateur par clef.
  • John Doe <john.doe@example.com> : trivial.

Dernière ligne :

  • sub : Subkey, sous-clef publique liée à la clef primaire
  • rsa4096 : de même que précédemment
  • 2020-01-16 : idem
  • [E] : utilisée pour chiffrer (Encryption) et déchiffrer
  • [expire : 2022-01-15] : trivial.

Une sous-clef de signature

Nous avons donc nos deux premières paires de clef, mais ce n'est pas encore suffisant. Nous allons créer une deuxième sous-clef, dédiée à la signature. Pourquoi une nouvelle sous-clef ? La clef primaire permet déjà de signer me direz-vous. Considérons le scénario suivant :

La clef d'Alice est signée par une dizaine de personne, de même que Bob. Alice et Bob ont besoin de signer et de déchiffrer leurs messages partout, ils emportent donc toujours leurs clefs avec eux. Un jour Mallory récupère la clef privée d'Alice et casse son mot de passe. Alice s'en rend compte et révoque sa clef. Malheureusement pour elle, Alice n'utilisait pas de sous-clef de signature et sa clef privée contenait donc sa clef primaire. Alice doit recréer une nouvelle clef à partir de zéro et doit rebâtir la totalité de son réseau de confiance ! Il arrive la même mésaventure à Bob, mais lui utilisait une sous-clef de signature. Il n'emportait donc avec lui que ses sous-clefs privées de chiffrement et de signature, sa clefs privée primaire étant bien au chaud dans un coffre-fort. Bob se rend compte que Mallory a récupéré ses sous-clefs et décide donc de les révoquer. Il ressort alors sa clef primaire, génère de nouvelles sous-clefs et distribue ces dernières sur Internet. Son réseau de confiance est préservé car ses sous-clefs bénéficient des certifications de sa clef primaire (pour être précis, la clef publique primaire est exportée en même temps que les sous-clefs) !

Pour ajouter une nouvelle sous-clef, il faut ouvrir la clef en édition (nous l'ouvrons en expert afin d'avoir un maximum de choix) :

$ gpg --expert --edit-key John

Toutes les commandes demandant de spécifier une clef acceptent l'identifiant, l'empreinte, le nom (ou une partie du nom) et l'adresse mail.

La commande précédente nous renvoie :

gpg (GnuPG) 2.2.19; Copyright (C) 2019 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.

La clef secrète est disponible.

sec  rsa4096/4BD7506023C87EB0
     créé : 2020-01-16  expire : 2022-01-15  utilisation : SC
     confiance : ultime        validité : ultime
ssb  rsa4096/2A3093AB0513C89B
     créé : 2020-01-16  expire : 2022-01-15  utilisation : E
[  ultime ] (1). John Doe <john.doe@example.com>

gpg>
  • sec signifie que la clef secrète primaire est disponible.
  • ssb signifie que la sous-clef secrète est disponible.

Pour avoir une liste des commandes les plus importantes, vous pouvez entrer help. Nous voulons ajouter une sous-clef, nous entrons donc addkey :

Sélectionnez le type de clef désiré :
   (3) DSA (signature seule)
   (4) RSA (signature seule)
   (5) Elgamal (chiffrement seul)
   (6) RSA (chiffrement seul)
   (7) DSA (indiquez vous-même les capacités)
   (8) RSA (indiquez vous-même les capacités)
  (10) ECC (signature seule)
  (11) ECC (indiquez vous-même les capacités)
  (12) ECC (chiffrement seul)
  (13) Clef existante
  (14) Existing key from card
Quel est votre choix ?

Fidèle à moi-même je choisit RSA 4, mais vous pouvez choisir un autre algorithme (en signature seul).

les clefs RSA peuvent faire une taille comprise entre 1024 et 4096 bits.
Quelle taille de clef désirez-vous ? (2048)

De même que précédemment, nous entrons 4096.

La taille demandée est 4096 bits
Veuillez indiquer le temps pendant lequel cette clef devrait être valable.
         0 = la clef n'expire pas
      <n>  = la clef expire dans n jours
      <n>w = la clef expire dans n semaines
      <n>m = la clef expire dans n mois
      <n>y = la clef expire dans n ans
Pendant combien de temps la clef est-elle valable ? (0)

Nous pouvons spécifier 2y.

La clef expire le 01/15/22 18:30:22 Paris, Madrid
Est-ce correct ? (o/N)

Répondons o.

Faut-il vraiment la créer ? (o/N)  

Idem, o.

On vous demande votre mot de passe pour modifier votre clef, entrez-le. La procédure se termine enfin :

De nombreux octets aléatoires doivent être générés. Vous devriez faire
autre chose (taper au clavier, déplacer la souris, utiliser les disques)
pendant la génération de nombres premiers ; cela donne au générateur de
nombres aléatoires une meilleure chance d'obtenir suffisamment d'entropie.

sec  rsa4096/4BD7506023C87EB0
     créé : 2020-01-16  expire : 2022-01-15  utilisation : SC
     confiance : ultime        validité : ultime
ssb  rsa4096/2A3093AB0513C89B
     créé : 2020-01-16  expire : 2022-01-15  utilisation : E
ssb  rsa4096/12334F0097F8421D
     créé : 2020-01-16  expire : 2022-01-15  utilisation : S
[  ultime ] (1). John Doe <john.doe@example.com>

gpg>

Pour sauvegarder et quitter, entrez save. quit fonctionne aussi mais vous demande si les modifications doivent être enregistrées.

Vérification

Et voilà, nos clefs sont crées ! Nous pouvons afficher l'ensemble du trousseau publique avec $ gpg -k :

pub   rsa4096 2020-01-16 [SC] [expire : 2022-01-15]
      E4E7FA4250F61F1A6CF586EB4BD7506023C87EB0
uid          [  ultime ] John Doe <john.doe@example.com>
sub   rsa4096 2020-01-16 [E] [expire : 2022-01-15]
sub   rsa4096 2020-01-16 [S] [expire : 2022-01-15]

Et l'ensemble du trousseau privé avec $ gpg -K :

sec   rsa4096 2020-01-16 [SC] [expire : 2022-01-15]
      E4E7FA4250F61F1A6CF586EB4BD7506023C87EB0
uid          [  ultime ] John Doe <john.doe@example.com>
ssb   rsa4096 2020-01-16 [E] [expire : 2022-01-15]
ssb   rsa4096 2020-01-17 [S] [expire : 2022-01-16]

Signer une autre clef