GPG: Communiquer de manière sécurisée

GPG (GnuPG), abréviation de GNU Privacy Guard est un outil qui permet d'envoyer des messages signés et/ou chiffrés.

Dans le cas de messages signés, cela permet au destinataire de savoir exactement que le message qu'il reçoit a bien été envoyé par l'expéditeur indiqué et qu'il n'a pas été altéré.

Dans le cas de messages chiffrés, seul le destinataire du message est en mesure de le déchiffrer. Même l'expéditeur ne peut pas le faire.

Pour fonctionner, GPG utilise un système de paire de clés.
L'association d'une clé privée et d'une clé publique.
Comme son nom l'indique, la clé privée est privée et ne doit surtout pas être divulgée.
La clé publique, quant à elle, doit obligatoirement être communiquée à toutes les personnes avec lesquelles vous souhaitez communiquer de manière sécurisée (chiffrée).
Pour cela, il existe des serveurs de clés publiques où n'importe qui est en mesure de récupérer la clé publique de n'importe qui.

Wikipedia Plus d'infos sur Wikipédia

Le site de GnuPG

Infographie conçue par la FSF

info

Une version de GnuPG est disponible pour Android, sur Google Play.
Une extension, Enigmail, est disponible pour le logiciel de messagerie Thunderbird.
Une extension, Mailvelope, est disponible pour les navigateurs Firefox et Chrome.

Principe de fonctionnement

La personne "A" souhaite communiquer de manière sécurisée avec la personne "B" et inversement.
Chacun de leur coté, "A" et "B" génèrent leurs clés privées et publiques et publient leurs clés publiques sur un serveur de clés.
"A" recherche sur le serveur de clés la clé publique de "B".
"A" rédige un message dans un fichier, le signe et le chiffre à l'aide de la clé publique de "B".
Un nouveau fichier est généré mais le contenu de celui-ci est chiffré.
"A" envoie ce fichier par mail à "B".
"B" reçoit de "A" un mail (automatiquement signé par la clé privée de "A") et ayant en pièce jointe le fichier contenant le message chiffré.
Si ce n'est pas déjà fait, "B" récupère la clé publique de "A" lui permettant de vérifier que la signature du message est bien authentique et que le contenu du message n'a pas été modifié.
Enfin, "B", à l'aide de sa clé privée, déchiffre le contenu de la pièce jointe.
Le processus est terminé.
Si le message de "A" a été intercepté par une personne malintentionnée "C", le contenu de la pièce jointe ne pourra pas être déchiffré sans la clé privée de "B". "C" ne pourra donc pas lire le contenu de la pièce jointe.

Exemple d'un message chiffré

Avant chiffrement

Ceci est un message chiffré.

Après chiffrement

-----BEGIN PGP MESSAGE-----
Version: GnuPG v2

hQEMAxetSMh+B9VxAQf/VvFi7T89Gn1gEfnsg1WTOW1uOJX9KgVnWF3QCxr87/zf
T0PCvJnEnt9HirAMu+nn9iMmnSju89RhIFjQkTVltLlfOJY7kQQBc1DdM7h2MYNI
632daM650f6LGa1ZQ3gbdc/pmdjq+YxrqJQM+lC36n3nSbuQjluJF2nv/R70sQXw
4pl2arebgqq45dRwNiGvOFsMpjyS1rLgQ9noA0p+N+OpiK/3YezRJGNl2SVspBqh
zDh/Qcweq2R66dtr8gsPhkeBy0/wy4bI2o6CC7oGEFC+RnKqkC3V4ZvfHhY3gjgu
pxlit6cKgoUfSXiMLWioKinWaqF4U+/YMyRnsLYAytJYAdI4rniMl89CbsQYhYCn
l7vTPBnUhLzHFQv/L+vcnxOPrRohVVfIm+zNyHv4QtSvtHc+/WTbhERE+cdCRvXP
l5oFR4/znpzU9XPknSjpRUZ3Ugy94bfe/Q==
=YUMp
-----END PGP MESSAGE-----

Certe, le message chiffré est un peu beaucoup plus long mais personne ne peut le lire mis à part celui pour lequel il a été chiffré.

Pour info La longueur du message chiffré n'est pas proportionnelle à la longueur du message clair.
Dans l'exemple ci-dessus, le message clair fait 29 caractères et le message chiffré 572 caractères.
Un autre test, avec un message clair de 116 caractères produit un message chiffré de 682 caractères.

Les différentes méthodes de chiffrement

Avec GPG, il est possible de chiffrer un message de trois manières différentes.

  1. Chiffrement du message en mode ASCII et copié/collé du message chiffré directement dans le corp du mail.
  2. Ecriture du message dans un fichier.
    Chiffrement du fichier contenant le message en mode ASCII.
    Envoi du mail avec le fichier en pièce jointe.
  3. Ecriture du message dans un fichier.
    Chiffrement du fichier contenant le message en mode Binaire.
    Envoi du mail avec le fichier en pièce jointe.

Pour info Pour un envoi directement dans le corp du mail, le mode ASCII est obligatoire
Pour un envoi en pièce jointe, c'est selon vos préférences ou la taille du fichier généré.

Etiquettes: 

En route avec GPG

Etiquettes: 

Pré-requis

Pour pouvoir générer correctement les paires de clés (privée et publique), GPG a besoin d'une quantité importante de données aléatoires.

Pour générer ces données aléatoires, le système (Ubuntu/Debian/CentOS etc etc ...) a besoin d'une activité importante au niveau du processeur, de l'utilisation du ou des disques durs etc et c....

Pour faciliter la tâche, il existe un programme rng-tools, qui permet de faciliter la génération de données aléatoires sans solliciter le matériel.

# apt-get install rng-tools

# echo "HRNGDEVICE=/dev/urandom" >> /etc/default/rng-tools

# service rng-tools start

Il n'y a rien de plus à faire.
Désormais, tous les programmes, comme GPG, ayant un besoin important de données aléatoires auront leurs tâches facilitées par rng-tools.

Etiquettes: 

Création de la paire de clés (privée et publique)

On exécute la commande gpg --gen-key

# gpg --gen-key
gpg (GnuPG) 1.4.16; 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.

gpg: directory `/root/.gnupg' created
gpg: new configuration file `/root/.gnupg/gpg.conf' created
gpg: WARNING: options in `/root/.gnupg/gpg.conf' are not yet active during this run
gpg: keyring `/root/.gnupg/secring.gpg' created
gpg: keyring `/root/.gnupg/pubring.gpg' created
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

Lors du choix du type de clé, choisir (1) RSA and RSA (default)

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
Requested keysize is 2048 bits

Pour la longueur de la clé, laissé le choix par défaut 2048 bits.

Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
Is this correct? (y/N) y

Pour la durée de validité de la clé, à vous de choisir.
Pour l'exemple je choisi 0 (La clé n'expire jamais)
Valider en répondant y pour YES

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

Real name: Jean Michel A Peu Près
Email address: jm@apeupres.fr
Comment:
You selected this USER-ID:
    "Jean Michel A Peu Près <jm@apeupres.fr>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o

Renseigner votre nom, votre adresse mail et un commentaire si vous le souhaitez.
Valider en répondant o pour OK

You need a Passphrase to protect your secret key.

Enter passphrase:
Repeat passphrase:

Renseigner une phrase de passe.
Surtout, ne la perdez pas.

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 ayant besoin d'un grand nombre de données aléatoires pour pouvoir générer les clés, il est conseillé d'utiliser le poste un maximum pendant la génération des clés.
Utiliser au maximum le clavier, la souris etc etc.

gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key 0D6FE738 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   2048R/0D6FE738 2015-09-11
      Key fingerprint = C643 9D6C 9456 9961 58C1  CDC7 F700 1FBC 0D6F E738
uid                  Jean Michel A Peu Près <jm@apeupres.fr>
sub   2048R/1C51C149 2015-09-11

Une fois terminé, GPG nous informe que la clé privée et publique ont été créées et signées.
Le détail des clés est affiché à l'écran.

En fait, on s'aperçoit que la clé publique  0D6FE738 contient une sous-clé 1C51C149 (idem pour la clé privée).
Ce sont donc au total 4 clés qui ont été créées.

note Une fois votre clé créée, vous pouvez indiquer dans votre fichier ~/.bashrc qu'il s'agit de votre clé par défaut en ajoutant la ligne:

# echo "export GPGKEY=0D6FE738" >> ~/.bashrc

 

Etiquettes: 

Lister les clés

Afficher toutes les clés (pub) et sous-clés (sub) publiques de notre trousseau

# gpg --list-keys
/root/.gnupg/pubring.gpg
------------------------
pub   2048R/0D6FE738 2015-09-11
uid                  Jean Michel A Peu Près <jm@apeupres.fr>
sub   2048R/1C51C149 2015-09-11

pub   2048R/488606BD 2013-10-11 [expires: 2018-10-10]
uid                  Christopher lowson <webmin@lowson.ca>
uid                  Christopher Lowson <lowson.chris@gmail.com>
uid                  [jpeg image of size 2653]
sub   2048R/CA15AA23 2013-10-11 [expires: 2018-10-10]

pub   1024D/ACC3599B 2011-03-19
uid                  BT <bt@webmin.net>
sub   1024g/DA013131 2011-03-19

pub   1024D/A7F37C67 2009-04-17 [expired: 2010-07-31]
uid                  Max Ober <max.ober@gmail.com>
uid                  mober.at <post@mober.at>
uid                  mober.at <webmin@mober.at>
uid                  Max Ober <mober.itsb2006@fh-salzburg.ac.at>
uid                  n0942544@students.meduniwien.ac.at <n0942544@students.meduniwien.ac.at>

Pour info Ma clé publique 0D6FE738 apparait bien dans la liste ainsi que différentes clés importées 488606BD, ACC3599B, A7F37C67.

Afficher uniquement une clé spécifique (on indique l'uid de la clé ou son numéro en 6 caractères)

# gpg --list-keys Jean Michel A Peu Près

ou

# gpg --list-keys 0D6FE738
pub   2048R/0D6FE738 2015-09-11
uid                  Jean Michel A Peu Près <jm@apeupres.fr>
sub   2048R/1C51C149 2015-09-11

Nous voyons bien que notre clé publique 0D6FE738 contient une sous-clé 1C51C149

Afficher la liste des clés (sec) et sous-clés (ssb) privées

# gpg --list-secret-keys
/root/.gnupg/secring.gpg
------------------------
sec   2048R/0D6FE738 2015-09-11
uid                  Jean Michel A Peu Près <jm@apeupres.fr>
ssb   2048R/1C51C149 2015-09-11

Nous voyons également que notre clé privée 0D6FE738 contient, comme sa clé publique, une sous-clé 1C51C149

Etiquettes: 

Editer une clé

Nous allons éditer notre clé afin d'y apporter quelques modifications.

Pour info Cette commande nous permet d'entrer dans le mode interactif de GPG

# gpg --edit-key 0D6FE738
gpg (GnuPG) 1.4.16; 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.

Secret key is available.

pub  2048R/0D6FE738  created: 2015-09-11  expires: never       usage: SC
                     trust: ultimate      validity: ultimate
sub  2048R/1C51C149  created: 2015-09-11  expires: never       usage: E
[ultimate] (1). Jean Michel A Peu Près <jm@apeupres.fr>

gpg>

Le mode édition nous permet de voir notre clé plus en détail.
Nous voyons, par exemple, que la clé privée est disponible (Secret key is available).
Nous voyons également, au niveau du champ usage, que notre clé maitresse 0D6FE738 peut-être utilisée pour certifier ou signer la clé publique d'un utilisateur (lettre C) et signer un document [mail / fichier] (lettre S).
Nous voyons que nous avons une sous-clé 1C51C149 qui va nous permettre de chiffrer un document [mail / fichier] (lettre E dans le champ usage).
Pour finir, nous voyons tous les détails concernant la date de création (created), la date d'expiration (expires) et le niveau de confiance (trust).

Liste des différents usages des clés

  • C: certifier ou signer la clé publique d'un utilisateur
  • S: signer un document [mail / fichier]
  • E: chiffrer un document [mail / fichier]
  • A: authentification SSH, TLS, etc etc ...

Liste des principales commandes disponibles dans le mode interactif

quit - Quitte le menu
save - Sauvegarde les modifications et quitte le menu
help - Affiche l'aide
fpr - Affiche l'empreinte de la clé sur 40 caractères
list - Affiche le détail de la clé
uid - Permet de sélectionner l'uid désiré
key - Permet de sélectionner la sous-clé désirée
check - Vérifie les signatures
sign - Signe l'uid sélectionné
adduid - Ajoute un uid
addphoto - Ajoute une photo
deluid - Supprime l'uid sélectionné
addkey - Ajoute une sous-clé
delkey - Supprime la sous clé sélectionnée
delsig - Supprime la signature de l'uid sélectionné
expire - Change la date d'expiration de la clé ou sous-clé sélectionnée
toggle - Bascule la liste clé publique / clé privée
passwd - Change la phrase de passe
trust - Modifie le niveau de confiance
revsig - Révoquer la signature de l'uid sélectionné
revuid - Révoquer l'uid sélectionné
revkey - Révoquer la clé ou sous-clé sélectionnée
enable - Active la clé
disable - Désactive la clé

Ajout d'une sous-clé

Notre clé maitresse 0D6FE738 ayant deux usages (certification/signature de clé publique et signature de documents), nous allons ajouter une sous-clé qui nous permettra, uniquement, la signature de documents.
De la même manière que notre sous-clé 1C51C149 nous permet uniquement le chiffrement de documents.

gpg> addkey
Key is protected.

You need a passphrase to unlock the secret key for
user: "Jean Michel A Peu Près <jm@apeupres.fr>"
2048-bit RSA key, ID 0D6FE738, created 2015-09-11

Il faut obligatoirement saisir la phrase de passe

gpg: gpg-agent is not available in this session
Please select what kind of key you want:
   (3) DSA (sign only)
   (4) RSA (sign only)
   (5) Elgamal (encrypt only)
   (6) RSA (encrypt only)
Your selection? 4

Nous allons choisir l'option 4 qui nous permet de créer une sous-clé RSA uniquement pour la signature.

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
Requested keysize is 2048 bits

Nous laissons le choix par défaut pour la longueur de la clé (2048 bits)

Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0)
Key does not expire at all
Is this correct? (y/N) y

Choisir une date d'expiration
Je choisi le choix par défaut (n'expire jamais)

Really create? (y/N) y

Je confirme la création

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.

pub  2048R/0D6FE738  created: 2015-09-11  expires: never       usage: SC
                     trust: ultimate      validity: ultimate
sub  2048R/1C51C149  created: 2015-09-11  expires: never       usage: E
sub  2048R/219FE958  created: 2015-09-11  expires: never       usage: S
[ultimate] (1). Jean Michel A Peu Près <jm@apeupres.fr>

gpg>

Et voilà, je me trouve en possession d'une paire de clé maitresse 0D6FE738 (privée/publique) pour la certification ou la signature de clé publique chacune ayant deux sous-clés, une pour le chiffrement de documents 1C51C149 (usage: E) et une pour la signature de documents 219FE958 (usage: S).

Une fois les modifications terminées, quitter le mode interactif en sauvegardant.

gpg> save

Révoquer une sous-clé

(A faire uniquement dans le cas où la ou les sous-clés sont compromises)

Il faut éditer la clé maitresse correspondante.

# gpg --edit-key 0D6FE738
gpg (GnuPG) 1.4.16; 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.

Secret key is available.

pub  2048R/0D6FE738  created: 2015-09-11  expires: never       usage: SC
                     trust: ultimate      validity: ultimate
sub  2048R/1C51C149  created: 2015-09-11  expires: never       usage: E
[ultimate] (1). Jean Michel A Peu Près <jm@apeupres.fr>

gpg>

Sélectionner la sous-clé correspondante à l'aide de la commande key suivi du numéro d'index de la sous-clé.

Pour sélectionner la sous-clé 1 (index)

gpg> key 1

Même commande pour la désélectionner

gpg> key 1

L'index des clé/sous-clés commence à 0 (zéro).
Dans mon exemple, ma clé maitresse 0D6FE738 correspond à l'index 0, la sous-clé 1C51C149 à l'index 1 etc etc...

Pour info On sait qu'une sous-clé est sélectionnée quand un asterisk est présent sur la ligne (à coté de sub)

gpg> key 1

pub  2048R/0D6FE738  created: 2015-09-11  expires: never       usage: SC
                     trust: ultimate      validity: ultimate
sub* 2048R/1C51C149  created: 2015-09-11  expires: never       usage: E
sub  2048R/219FE958  created: 2015-09-11  expires: never       usage: S
[ultimate] (1). Jean Michel A Peu Près <jm@apeupres.fr>

Je sélectionne ma sous-clé 1C51C149 index 1 (un asterisk m'indique la clé sélectionnée)

gpg> revkey
Do you really want to revoke this subkey? (y/N) y
Please select the reason for the revocation:
  0 = No reason specified
  1 = Key has been compromised
  2 = Key is superseded
  3 = Key is no longer used
  Q = Cancel
Your decision? 0
Enter an optional description; end it with an empty line:
>
Reason for revocation: No reason specified

J'exécute la commande revkey et je choisi l'option 0 (aucune raison spécifique)
Saisir une description optionnelle

(No description given)
Is this okay? (y/N) y

Valider

You need a passphrase to unlock the secret key for
user: "Jean Michel A Peu Près <jm@apeupres.fr>"
2048-bit RSA key, ID 0D6FE738, created 2015-09-11

Saisir la phrase de passe de la clé privée.

gpg: gpg-agent is not available in this session

pub  2048R/0D6FE738  created: 2015-09-11  expires: never       usage: SC
                     trust: ultimate      validity: ultimate
This key was revoked on 2015-09-11 by RSA key 0D6FE738 Jean Michel A Peu Près <jm@apeupres.fr>
sub  2048R/1C51C149  created: 2015-09-11  revoked: 2015-09-11  usage: E
sub  2048R/219FE958  created: 2015-09-11  expires: never       usage: S
[ultimate] (1). Jean Michel A Peu Près <jm@apeupres.fr>

gpg>

L'indication revoked apparait bien sur la ligne de ma sous-clé.

Une fois les modifications terminées, quitter le mode interactif en sauvegardant.

gpg> save

Pour annuler les modifications

gpg> quit

Ne pas sauvegarder les modifications sinon vous allez révoquer la sous-clé et on ne pourra plus l'utiliser par la suite.

Etiquettes: 

Créer le certificat de révocation de la clé maitresse

En effet, les clés et sous-clés ne doivent jamais être supprimées mais révoquées.
Cela permet de continuer à déchiffrer les anciens documents et vérifier les anciennes signatures.
La révocation se fait via le mode interactif et la commande revkey
Mais pour cela, il faut obligatoirement disposer de la paire de clé maitresse et de la phrase de passe.

Attention En cas de perte de la clé maitresse ou la perte de la phrase de passe, il n'est plus possible de faire quoi que ce soit, il est donc impératif de créer le certificat de révocation de notre clé maitresse afin de la révoquer et pour pouvoir en créer une nouvelle. C'est une question de sécurité nationnale ;-)

# gpg --output revoke.asc --gen-revoke 0D6FE738

sec  2048R/0D6FE738 2015-09-11 Jean Michel A Peu Près <jm@apeupres.fr>

Create a revocation certificate for this key? (y/N) y
Please select the reason for the revocation:
  0 = No reason specified
  1 = Key has been compromised
  2 = Key is superseded
  3 = Key is no longer used
  Q = Cancel
(Probably you want to select 1 here)
Your decision? 0

Choisir le motif de la révocation

Enter an optional description; end it with an empty line:
>

Saisir une description optionnelle

Reason for revocation: No reason specified
(No description given)
Is this okay? (y/N) y

Valider avec y pour YES

You need a passphrase to unlock the secret key for
user: "Jean Michel A Peu Près <jm@apeupres.fr>"
2048-bit RSA key, ID 0D6FE738, created 2015-09-11

Saisir la phrase de passe

gpg: gpg-agent is not available in this session
ASCII armored output forced.
Revocation certificate created.

Please move it to a medium which you can hide away; if Mallory gets
access to this certificate he can use it to make your key unusable.
It is smart to print this certificate and store it away, just in case
your media become unreadable.  But have some caution:  The print system of
your machine might store the data and make it available to others!

Attention Ce certificat de révocation doit être stocké en lieu sûr et surtout pas avec la clé maitresse.

En cas de guerre nucléaire ;-) pour révoquer la clé maitresse:

# gpg --import revoke.asc

Attention Aucune confirmation demandée. La clé maitresse est aussitôt révoquée.

Etiquettes: 

Exporter (sauvegarder) les clés dans des fichiers

# gpg --armor --export 0D6FE738 > clepub.asc
# gpg --armor --export-secret-keys 0D6FE738 > clesec.asc
# gpg --armor --export-secret-subkeys 0D6FE738 > subcle.asc
  1. Les clés et sous-clés publiques sont exportées dans le fichier clepub.asc
  2. La clé privée maitresse est exportée dans le fichier clesec.asc
  3. Les sous-clés privées sont exportées dans le fichier subcle.asc

Attention Seul le fichier clepub.asc contenant la clé publique peut être communiqué.

Pour éviter toute erreur de manipulation, sauvegarder également le dossier complet ~/.gnupg.

Info Enregistrer ces trois fichiers, ainsi que le fichier contenant la clé de révocation de la clé maitresse (revoke.asc) dans une archive TAR.
Chiffrer le fichier archive TAR avec la commande openssl (on est quand même jamais trop prudent)

# openssl enc -aes256 -in monFichier.tar -out monFichier.tar.aes256

Supprimer les 4 fichiers .asc ainsi que l'archive TAR. Le fichier clepub.asc peut-être conservé.
Conserver uniquement le fichier chiffré et l'enfermer à double tour dans un coffre fort sur Neptune.
Sans blague, il ne faut surtout pas le perdre.

Etiquettes: 

Supprimer la clé privée maitresse du trousseau

Pourquoi supprimer (ou plutôt enlever) la clé privée maitresse de notre trousseau ?
Pour plus de sécurité.

Nous n'avons pas besoin de la clé privée maitresse pour signer et déchiffrer des documents.
Seules les sous-clés privées sont nécessaires.

Dans le cas où vous ne souhaitez pas faire d'autres opérations nécessitant la clé privée maitresse (signatures de clés publiques, ajout de sous-clés, révocation de sous-clés etc etc...), autant la supprimer du trousseau et la conserver à l'abris des regards indiscrets.

Attention Attention, avant de procéder à la suppression de la clé privée du trousseau, sauvegarder toutes les clés dans des fichiers comme indiqué ici Exporter (sauvegarder) les clés dans des fichiers

On affiche nos clés privées.

# gpg --list-secret-keys
/root/.gnupg/secring.gpg
------------------------
sec   2048R/0D6FE738 2015-09-11
uid                  Jean Michel A Peu Près <jm@apeupres.fr>
ssb   2048R/1C51C149 2015-09-11
ssb   2048R/219FE958 2015-09-11

Nous avons bien dans notre trousseau un clé privée maitresse 0D6FE738 et deux sous-clés privées 1C51C149 & 219FE958.
On supprime notre clé privée maitresse.

# gpg --delete-secret-keys 0D6FE738
gpg (GnuPG) 1.4.16; 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.

sec  2048R/0D6FE738 2015-09-11 Jean Michel A Peu Près <jm@apeupres.fr>

Delete this key from the keyring? (y/N) y
This is a secret key! - really delete? (y/N) y

On répond "y" aux deux questions.

On affiche à nouveau nos clés privées

# gpg --list-secret-keys

La commande ne retourne plus rien.
A ce stade, nous ne pouvons plus rien faire (ni signer, ni déchiffrer des documents) puisqu'en supprimant la clé privée maitresse, toutes les sous-clés privées ont été également supprimées.
Nous allons donc importer uniquement nos sous-clés privées (vous les avez normalement sauvegardées ;-).

# gpg --import subcle.asc
gpg: key 0D6FE738: secret key imported
gpg: key 0D6FE738: "Jean Michel A Peu Près <jm@apeupres.fr>" not changed
gpg: Total number processed: 1
gpg:              unchanged: 1
gpg:       secret keys read: 1
gpg:   secret keys imported: 1

La commande nous indique que la clé privée a bien été importée.
On vérifie en affichant la liste des clés privées.

# gpg --list-secret-keys
/root/.gnupg/secring.gpg
------------------------
sec#  2048R/0D6FE738 2015-09-11
uid                  Jean Michel A Peu Près <jm@apeupres.fr>
ssb   2048R/1C51C149 2015-09-11
ssb   2048R/219FE958 2015-09-11

Le symbole dièse "#" à coté de "sec" nous indique que la clé privée maitresse est manquante mais que nous avons bien les deux sous-clés privées (ssb).

Si, pour une raison x vous avez besoin de réimporter dans votre trousseau votre clé privée maitresse, procéder de cette manière.

Ouvrer votre coffre-fort et récupérer la sauvegarde de vos clés (Elles sont censées être stockées dans un lieu sûr).
Supprimer les sous-clés privées.

# gpg --delete-secret-keys 0D6FE738
gpg (GnuPG) 1.4.16; 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.

sec  2048R/0D6FE738 2015-09-10 Jean Michel A Peu Près <jm@apeupres.fr>

Delete this key from the keyring? (y/N) y
This is a secret key! - really delete? (y/N) y

Confirmer la suppression.
Vérifier la liste des clés privées.

# gpg --list-secret-keys

Notre trousseau ne contient plus de clés et sous-clés privées.
On importe notre clé privée maitresse (qui contient également les sous-clé privées).

# gpg --import clesec.asc
gpg: key 0D6FE738: secret key imported
gpg: key 0D6FE738: "Jean Michel A Peu Près <jm@apeupres.fr>" not changed
gpg: Total number processed: 1
gpg:              unchanged: 1
gpg:       secret keys read: 1
gpg:   secret keys imported: 1

On affiche nos clés privées importées.

# gpg --list-secret-keys
/root/.gnupg/secring.gpg
------------------------
sec   2048R/0D6FE738 2015-09-11
uid                  Jean Michel A Peu Près <jm@apeupres.fr>
ssb   2048R/1C51C149 2015-09-11
ssb   2048R/219FE958 2015-09-11

Le symbole "#" à coté de "sec" a disparu.
Notre clé privée maitresse a bien été restaurée.

Etiquettes: 

Partager sa clé publique

Plusieurs méthodes sont disponibles pour partager sa clé publique.

  1. La joindre à chaque message envoyé (en pièce jointe d'un mail - clepub.asc).
  2. La mettre à disposition sur un serveur HTTP (le fichier clepub.asc)
  3. La publier sur un serveur de clé.

Pour la troisième méthode

# gpg --send-keys 0D6FE738
gpg: sending key CEA84BBA to hkp server keys.gnupg.net
Etiquettes: 

Importer la clé publique d'un utilisateur

Si vous avez sa clé publique dans un fichier

# gpg --import cle_publique_user_a.asc

En effectuant une recherche sur un serveur de clé

Par exemple, pour communiquer de manière chiffrée avec le président des Etats-Unis (trop la classe)

# gpg --fingerprint --search-keys Barack Obama
gpg: searching for "Barack Obama" from hkp server keys.gnupg.net
(1)     Barack Obama <barack.obama@whitehouse.gov>
          2048 bit RSA key CF4C3F70443ED0C5C3EE47555F31A132F752764E, created: 2015-01-02
(2)     barack obama (hej) <hejhejhej@hotmail.com>
          2048 bit RSA key FC54600AB3CB8A408005DCEE9001C823CB3D68F7, created: 2014-10-09
(3)     Barack Hussein Obama <president@whitehouse.gov>
          2048 bit RSA key 4AC1999F0BA293E8960AF2DA428C3085AF19CFE9, created: 2014-05-25, expires: 2018-05-25
(4)     Barack Obama (Barack Obama) <xxgiricsxx@gmail.com>
          1024 bit RSA key 03387652B395C4EC9DDA6AAFC9086C33FAE0BD4A, created: 2014-03-12
(5)     Barack Hussein Obama (PoC) <presidente@casabranca.gov>
          1024 bit RSA key 080C65142395677B22533461601F1B3201206B11, created: 2014-03-12 (revoked)
(6)     Barack Obama (Si quieres pasar un buen rato llamma al timbre de la cas
          3072 bit DSA key 06FE8A6A00EF1482C7AF545A06601E108440BE33, created: 2014-01-10, expires: 2014-01-11 (expired)
(7)     Barack Obama <mmmyom@tormail.org>
          2048 bit RSA key 09D7F58194D51A08F0DC8C6D0B998F9E9C8EFF37, created: 2013-05-28, expires: 2017-05-28
(8)     Barack Obama (Pruba SAD) <shus_presi_EEUU@yopmail.com>
          1024 bit RSA key 128F925760B14B1EBE7DFCD35F25557DE7D21FF0, created: 2012-10-10
(9)     barack obama <bjjbb@ufl.edu>
          2048 bit RSA key 099A86AA0E3383D0396A59E457435C9EE35A5D9F, created: 2011-11-10
(10)    Barack Obama <baracko@whitehouse.com>
          2048 bit RSA key 4E984FCDD33CC9F11B2E774FB9AA7F50D3EF826C, created: 2011-10-20
(11)    Barack Hussein Obama (PoC) <presidente@casabranca.gov>
          1024 bit DSA key DFC2235748027DE8897FF893A69404F176F5FE21, created: 2010-04-07, expires: 2010-04-14 (expired)
Keys 1-11 of 12 for "Barack Obama".  Enter number(s), N)ext, or Q)uit >

Choisir la clé à importer.
L'option --fingerprint permet d'afficher l'empreinte de la clé et de la vérifier si celle-ci nous a été communiquée par le destinataire lui-même. Deux précautions valent mieux qu'une.

Je choisi d'importer la clé (1) - Je valide en appuyant sur Entrée

gpg: requesting key F752764E from hkp server keys.gnupg.net
gpg: key F752764E: public key "Barack Obama <barack.obama@whitehouse.gov>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

Quand on liste les clés

# gpg --list-keys
/root/.gnupg/pubring.gpg
------------------------
pub   2048R/0D6FE738 2015-09-11
uid                  Jean Michel A Peu Près <jm@apeupres.fr>
sub   2048R/1C51C149 2015-09-11
sub   2048R/219FE958 2015-09-11

...

pub   2048R/F752764E 2015-01-02
uid                  Barack Obama <barack.obama@whitehouse.gov>
sub   2048R/C4CDB034 2015-01-02

On voit que la clé F752764E a bien été importée.
Dorénavant, je suis en mesure d'envoyer des messages chiffrés au président des Etats-Unis Barack Obama (whaoo).

Etiquettes: 

Signatures et chiffrements

A ce stade, nous sommes en mesure de signer et chiffrer tous les documents que nous souhaitons.

Alors, suivez le guide ...

Etiquettes: 

Signatures

Pour info La signature d'un message exige la saisie de la phrase de passe de la clé privée à chaque fois.

Rappel des différentes générations de signatures

"message" correspond à un fichier texte contenant le message à signer.

# cat message
Ceci est un message signé.

# gpg --sign message

Un nouveau fichier message.gpg est généré contenant le message et la signature au format binaire.
Pour lire le contenu du message, il faut obligatoirement utiliser gpg avec l'option --decrypt.
En effet, le message n'est pas chiffré, il est seulement signé, mais étant au format binaire, seule l'option --decrypt est capable de vérifier la signature et d'afficher le message en clair.

# gpg --clearsign message

Un nouveau fichier message.asc est généré contenant le message et la signature au format ASCII.

# gpg --detach-sign message

Un nouveau fichier message.sig est généré contenant uniquement la signature au format binaire.

#  gpg --detach-sign --armor message

Un nouveau fichier message.asc est généré contenant uniquement la signature au format ASCII.

Pour modifier le nom du fichier généré, il faut utiliser l'option -o nomDuFichier (ou --output).

# gpg --detach-sign --armor -o signature.asc message

Il est possible de signer un message sans passer par l'intermédiare de fichiers (entrées/sorties)

# echo "Ceci est un message signé." | gpg --clearsign

You need a passphrase to unlock the secret key for
user: "Jean Michel A Peu Près <jm@apeupres.fr>"
2048-bit RSA key, ID 219FE958, created 2015-09-11 (main key ID 0D6FE738)

gpg: gpg-agent is not available in this session
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Ceci est un message signé.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iQEcBAEBAgAGBQJV9enkAAoJED/atMwhn+lYiz8H+wc1peA+zFNh0pI0Xl9LaCng
2BPlhod4MYO7yAJTKh76MHx1pXZAjPRZdvQf7WockS9gyHC2/h3MGcFMJZ4LAYdQ
16LfwCC2ip08FsiWuIjnAdC+qEcvLVM6MkH5iiKVgLRnwn7b7oqp9M/mwQGb8JmA
gxRwMTDZxxSBHjjIKPtbOzzN/Wp308WQiI1G0d/uM+GE8JmOQcGAz2pNS/i01KbR
7ft0RUGOtdlnZOyBpuTl90CEkEhFjICvoyB3EEoXAR+DorxhgRUGeGliZzgoKSeU
cWsGlMaigvofC67xSaWacIpk/GOv0hZUPMR9EqmKuCDqSHpcrnWX3W2JWYqwkZM=
=XBKV
-----END PGP SIGNATURE-----

Copier/coller le message signé dans un mail au format texte (tout le contenu de -----BEGIN PGP SIGNED MESSAGE----- jusqu'à -----END PGP SIGNATURE-----).

Pour info Pour envoyer la sortie vers un fichier, utiliser l'option -o monFichier (--output).

Exemple d'un fichier signé puis altéré volontairement afin de simuler un piratage.

On signe le fichier message

# gpg --armor --detach-sign message

On vérifie la signature du fichier message.
L'option --verify prend en premier paramètre le nom du fichier contenant la signature (si la signature est dans un fichier à part) et le nom du fichier signé en second paramètre.

# gpg --verify message.asc message
gpg: Signature made Sun 13 Sep 2015 11:40:49 PM CEST using RSA key ID 219FE958
gpg: Good signature from "Jean Michel A Peu Près <jm@apeupres.fr>"

La signature est correcte.
On altère le fichier message pour simuler un piratage du fichier.

# echo "" >> message

On vérifie à nouveau la signature du fichier.

# gpg --verify message.asc message
gpg: Signature made Wed 16 Sep 2015 07:14:28 PM CEST using RSA key ID 219FE958
gpg: BAD signature from "Jean Michel A Peu Près <jm@apeupres.fr>"

Le résultat nous indique que la signature est incorrecte.
Nous avons la preuve que le fichier d'origine a été altéré.

Franchement, c'est quand même pas si compliqué de signer un fichier et c'est quand même plus sécurisant.

Et si maintenant on le chiffrait, ce fichier ...

Etiquettes: 

Chiffrements

Chiffrer un document n'est pas plus compliqué que de le signer.
Il faut juste avoir la clé publique du ou des destinataires du fichier. (ou avec sa propre clé publique si vous voulez seulement chiffrer des fichiers personnels)

Première question: A qui puis-je envoyer des messages/fichiers chiffrés ?
Pour le savoir, il faut lister toutes les clés publiques de notre trousseau.

# gpg --list-public-keys
/root/.gnupg/pubring.gpg
------------------------
pub   2048R/0D6FE738 2015-09-11
uid                  Jean Michel A Peu Près <jm@apeupres.fr>
sub   2048R/1C51C149 2015-09-11
sub   2048R/219FE958 2015-09-11

pub   2048R/F752764E 2015-01-02
uid                  Barack Obama <barack.obama@whitehouse.gov>
sub   2048R/C4CDB034 2015-01-02

Je vois que je peux chiffrer des documents pour moi-même et pour Barack Obama (oh la vache, j'avais oublié que j'avais importé sa clé publique).

Allez, c'est parti, envoyons un message chiffré à Barack.

# echo "Hello Barack, how are you ?" | gpg --encrypt --armor --recipient barack.obama@whitehouse.gov
gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   1  trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: depth: 1  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 1f, 0u
-----BEGIN PGP MESSAGE-----
Version: GnuPG v1

hQEMAxK9BLnEzbA0AQf8CLkg04MMJMxCrUiwHzcgaqL94gavPLBP/GIQP5bnxJFE
ujBziWFTwb9OxyKv6MWs9cegB1/qNKnYdgIWpDwjMWv+G/8wJfDqif002rEYPE+B
rRsnTXBQM+7QHXwATGpxudP85cY+WGp+cEb6PjkGvDzcBuTdlj2eQ8hm01TOKlpz
CDvbgZ58v4vz2W229fHDOD1sZ8WhYv5Q9+vX1mcTODC2terKtE+ekRrpfOjUE0Kf
U+tdUIqMrop63oWJmQgclejevfzmLGvhSaZPlZy8HlWUNfgPCxspJIu4+r89EJST
364F2n/cMig5f+o1dYWHRO+aY6OapatE/zxEul33G9JXAWqnqZQ8XsA9p3H0bGe3
vAFAAKvG3C0RUgvbwJaG2yzX5GYbunyek/f/B7LdugM+r+D8qo+3Ts61ZvjkunhO
kv34a7xaYuA4ckA3VZZgJ9/DQgoqBHO7
=QP5y
-----END PGP MESSAGE-----

Pour chiffrer un message, il suffit d'utiliser l'option --encrypt et l'option --recipient suivie de l'adresse mail du destinataire. (il est possible d'indiquer plusieurs fois l'option --recipient si il y a plusieurs destinataires)

Pour info Si vous n'avez pas signé la clé publique de chiffrement du destinataire, un message vous demandera si vous souhaitez vraiment utiliser la clé correspondante à l'adresse mail indiquée.
Pour signer une clé, il suffit de l'éditer gpg --edit-key xxxxxx, une fois dans le mode interactif de gpg, sélectionner la clé servant au chiffrement (drapeau E) avec la commande key suivi de l'index de la clé et la signer avec la commande sign. Tout est indiqué ici "Editer une clé".

Il reste à copier tout le contenu du message chiffré (de -----BEGIN PGP MESSAGE----- jusqu'à -----END PGP MESSAGE-----) et le coller dans un mail au format texte.

L'option -o (--output) peut être utilisée pour enregistrer le contenu du message chiffré dans un fichier.
Sans l'option --armor, le contenu sera chiffré au format binaire.

Pour chiffrer un fichier, il suffit d'indiquer son nom

# gpg --encrypt --armor --recipient barack.obama@whitehouse.gov message

Avec l'option --armor, un fichier .asc est généré (ASCII).
Sans l'option --armor, un fichier .gpg est généré (binaire).

Pour info En combinant les options de signatures, il est possible de signer et chiffrer un document.

# echo "Hello Barack, how are you ?" | gpg --sign --encrypt --armor --recipient barack.obama@whitehouse.gov

You need a passphrase to unlock the secret key for
user: "Jean Michel A Peu Près <jm@apeupres.fr>"
2048-bit RSA key, ID 219FE958, created 2015-09-11 (main key ID 0D6FE738)

gpg: gpg-agent is not available in this session
-----BEGIN PGP MESSAGE-----
Version: GnuPG v1

hQEMAxK9BLnEzbA0AQf8CFu2Jkc3wXtpg/H8eJ+jH5mf/pcm2NDUV17q8D7zohTf
sr7lsYW6IqWD5WtTd0hA/LVPHEl6UI4uXdzskNOdam+AJUUYqRDhXIos4mWof9Q/
e4hM1mz01tMSCIqmvIHvmYTRQOqu80wv2az7WJk7D7uxqVRfktA4dumVGwn3aIIc
RQ8chuHWIEUIteUJixsiYUIZj8jlQsvsZ9JMQmA3ugf3agOpNKcEwVyxhFhHw77q
oyogcVwfsI5mbKX6oZH93tsHG4gjUn/iiRXoWOsQuxzoqc7q90ndZHXRbQlsRZKw
qw4t9lsUg/NVsMGDDBxO4GpKgoQzoj27uqigV01q69LAyAFiR2YdUVtbqnNQ/HOJ
EcplnhCSmQNiHth5MY2yYFs9C7v1+HxItbUkufLIqv1qSHev6WmTaK9Ro+RkNVDQ
xwYwmyOZEcLpONRF6qWLkKk+PpctiSjSCd6lg7EvvEnPh9Lkz+n6fDgOIVCilKUX
IXn1l+JZX4e9Flan7KonyC7GEMJAUFedzxxVAKgcL0omFKqQq7iqRcBwXeTEZXd3
s1qYv1aQMN90sWfBamI3i9T8rtMyVABjEb+Mj1Qdp/vf+uNmuo14WZOyJT8zklnH
M+o+eG48dOSeg52FPUSw0L0BucqdXRu9llNWUiXYz2UnBe3KURMnpyMYrl7p2swm
AmAZTJ9zYfEAZkSzkArrdq2DcWYYW4CRtCLGojjxyDkN9AfZ79oDOl2qyy7xOlJ5
VY/HSX/gfMgYRKXR8do+fSW3cbm8u5j7cO2IdDzsahxZGdpPClFN3Mwjy6Zr59M+
tqlxKE+6Cyc1a44CeOUp6j2i01zqgDqG5Ru3CiPWTjk7GPP56/ELGdaz
=UKz1
-----END PGP MESSAGE-----

Ce message étant signé et chiffré, il est ultra sécurisé.
Difficle de faire mieux.


Pour info Vous avez un fichier contenant une multitude de "utilisateurs/mots de passe".
Chiffrer le avec GPG et supprimer le fichier d'origine.
Et quand vous avez besoin d'un mot de passe, déchiffrer le fichier avec l'option --decrypt et votre phrase de passe.

# cat motsdepasse
aaa fghdfkgjhdfgjkhdfgk
bbb mljfklsjgksjghskgjh
ccc sjhgjhkfgjkfhgjkfhg
# gpg --encrypt --recipient jm@apeupres.fr motsdepasse
# rm motsdepasse
# gpg --decrypt motsdepasse.gpg

You need a passphrase to unlock the secret key for
user: "Jean Michel A Peu Près <jm@apeupres.fr>"
2048-bit RSA key, ID 1C51C149, created 2015-09-11 (main key ID 0D6FE738)

gpg: gpg-agent is not available in this session
gpg: encrypted with 2048-bit RSA key, ID 1C51C149, created 2015-09-11
      "Jean Michel A Peu Près <jm@apeupres.fr>"
aaa fghdfkgjhdfgjkhdfgk
bbb mljfklsjgksjghskgjh
ccc sjhgjhkfgjkfhgjkfhg

Vous remarquerez que le fichier est chiffré avec ma propre clé publique, et que pour le déchiffrer j'ai besoin de ma clé privée et de ma phrase de passe.

Etiquettes: