Protéger le passé et le futur

Le cliquet (ratchet) à sens unique

Comment renouveler une clé à chaque message tout en garantissant que voler l'état actuel ne révèle rien du passé ? La réponse tient dans une image mécanique : le cliquet.

L'image du cliquet

Un cliquet (en anglais ratchet) est ce mécanisme à dents que l'on trouve dans une clé à molette ou un treuil : il ne tourne que dans un seul sens. Une fois avancé, impossible de revenir en arrière.

En cryptographie, un cliquet fait avancer un état secret message après message, sans jamais pouvoir revenir aux états précédents.

Le cliquet symétrique

Le cœur du mécanisme est une fonction de dérivation de clé (KDF, Key Derivation Function). Une KDF prend un secret en entrée et produit de nouveaux secrets, de façon déterministe mais à sens unique : on ne peut pas remonter de la sortie vers l'entrée.

À chaque étape, on part d'une clé de chaîne (l'état courant) et on calcule :

clé_chaîne  ->  KDF  ->  ( clé_message , nouvelle_clé_chaîne )
  • La clé de message sert à chiffrer un unique message, puis est effacée.
  • La nouvelle clé de chaîne remplace l'ancienne, qui est effacée elle aussi.

Puis on recommence à partir de la nouvelle clé de chaîne. L'état « avance » d'un cran, exactement comme un cliquet.

CK0 --KDF--> (MK1, CK1)
              |          \
           chiffre msg1   CK1 --KDF--> (MK2, CK2)
                                        |          \
                                     chiffre msg2   CK2 --KDF--> (MK3, CK3)
                                                                  |
                                                               chiffre msg3

MK = clé de message (jetable)   CK = clé de chaîne (avance sans retour)

Pourquoi cela donne la forward secrecy

La KDF est une fonction à sens unique. Connaître CK2 permet de calculer CK3, CK4… (tout l'avenir de la chaîne), mais jamais CK1 ni CK0.

Donc si un attaquant vole l'état courant CK3 :

  • il ne peut pas retrouver CK1, ni CK2 ;
  • les clés de message MK1, MK2 ont déjà été effacées après usage.

Les messages passés restent donc protégés : c'est exactement la confidentialité persistante de la leçon précédente, réalisée concrètement.

Ce que l'attaquant vole (CK3) Peut-il l'obtenir ?
Les états futurs CK4, CK5 Oui (la KDF avance)
Les états passés CK0, CK1, CK2 Non (sens unique)
Les messages déjà chiffrés msg1, msg2 Non (MK1, MK2 effacées)

La limite du cliquet symétrique seul

Ce cliquet protège le passé à merveille. Mais il a un angle mort : si l'attaquant vole CK3, il peut suivre toute la suite de la chaîne et lire les messages futurs. Le cliquet symétrique n'offre donc pas la sécurité post-compromission. Il faudra un second mécanisme pour cela — objet du chapitre suivant.

En résumé

  • Un cliquet fait avancer un état secret dans un seul sens, sans retour possible.
  • Le cliquet symétrique applique une KDF : clé_chaîne -> (clé_message, nouvelle_clé_chaîne).
  • Comme la KDF est à sens unique, l'état courant ne révèle pas les états passés : d'où la forward secrecy.
  • Mais seul, il ne protège pas le futur après un vol : il manque la sécurité post-compromission.