Aller au contenu principal

2.6 Generating the Poly1305 Key Using ChaCha20

2.6 Generating the Poly1305 Key Using ChaCha20

Comme indiqué à la Section 2.5, il est acceptable de générer la clé Poly1305 à usage unique de manière pseudo-aléatoire. La présente section définit une telle méthode.

Pour générer une telle paire de clés (r,s), on utilise la fonction de bloc ChaCha20 décrite à la Section 2.3. Cela suppose qu'une clé de session de 256 bits est disponible spécifiquement pour la fonction Message Authentication Code (code d'authentification de message, MAC). Tout document qui spécifie l'emploi de Poly1305 comme algorithme MAC pour un protocole DOIT préciser que 256 bits sont alloués à la clé d'intégrité. Noter que, dans la construction AEAD (Authenticated Encryption with Associated Data, chiffrement authentifié avec données associées) définie à la Section 2.8, la même clé sert au chiffrement et à la génération de clé.

La méthode consiste à appeler la fonction de bloc avec les paramètres suivants :

  • La clé d'intégrité de session de 256 bits sert de clé ChaCha20.

  • Le compteur de blocs est fixé à zéro.

  • Le protocole spécifiera un nonce de 96 ou 64 bits. Ce nonce DOIT être unique pour chaque invocation avec la même clé ; il NE DOIT PAS être généré aléatoirement. Un compteur est un bon moyen de l'implémenter, mais d'autres méthodes, telles qu'un registre à décalage à rétroaction linéaire (Linear Feedback Shift Register, LFSR), sont également acceptables. ChaCha20 tel que spécifié ici exige un nonce de 96 bits. Si le nonce fourni n'a que 64 bits, les 32 premiers bits du nonce seront fixés à une constante. Il s'agit en général de zéro, mais pour les protocoles à plusieurs émetteurs cette valeur peut différer pour chaque émetteur ; elle DEVRAIT toutefois rester la même pour toutes les invocations de la fonction avec la même clé par un émetteur donné.

Après exécution de la fonction de bloc, on dispose d'un état de 512 bits. On prend les 256 premiers bits de l'état sérialisé et on les utilise comme clé Poly1305 à usage unique : les 128 premiers bits sont contraints (« clamped ») et forment « r », tandis que les 128 bits suivants deviennent « s ». Les 256 autres bits sont ignorés.

Noter que de nombreux protocoles prévoient un nonce pour les algorithmes de chiffrement (souvent appelé vecteur d'initialisation, ou Initialization Vector, IV), mais en général pas pour la fonction MAC. Dans ce cas, le nonce propre à chaque invocation devra provenir d'ailleurs, par exemple d'un compteur de messages.

2.6.1 Poly1305 Key Generation in Pseudocode

poly1305_key_gen(key,nonce):
counter = 0
block = chacha20_block(key,counter,nonce)
return block[0..31]
end

2.6.2 Poly1305 Key Generation Test Vector

Pour cet exemple, nous fixons :

Clé :

000  80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f  ................
016 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f ................

Nonce :

000  00 00 00 00 00 01 02 03 04 05 06 07              ............

État ChaCha initial avec la clé, le nonce et le compteur de blocs à zéro :

      61707865  3320646e  79622d32  6b206574
83828180 87868584 8b8a8988 8f8e8d8c
93929190 97969594 9b9a9998 9f9e9d9c
00000000 00000000 03020100 07060504

État ChaCha après 20 tours :

      8ba0d58a  cc815f90  27405081  7194b24a
37b633a8 a50dfde3 e2b8db08 46a6d1fd
7da03782 9183a233 148ad271 b46773d1
3cc1875a 8607def1 ca5c3086 7085eb87

Octets de sortie :

000  8a d5 a0 8b 90 5f 81 cc 81 50 40 27 4a b2 94 71  ....._...P@'J..q
016 a8 33 b6 37 e3 fd 0d a5 08 db b8 e2 fd d1 a6 46 .3.7...........F

Cette sortie est également la clé à usage unique de 32 octets utilisée pour Poly1305.