Doshi's blog

Thème:

Les commandes pratiques de GPG

, — ~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 :

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.

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.

Juste avant de commencer : dans les commandes suivantes, <identifiant> fait référence à possiblement 2 choses

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

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)

  1. 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 

  2. 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. 

  3. D’où l’intérêt pour Bob de garder sa clé privée bien cachée 

  4. Moi je suis partant si vous voulez 


Il n'y a pas de commentaires sur ce blog, cependant, n'hésitez pas à me faire des remarques sur cet article (ou autre, d'ailleurs). Que ce soit via Mastodon, Twitter, XMPP ou encore par mail, je serai ravi de voir que des gens me lisent pour de vrai