Les commandes pratiques de GPG
— outils, informatique — ~10mn de lecture
GPG, ça a l’air vachement compliqué de prime abord, alors qu’en vrai, y’a juste 2-3 commandes à connaitre et ça roule (ma poule).
Du coup, on va commencer par voir comment ça marche le chiffrement asymétrique parce que ça fait pas de mal, puis ensuite les quelques commandes utiles dans la vie de tous les jours, avec quelques commandes plus là en rappel, que ça fait toujours du bien d’avoir sous le coude (en vrai c’est juste que je les oublie à chaque fois) et enfin, un petit bout de la conf de Mutt lié à GPG parce que j’ai que ça sous la main, et enfin des articles sympas sur le sujet !
Le chiffrement kékécé ?
Déjà, on va commencer par un point vocabulaire :
- Chiffrer = rendre un message lisible en un message pas lisible, avec l’aide d’une clé
- Déchiffrer = rendre un message pas lisible en un message lisible, avec l’aide de la clé
- Décrypter = rendre un message pas lisible en un message lisible, sans l’aide de la clé (c’est du “crackage”, si vous voulez)
- Crypter = caca boudin (on peut pas chiffrer un message sans clé)
J’admets que c’est déroutant, parce que leurs équivalents anglophones sont encrypt/decrypt/decrypt/rien-du-tout-parce-que-ça-n’existe-pas.
En vrai, l’Académie Française dit qu’on peut utiliser crypter pour dire chiffrer si on utilise alors décrypter pour dire déchiffrer, sauf que j’aime pas l’Académie parce que c’est que des vieux qui dictent des règles à la con 1.
Et donc du coup, il existe 2 types de chiffrement : symétrique et asymétrique.
Le chiffrement symétrique
On utilise la même clé pour chiffrer et déchiffrer. Le fameux code de César utilise ça : on décale les lettres de l’alphabet de X rangs pour chiffrer, et du coup pour déchiffrer, on décale de X dans l’autre sens.
Mais c’est pas vraiment le propos de ce billet, donc on va couper court, parce que le chiffrement qui nous intéresse, c’est le chiffrement asymétrique.
Le chiffrement asymétrique
Une clé pour chiffrer, et une autre clé (liée mathématiquement à la première) pour déchiffrer. Sauf qu’avec ce système, le chiffrement n’est pas la seule chose possible, il y a aussi la signature. Mais avant, parlons un peu de clé publique et privée, la base du chiffrement asymétrique.
Pour communiquer en utilisant du chiffrement asymétrique, il faut d’abord générer une paire de clés : la clé publique et la clé privée.
Leurs noms sont assez parlants : la clé privée, on la garde pour soit, et la clé publique, on la diffuse à tout le monde 2.
Mais du coup, comment on chiffre ? Clé privée ou clé publique ?
Mettons que 2 personnes, qu’on va appeler Alice et Bob (par PUR hasard), veulent discuter. Pour simplifier, on va appeler la clé publique de Alice PuA (Publique Alice) et sa clé privée PrA (Privée Alice). Idem pour Bob, PuB et PrB.
- Alice va prendre PuB, et va chiffrer son message avec.
- Puisque PuB et PrB sont liées, seul le détenteur de PrB 3 va pouvoir déchiffrer le message d’Alice
- Bob déchiffre donc le message d’Alice avec PrB.
- Le tour est joué.
Donc en version pratique, pour chiffrer, on prend la clé publique de la personne avec qui on veut parler. Et pour déchiffrer, on utilise simplement sa propre clé privée.
Mais si vous voulez le voir en vidéo, je vous propose celle-ci où la cryptographie asymétrique est expliquée à 3mn43.
Les commandes pour GPG
GPG c’est un outil pour faire du chiffrement asymétrique. Il permet de générer une paire de clé, et de garder les clés publiques d’autres personnes.
Création d’une paire de clés
$ gpg --full-gen-key
# Désolé, mon système est en anglais, donc les indications sont en anglais
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 # Si on sait pas ce qu'on fait, c'est toujours bien de prendre la valeur par défaut
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096 # 2048 c'est bien, mais autant prendre 4096, ça fait pas de mal
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) # La c'est vous qui choisissez. Le mieux c'est de devoir la renouveler au cas où il vous arrive quelque chose.
Key does not expire at all / Key expires at La Date Que Vous Avez Choisi
Is this correct? (y/N) y
GnuPG needs to construct a user ID to identify your key.
Real name: # L'identité que vous souhaitez avoir pour cette clé (votre nom civil, votre pseudo, peut importe)
Email address: # L'adresse mail avec laquelle vous allez discuter (à savoir qu'on peut en avoir plusieurs, on verra ça plus tard)
Comment: # Si jamais vous avez un commentaire sur votre clé pour vous aider à vous repérer
You selected this USER-ID:
"Real name (Comment) <Email adress>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o # Normallement tout est correct !
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.
# La c'est la partie fun où il faut taper sur le clavier, faire plein de clics de souris partout, utiliser à fond les disques durs
# Ensuite, on vous demandera une phrase de passe pour sécuriser la clé : vous feriez mieux d'en prendre une très bonne
# Et voilà ! C'est fini ! Vous avez une jolie paire de clés !
Lister les clés du trousseau
Pour voir les clés qu’on a (= nos clés + les clés publiques d’autres personnes qu’on aura importé), c’est :
$ gpg --list-keys
$ gpg -k # C'est pareil
# [...]
pub rsa4096 2018-03-28 [SC]
FA4AFA522E6B2566E3417E0012075417C35C6A0C
uid [ultimate] Doshirae <doshirae@doshi.re>
uid [ultimate] Doshirae <doshirae@lilo.org> # J'vous avais dit qu'on pouvait avoir 2 emails associés
sub rsa4096 2018-03-28 [E]
# [...]
Et pour voir uniquement les nôtres
$ gpg --list-secret-keys # Puisque si tout va bien, les seules clés privées qu'on a sont les nôtres
$ gpg -K # C'est pareil
Importer/Exporter des clés
Un truc bien pratique qu’on aime faire, c’est exporter/importer des clés. Il faut savoir qu’il y a deux manières de le faire.
- Import/export sous forme binaire
- Import/export sous forme de texte ASCII (exemple : ma clé ou la clé de wxcafe)
Juste avant de commencer : dans les commandes suivantes, <identifiant> fait référence à possiblement 2 choses
- soit l’email associé à la clé, mais un email peut être associé à plusieurs clés donc attention
- soit l’empreinte de la clé, que vous trouverez avec
gpg --list-keys
(dans l’exemple plus haut, c’estFA4AFA522E6B2566E3417E0012075417C35C6A0C
)
Pour le binaire :
# Import
$ gpg --import <fichier>
# Export
$ gpg --export <identifiant> --output <fichier>
Pour le texte ASCII, il suffit de rajouter l’option -a
(ou ses alias --armour
ou --armor
) !
# Import
$ gpg -a --import <fichier>
# Export
$ gpg -a --export <identifiant> --output <fichier>
Chiffrer/Déchiffrer des messages
Bon, fallait bien y arriver un jour, on va voir comment chiffrer et déchiffrer des messages, comme des vrais agents secrets !
# Chiffrer
$ gpg [--ouput <fichier-sortie>] --encrypt -r <identifiant> <fichier-entrée>
Encore une fois, si vous voulez que la sortie soit en ASCII plutôt qu’en binaire, pensez à -a
. Et si vous m’avez suivi, <identifiant> c’est l’identifiant de la clé de votre destinataire.
Cette commande va vous filer un fichier nommé <fichier>.asc
(à moins que vous n’ayez précisé un fichier avec --output
). Pour pouvoir le déchiffrer, il suffit d’utiliser :
$ gpg --decrypt -r <identifiant> <fichier>
Mais honnêtement, ces commandes sont juste là en tant que culture générale, vous allez jamais vous en servir, à part si ça vous fait marrer de chiffrer/déchiffrer à la main (mais du coup il va vous falloir un⋅e camarade que ça fait kiffer aussi 4).
Les commandes pas utiles tout le temps, mais c’est bien de s’en rappeller, ça peut être utile
Cette section sera probablement mise à jour au fur et à mesure que je trouve des trucs
Signer un fichier
$ gpg --sign <fichier>
Ouais c’est pas plus compliqué que ça
Changer son adresse mail associée
Mettons qu’on a une clé “Doshirae (Commentaire à la con) <doshirae@doshi.re>”. Sauf qu’on a changé d’adresse mail, maintenant c’est contact@doshi.re.
Pour la changer il va falloir
- Créer un nouvel uid
- En faire l’uid principal
- Supprimer l’ancien uid
Et ça se fait comme ça
(note avant de se lancer : quand GPG vous affiche vos clés, si y’a un “ . ” à coté du numéro, ça veut dire que c’est l’uid principal et si y’a un “ * ” ça veut dire qu’il est sélectionné)
$ gpg --edit-key doshirae@doshi.re
gpg> adduid
Real Name: Doshirae
Email address: contact@doshi.re
Comment: Commentaire à la con
You selected this USER-ID:
"Doshirae (Commentaire à la con) <contact@doshi.re>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
...
[ultimate] (1). Doshirae (Commentaire à la con) <doshirae@doshi.re>
[ unknown] (2) Doshirae (Commentaire à la con) <contact@doshi.re>
gpg> uid 2 # pour selectionner notre uid
[ultimate] (1). Doshirae (Commentaire à la con) <doshirae@doshi.re>
[ unknown] (2)* Doshirae (Commentaire à la con) <contact@doshi.re>
gpg> trust 5 # on l'a créé donc on lui fait complètement confiance
gpg> primary # On en fait l'uid primaire
[ultimate] (1) Doshirae (Commentaire à la con) <doshirae@doshi.re>
[ unknown] (2)* Doshirae (Commentaire à la con) <contact@doshi.re>
gpg> uid 2 # on déselectionne notre uid
[ultimate] (1) Doshirae (Commentaire à la con) <doshirae@doshi.re>
[ unknown] (2). Doshirae (Commentaire à la con) <contact@doshi.re>
gpg> uid 1 # on selectionne notre ancien uid (pour le supprimer)
[ultimate] (1)* Doshirae (Commentaire à la con) <doshirae@doshi.re>
[ unknown] (2). Doshirae (Commentaire à la con) <contact@doshi.re>
gpg> deluid # ça supprime tous les uid selectionnés
[ unknown] (1). Doshirae (Commentaire à la con) <contact@doshi.re>
gpg> save # tant que vous faites pas ça, rien est enregistré sur le disque donc n'ayez crainte
Et voilà !
Le fameux bout de conf de Mutt
Ici, le pgp_sign_as est à remplacer par l’empreinte de votre clé (que vous savez comment trouver si vous êtes de bons lecteurs :D).
Et normalement c’est tout bon, ça marche comme sur des roulettes
set pgp_sign_as=0xFA4AFA522E6B2566E3417E0012075417C35C6A0C
set crypt_use_gpgme=yes
set crypt_replysign=yes
set crypt_replyencrypt=yes
set crypt_replysignencrypted=yes
set crypt_autosign=yes
set crypt_verify_sig=yes
set pgp_decode_command="gpg2 %?p?--passphrase- 0? --no-verbose --batch --output - %f"
set pgp_verify_command="gpg2 --no-verbose --batch --output - --verify %s %f"
set pgp_decrypt_command="gpg2 --passphrase- 0 --no-verbose --batch --output - %f"
set pgp_sign_command="gpg2 --no-verbose --batch --output - --passphrase- 0 --armor --detach-sign --textmode %?a?-u %a? %f"
set pgp_clearsign_command="gpg2 --no-verbose --batch --output - --passphrase- 0 --armor --textmode --clearsign %?a?-u %a? %f"
set pgp_encrypt_only_command="/usr/lib/mutt/pgpewrap gpg2 --batch --quiet --no-verbose --output - --encrypt --textmode --armor --always-trust --encrypt-to $pgp_sign_as -- -r %r -- %f"
set pgp_encrypt_sign_command="/usr/lib/mutt/pgpewrap gpg2 --passphrase- 0 --batch --quiet --no-verbose --textmode --output - --encrypt --sign %?a?-u %a? --armor --always-trust --encrypt-to $pgp_sign_as -- -r %r -- %f"
set pgp_import_command="gpg2 --no-verbose --import %f"
set pgp_export_command="gpg2 --no-verbose --export --armor %r"
set pgp_verify_key_command="gpg2 --no-verbose --batch --fingerprint --check-sigs %r"
set pgp_list_pubring_command="gpg2 --no-verbose --batch --with-colons --list-keys %r"
set pgp_list_secring_command="gpg2 --no-verbose --batch --with-colons --list-secret-keys %r"
set pgp_autosign=yes
set pgp_replyencrypt=yes
set pgp_replysign=yes
set pgp_timeout=1800
set pgp_good_sign="^gpgv?: Good signature from"
Quelques articles pour continuer
J’vous avoue que j’avais pas écrit les articles que je voulais partager, et que j’ai repris cet article un mois après le début de son écriture. Du coup les articles sont pas forcément ceux auxquels j’avais pensé au départ (mais c’est pas grave, ils sont vachement bien de toute manière)
https://open-freax.fr/tuto-mails-gpg/ (ça c’est moi ! Le seul dont je me souvenais.)
https://blog.eleven-labs.com/fr/openpgp-paire-clef-presque-parfaite-partie-1/ (Proposé par Darks)
http://www.guiguishow.info/2014/07/17/ma-premiere-vraie-cle-pgp/#toc-5108-gnrer-une-paire-de-cls (Proposé par Codeur Impulsif)
-
Un peu comme je suis en train de faire en figeant les sens des mots que j’ai listé là haut, mais au moins je suis pas vieux ↩
-
La mienne est ici par exemple. Soit on fait comme moi et on la diffuse à la main, soit on l’envoie sur un serveur de clés. Perso j’ai arrêté les serveurs de clés, parce que je suis un brank à gérer mes clés, donc j’ai plein de clés poubelles sur les serveurs et ça me saoule. ↩
-
D’où l’intérêt pour Bob de garder sa clé privée bien cachée ↩
-
Moi je suis partant si vous voulez ↩
Il n'y a pas de commentaire sur ce blog, donc si vous voulez réagir à cet article, n'hésitez pas à venir m'en parler sur le Fediverse, Twitter ou par mail. Des bisouxes !