Cette entrée est de nature essentiellement technique, pour annoncer que je me suis généré une nouvelle clé PGP. Mais j'en profite quand même pour expliquer au grand public de quoi il s'agit sous forme de vulgarisation rapide concernant la cryptographie à clé publique :
Explications sommaires pour les gens ne connaissant rien à la crypto :
PGP (Pretty Good Privacy
) est son
implémentation GPG (GNU
Privacy Guard
) est un standard de cryptographie à clé
publique (ou asymétrique
).
De quoi s'agit-il ? La forme la plus simple de la cryptographie est la cryptographie symétrique (=à clé secrète partagée). En cryptographie symétrique, si Alice veut envoyer un message secret à Bob, Alice et Bob doivent partager une clé secrète et connue d'eux seuls, servant à la fois au chiffrement et au déchiffrement.
(Cette clé
prend la forme d'une assez
longue chaîne binaire, typiquement quelque chose comme 256 bits, ou,
ce qui revient au même, 64 chiffres hexadécimaux, c'est-à-dire quelque
chose comme e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
,
qui doit impérativement avoir été tirée aléatoirement (ou
pseudo-aléatoirement de façon cryptographiquement correcte) pour que
la sécurité soit correcte — ce n'est pas du tout le cas de celle que
je viens de donner —, et c'est elle qui est fournie aux algorithmes de
chiffrement et de déchiffrement qui font le travail proprement dit.
En fait, normalement l'utilisateur ne la voit jamais vraiment, Alice
et Bob vont typiquement avoir uniquement affaire à
une passphrase servant à générer ou à
déverrouiller la clé selon les circonstances, et qui, elle, est
quelque chose de mémorisable par un humain, comme un mot de passe
assez long ou une suite de mots formant une phrase suffisamment longue
pour assurer le niveau de sécurité voulu. Peu importent ces détails,
ce que je cherche avant tout à dire est qu'en cryptographie
symétrique, le secret — passphrase ou clé — doit être partagé à
l'avance par les personnes qui souhaitent communiquer.)
Au contraire, en cryptographe à clé publique, Bob a deux clés, une clé publique connue de « tout le monde » et une clé privée ou secrète connue de lui seul. Si Alice veut envoyer un message chiffré à Bob, elle le chiffre avec la clé publique de Bob, ce qui produit un message que Bob seul est capable de déchiffrer avec sa clé privée. Et inversement, la cryptographie à clé publique permet aussi de faire de la signature, c'est-à-dire qu'Alice peut, en utilisant sa clé privée, produire un message n'ayant rien de secret dont tout le monde pourra vérifier, au moyen de la clé publique d'Alice, qu'elle en est bien l'émettrice. (Et bien sûr on peut combiner les deux : Alice peut envoyer à Bob un message chiffré par la clé publique de Bob et signé par la clé privée d'Alice, dont Bob pourra, avec sa clé privée à lui et la clé publique d'Alice, lire le contenu et vérifier que c'est bien Alice l'expéditrice.)
(Bon, tout ça est immensément simplifié et outre
qu'il existe toutes sortes d'algorithmes différents, je passe
énormément de subtilités sous silence. Je n'ai notamment pas expliqué
que, pour des raisons essentiellement d'efficacité, la cryptographie à
clé publique est utilisée pour chiffrer non pas le message lui-même
mais une clé de session
qui est elle-même utilisée pour
chiffrer le message avec un algorithme de cryptographie symétrique ;
et pareil, en signature, on ne signe pas le message lui-même mais une
empreinte calculée par
une fonction
de hachage. J'aurais aussi peut-être dû mentionner
le petit
miracle de la cryptographe à clé publique qu'est
le protocole
de Diffie-Hellman qui permet à Alice et Bob de communiquer de
façon sécurisée même sans partager de clé à l'avance et même
si toutes leurs communications sont espionnées par une tierce
personne malveillante ! et ce, sous la seule hypothèse que cette
personne (Ève) ne peut qu'écouter et pas modifier les communications
au passage, et pas, notamment, se faire passer pour Alice auprès de
Bob et pour Bob auprès d'Alice. Je devrais peut-être au moins dire
que la cryptographie à clé publique sert absolument partout : dès que
vous vous connectez à un site web en https
, c'est-à-dire
l'immense majorité des sites web de nos
jours, celui-ci faisant de la
résistance, la connexion est sécurisée par de la cryptographie à
clé publique — mais sous un standard qui diffère de PGP
dont je parle dans ce billet — essentiellement au moyen d'une clé
publique du site web contacté, et qui est elle-même signée par des
autorités censément de confiance sous forme d'un certificat
;
mais là non plus, je ne veux certainement pas entrer dans les
détails.)
L'avantage immense de la cryptographie à clé publique par rapport à la cryptographe symétrique est qu'on simplifie immensément le problème de la distribution des clés : on n'a pas besoin de créer, et de trouver comment partager de façon sûre, une clé secrète différente pour chaque paire de participants qui peut avoir envie de communiquer (une pour Alice et Bob, une pour Alice et Charlie, une pour Alice et David, une pour Bob et Charlie, une pour, etc.), mais seulement deux clés par participants, dont l'une n'a pas besoin d'être communiquée du tout (elle est privée et reste secrète) et l'autre n'a pas besoin d'être communiquée de façon secrète puisqu'elle est, justement, publique. Évidemment, il y a un prix à payer, notamment en termes de longueur des clés, de coût computationnel des opérations, mais je ne rentre pas là-dedans ; par contre il y a une question cruciale qui reste en suspens, c'est la question de l'identité (ou plutôt, de la confiance en l'identité) :
Si Alice veut envoyer un message secret à Bob (ou reçoit un message signé par Bob), elle va utiliser la clé publique de Bob, mais comment est-elle sûre que la clé publique qu'elle croit être celle de Bob est vraiment celle de Bob ?
Par exemple, si Bob est l'auteur d'un logiciel très célèbre (pensez, par exemple, au noyau Linux), et qu'Alice veut utiliser ce logiciel et être sûre qu'il s'agit bien du bon logiciel et pas d'une version malicieuse écrite par une personne malveillante se faisant passer pour Bob, il est utile que Bob signe le logiciel au moment de le mettre en ligne, et Alice pourra vérifier la signature et avoir confiance dans ce qu'elle utilise. Mais qu'est-ce qui assure que la signature vient bien de Bob et pas d'une personne malicieuse ? Il faut avoir confiance en la clé servant à la signature. Or ceci ne fait que repousser le problème (à ceci près qu'une clé est quelque chose de plus léger à contrôler, et change moins souvent, qu'un logiciel énorme dont il y a une nouvelle version tous les quelques jours).
Évidemment, si Alice a rencontré Bob en personne et que Bob lui a
donné cette clé en main propre, Alice peut être sûre que c'est la
bonne clé. Mais si Alice reçoit un mail de Bob, ou voit passer un
billet sur le blog de Bob qui dit coucou, je suis Bob et ceci est
ma clé publique
, comment peut-elle avoir confiance dans le fait
que ce message est bien de Bob et pas de quelqu'un qui cherche à se
faire passer pour Bob (dans le but de signer des documents en son nom
ou de recevoir des messages chiffrés à son intention) ? La signature
électronique est justement l'outil qui permet d'authentifier ce genre
de messages, mais pour identifier un message censé émaner de Bob qui
dit ceci est ma clé publique
, il faut la clé publique de Bob,
donc le problème est circulaire.
Une façon de résoudre ce problème de l'identité est que Bob
accompagne sa clé publique d'une ou plusieurs signatures, réalisées
avec des clés publiques de personnes tierces, qui, elles, ont vérifié
soigneusement l'identité de Bob et de sa clé, et qui
affirment cette clé précise est bien celle de la personne appelée
Bob
(bon, ceci soulève ensuite la question sociale de savoir ce
que cela signifie de vérifier soigneusement l'identité de quelqu'un,
et d'ailleurs ce qu'est l'identité, mais évitons d'entrer dans des
questions philosophiques à ce stade). Par exemple, si Alice a
confiance dans l'identité de la clé publique de Charlie et en
l'honnêteté de Charlie, et que Charlie a vérifié soigneusement la clé
publique de Bob et publié une signature l'associant à l'identité de
Bob, Alice peut faire confiance à cette signature de Charlie pour
savoir que Bob est vraiment Bob. Mais évidemment il faut des
hypothèses fausses, car après tout un faux Bob aurait pu faire signer
sa fausse clé par un faux Charlie, donc la signature n'a de valeur que
si Alice a confiance en l'identité et l'honnêteté de Charlie.
Il existe ensuite différents modèles
(la toile de
confiance proposée par PGP ou, au contraire, la
chaîne depuis une racine de confiance utilisée dans
le HTTPS sur le web) pour essayer d'établir la confiance
en l'identité à partir de telles signatures.
En pratique, le logiciel (libre) GPG, dont je vais dire du mal plus bas mais qui reste utile, permet à tout un chacun de se créer une paire de clés (publique+privée), de chiffrer un document avec la clé privée d'un autre, de vérifier des signatures y compris des signatures attestant l'identité du propriétaire d'une clé, et ce genre de choses. Le maniement en est néanmoins malcommode et, pour ce qui est de la confiance en l'identité, on doit en pratique de toute façon faire à un moment ou un autre un acte de foi plus ou moins large selon le compromis qu'on considère acceptable entre la sécurité et la commodité.
Le but de cette entrée est, donc, d'annoncer une nouvelle clé publique me concernant (signée, inter alia, par l'ancienne), de donner quelques raisons de penser qu'elle est bien de moi, et accessoirement de râler parce que montrer que je sais râler si bien est certainement une façon d'assurer mon identité.
Ma
clé précédente (0x0D9364260B2790DE
) avait été créée
le , et sa taille
(clé DSA
de 1024 bits +
clé ElGamal
de 1536 bits) ne permet plus de la considérer comme vraiment sûre, et
ça fait longtemps que je me disais qu'il fallait en générer une
nouvelle ; ce qui me bloquait surtout était l'aspect pénible de
ré-apprendre comment on génère une clé PGP et donc relire
la documentation de GnuPG qui est, disons-le franchement,
une abomination, et enfin, de convaincre des gens de signer la
nouvelle clé. Bref, je me suis sorti les doigts du c●l, et j'ai
généré une nouvelle clé (RSA de 3584 bits, cette fois,
parce que j'aime bien faire mon original).
La nouvelle
clé a pour empreinte 6AD5 2959 519B FFC6 FCDE A8A5 BE8D 3426
C06F FAE6
(rappelons qu'on désigne une clé par la fin de son
empreinte, donc 0xBE8D3426C06FFAE6
ou
même 0xC06FFAE6
, quand il n'y a pas de risque d'attaque
par confusion de l'ID, mais l'empreinte complète
l'identifie de façon sûre), mais évidemment il ne faut pas faire
confiance à un simple post de blog pour croire que cette empreinte est
bien celle d'une clé appartenant à David Madore, sauf si vous ne me
connaissez que par ce blog.
J'ai mis
ici une version de la nouvelle clé signée à la fois par l'ancienne
clé et par deux amis qui me connaissent personnellement (mais bon, si
vous n'avez pas de raison de faire confiance en leurs clés,
ça vous fait une belle jambe aussi) ; et le fait que
j'aie annoncé
l'empreinte sur Twitter peut aussi aider très légèrement à
augmenter la confiance dans le fait qu'il s'agit bien de la bonne
personne. Mais si vous me connaissez personnellement, n'hésitez pas à
me demander, soit en personne, soit par un canal de communication
séparé (par exemple par SMS, en accompagnant
votre SMS d'une question dont vous pensez que je serais
seul à avoir la réponse) de confirmer l'exactitude de cette empreinte,
j'apprécierais d'avoir des versions signées de ma clé en retour.
Mon ancienne clé n'est pas révoquée, je n'ai pas de raison de penser qu'elle aurait été compromise et j'ai toujours la clé privée associée, donc je n'ai pas l'intention de la révoquer dans l'immédiat, elle demeure valable.
Maintenant que j'ai fait l'annonce principale, quelques râleries.
La première concerne la taille des clés. J'ai beau avoir des contacts avec la communauté crypto, je n'ai pas une bonne mémoire pour le niveau de sécurité estimé, et certainement pas le niveau estimé en 2023, des tailles de clé pour différents algorithmes, et la correspondance entre elles. Je ne sais donc pas bien évaluer, par exemple, à quel point une clé DSA de 1024 bits (ma vieille) est déjà cassée, juste menacée ou vaguement considérée comme insuffisante. Je m'attendais à trouver un article Wikipédia, ou une autre page quelque part en ligne, récapitulant les records déjà réalisés et les estimations de complexité future, pour attaquer différentes longueurs de clé pour des algorithmes standards (RSA, DSA [sur groupe multiplicatif], ECDSA [=DSA sur courbe elliptique], ElGamal, tout ça comparé à des longueurs de clés symétriques) : or je ne trouve rien de tel. Donc, première râlerie, quelqu'un voudrait-il bien faire l'effort d'écrire une page synthétique claire à ce sujet ?
La seconde concerne l'utilisation de GPG. L'interface
de ce programme est juste épouvantable. La syntaxe en ligne de
commande est baroque et incohérente. Il mélange des fonctions de haut
niveau (souvent interactives, demandant confirmation à l'utilisateur)
et des fonctions de bas niveau sans séparation claire, même sans indiquer
clairement ce qu'il faut considérer comme quoi : certaines fonctions
demanderont confirmation, d'autres non, certaines demanderont une
précision de façon interactive, d'autres non, et on ne sait vraiment
pas à l'avance ce qui va faire quoi. (Par exemple, quand on édite une
clé avec la fonction --edit-key
, on ne sait pas trop si
la commande delsig
pour effacer des signatures prend un
paramètre ou si elle le demandera après, on ne sait pas s'il y aura
confirmation avant l'effacement, on ne sait pas trop si on pourra
quitter sans sauver si on a fait une erreur, etc.) Le sens des
primitives est mal expliqué aux utilisateurs : par exemple, les
signatures de confiance produites avec tsign
prennent des
paramètres très importants dont le sens n'est absolument pas expliqué
dans le manuel alors même qu'il n'est pas évident du tout, ni
d'ailleurs la différence entre tsign
et sign
(il est juste dit de lire
la RFC 4880,
ce qui est un peu se moquer du monde, surtout qu'elle-même n'explique
pas vraiment les choses).
Ma troisième râlerie concerne la toile de confiance
(web of trust). La dernière fois que j'avais
regardé PGP un peu de près, c'est-à-dire il y a presque
un quart de siècle (ouch) quand j'ai généré ma clé précédente, la
manière standard de diffuser les signatures sur une clé (i.e., les
gens qui ont signé ma clé pour attester que c'est bien celle de David
Madore) était de les mettre sur un serveur de clés : le
principe étant donc, si je récupère la
clé 0x0D9364260B2790DE
auprès d'un serveur de clé, je
récupère aussi les signatures des gens qui attestent que c'est bien
celle de David Madore (et si par hasard je connais une de ces
personnes, au sens où j'ai déjà vérifié sa clé, ça me permet d'avoir
confiance en celle que je viens de récupérer ; sinon, je peux aller
chercher un cran plus loin en récupérant sur le serveur les clés des
gens les plus susceptibles d'être proches de mon cercle d'amis). Mais
il semble que des attaquants (spammeurs ? je ne suis pas sûr de leur
motivation) se soient amusés à envoyer sur le serveur des millions de
signatures bidon (enfin, les signatures sont bonnes sinon elles ne
seraient pas acceptées, mais elles proviennent de clés qui ne sont pas
vraiment celles d'humains bien identifiés, ou quelque chose du genre),
et pour éviter ce problème, les serveurs de clé n'ont pas trouvé mieux
que de… cesser de distribuer les signatures des clés. (Il y avait
pourtant plein d'autres façons de faire, par exemple demander de
contresigner les signatures — c'est-à-dire attester que la signature
est pertinente et souhaitée par la clé qui a été signée — ou bien
proposer une forme de login associé à la clé et n'accepter que les
signatures uploadées par la personne qui a uploadé la clé.) Toujours
est-il que, du coup, il n'y a essentiellement plus aucun moyen de
chercher à retrouver une chaîne de confiance de longueur non-triviale
menant à une clé : je peux certes publier moi-même ma clé avec les
signatures qu'on aura bien voulu m'en faire, mais la personne qui
voudrait vérifier l'identité des signataires n'a essentiellement
aucune façon de s'y prendre. C'est rare en informatique qu'il y ait
une régression aussi forte de fonctionnalité en quelques décennies, et
apparemment rien pour compenser.
Bref, c'est un peu triste : on a des outils théoriques qui sont
très bien, la cryptographie à clé publique est un concept
extraordinaire, mais dans la pratique il n'est essentiellement pas mis
en œuvre dans le monde réel d'une manière qui pourrait servir aux
vrais gens : d'un côté on a l'espèce de merde supposée « sécuriser »
le Web, c'est-à-dire le HTTPS, qui en vrai n'apporte
aucune sorte de garantie de confiance parce que les autorités censées
être à la racine de la confiance sont de purs parrains mafieux qui ne
vérifient rien et se contentent de prendre du fric aux gens pour
afficher https
dans les navigateurs (les détails de mes
récriminations sont ici), et de
l'autre on a un truc qui était basé sur des principes un peu plus
sains, PGP, dont le fonctionnement est arcane et qui a
été privé du moyen pratique de permettre de vérifier cette
confiance.