2.8 AEAD Construction
2.8 AEAD Construction
AEAD_CHACHA20_POLY1305 est un algorithme de chiffrement authentifié avec données associées (Authenticated Encryption with Associated Data, AEAD). Les entrées de AEAD_CHACHA20_POLY1305 sont les suivantes :
-
Une clé de 256 bits
-
Un nonce de 96 bits, différent pour chaque invocation avec la même clé
-
Un texte clair (plaintext) de longueur arbitraire
-
Des données d'authentification supplémentaires (Additional Authenticated Data, AAD) de longueur arbitraire
Certains protocoles peuvent avoir des entrées uniques par invocation qui ne font pas 96 bits. Par exemple, IPsec peut spécifier un nonce de 64 bits. Dans ce cas, il appartient au document de protocole de définir comment transformer le nonce du protocole en un nonce de 96 bits, par exemple en concaténant une valeur constante.
Les primitives ChaCha20 et Poly1305 sont combinées en un AEAD qui prend une clé de 256 bits et un nonce de 96 bits comme suit :
-
D'abord, une clé à usage unique Poly1305 est générée à partir de la clé de 256 bits et du nonce en suivant la procédure décrite à la section 2.6.
-
Ensuite, la fonction de chiffrement ChaCha20 est appelée pour chiffrer le texte clair, en utilisant la même clé et le même nonce, avec le compteur initial fixé à 1.
-
Enfin, la fonction Poly1305 est appelée avec la clé Poly1305 calculée ci-dessus, et un message construit comme concaténation des éléments suivants :
-
L'AAD
-
padding1 : le rembourrage comporte au plus 15 octets nuls et porte la longueur totale jusqu'alors à un multiple entier de 16. Si la longueur de l'AAD était déjà un multiple entier de 16 octets, ce champ est de longueur nulle.
-
Le texte chiffré (ciphertext)
-
padding2 : le rembourrage comporte au plus 15 octets nuls et porte la longueur totale jusqu'alors à un multiple entier de 16. Si la longueur du texte chiffré était déjà un multiple entier de 16 octets, ce champ est de longueur nulle.
-
La longueur des données supplémentaires en octets (entier little-endian sur 64 bits).
-
La longueur du texte chiffré en octets (entier little-endian sur 64 bits).
-
La sortie de l'AEAD est la concaténation de :
-
Un texte chiffré de la même longueur que le texte clair.
-
Une étiquette (tag) de 128 bits, qui est la sortie de la fonction Poly1305.
Le déchiffrement est similaire, avec les différences suivantes :
-
Les rôles du texte chiffré et du texte clair sont inversés, de sorte que la fonction de chiffrement ChaCha20 est appliquée au texte chiffré, produisant le texte clair.
-
La fonction Poly1305 s'exécute toujours sur l'AAD et le texte chiffré, pas sur le texte clair.
-
L'étiquette calculée est comparée bit à bit à l'étiquette reçue. Le message est authentifié si et seulement si les étiquettes correspondent.
Quelques remarques sur cette conception :
-
La quantité de données chiffrées possible en une seule invocation est de
2^32-1blocs de 64 octets chacun, en raison de la taille du champ compteur de blocs dans la fonction de blocs ChaCha20. Cela donne un total de 274 877 906 880 octets, soit près de 256 Go. Cela devrait suffire pour des protocoles de trafic tels qu'IPsec et TLS, mais peut être trop peu pour le chiffrement de fichiers et/ou de disques. Pour de tels usages, on peut revenir à la conception d'origine, réduire le nonce à 64 bits, et utiliser l'entier en position 13 comme 32 bits de poids fort d'un compteur de blocs sur 64 bits, portant la taille totale du message à plus d'un million de pétaoctets (1 180 591 620 717 411 303 360 octets exactement). -
Malgré le point précédent, le champ de longueur du texte chiffré dans la construction du tampon sur lequel Poly1305 opère limite la taille du texte chiffré (et donc du texte clair) à
2^64octets, soit seize mille pétaoctets (18 446 744 073 709 551 616 octets exactement).
La construction AEAD de cette section est une composition nouvelle de ChaCha20 et Poly1305. Une analyse de sécurité de cette composition est donnée dans [Procter].
Voici la liste des paramètres pour cette construction tels que définis à la section 4 de [RFC5116] :
-
K_LEN (longueur de clé) est de 32 octets.
-
P_MAX (taille maximale du texte clair) est de 274 877 906 880 octets, soit près de 256 Go.
-
A_MAX (taille maximale des données associées) est fixé à
2^64-1octets par le champ de longueur des données associées. -
N_MIN = N_MAX = 12 octets.
-
C_MAX = P_MAX + longueur de l'étiquette = 274 877 906 896 octets.
Les entrées AAD distinctes (comme décrit à la section 3.3 de [RFC5116]) DOIVENT être concaténées en une seule entrée vers AEAD_CHACHA20_POLY1305. Il appartient à l'application de créer une structure dans l'entrée AAD si nécessaire.
2.8.1 Pseudocode for the AEAD Construction
pad16(x):
if (len(x) % 16)==0
then return NULL
else return copies(0, 16-(len(x)%16))
end
chacha20_aead_encrypt(aad, key, iv, constant, plaintext):
nonce = constant | iv
otk = poly1305_key_gen(key, nonce)
ciphertext = chacha20_encrypt(key, 1, nonce, plaintext)
mac_data = aad | pad16(aad)
mac_data |= ciphertext | pad16(ciphertext)
mac_data |= num_to_8_le_bytes(aad.length)
mac_data |= num_to_8_le_bytes(ciphertext.length)
tag = poly1305_mac(mac_data, otk)
return (ciphertext, tag)
2.8.2 Example and Test Vector for AEAD_CHACHA20_POLY1305
Pour un vecteur de test, nous utiliserons les entrées suivantes vers la fonction AEAD_CHACHA20_POLY1305 :
Plaintext :
000 4c 61 64 69 65 73 20 61 6e 64 20 47 65 6e 74 6c Ladies and Gentl
016 65 6d 65 6e 20 6f 66 20 74 68 65 20 63 6c 61 73 emen of the clas
032 73 20 6f 66 20 27 39 39 3a 20 49 66 20 49 20 63 s of '99: If I c
048 6f 75 6c 64 20 6f 66 66 65 72 20 79 6f 75 20 6f ould offer you o
064 6e 6c 79 20 6f 6e 65 20 74 69 70 20 66 6f 72 20 nly one tip for
080 74 68 65 20 66 75 74 75 72 65 2c 20 73 75 6e 73 the future, suns
096 63 72 65 65 6e 20 77 6f 75 6c 64 20 62 65 20 69 creen would be i
112 74 2e t.
AAD :
000 50 51 52 53 c0 c1 c2 c3 c4 c5 c6 c7 PQRS........
Key :
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 ................
IV :
000 40 41 42 43 44 45 46 47 @ABCDEFG
32-bit fixed-common part :
000 07 00 00 00 ....
Configuration pour la génération de la clé Poly1305 à usage unique (expéditeur id=7) :
61707865 3320646e 79622d32 6b206574
83828180 87868584 8b8a8988 8f8e8d8c
93929190 97969594 9b9a9998 9f9e9d9c
00000000 00000007 43424140 47464544
Après génération de la clé Poly1305 à usage unique :
252bac7b af47b42d 557ab609 8455e9a4
73d6e10a ebd97510 7875932a ff53d53e
decc7ea2 b44ddbad e49c17d1 d8430bc9
8c94b7bc 8b7d4b4b 3927f67d 1669a432
Poly1305 Key :
000 7b ac 2b 25 2d b4 47 af 09 b6 7a 55 a4 e9 55 84 {.+%-.G...zU..U.
016 0a e1 d6 73 10 75 d9 eb 2a 93 75 78 3e d5 53 ff ...s.u..*.ux>.S.
Poly1305 r = 455e9a4057ab6080f47b42c052bac7b
Poly1305 s = ff53d53e7875932aebd9751073d6e10a
keystream bytes :
9f:7b:e9:5d:01:fd:40:ba:15:e2:8f:fb:36:81:0a:ae:
c1:c0:88:3f:09:01:6e:de:dd:8a:d0:87:55:82:03:a5:
4e:9e:cb:38:ac:8e:5e:2b:b8:da:b2:0f:fa:db:52:e8:
75:04:b2:6e:be:69:6d:4f:60:a4:85:cf:11:b8:1b:59:
fc:b1:c4:5f:42:19:ee:ac:ec:6a:de:c3:4e:66:69:78:
8e:db:41:c4:9c:a3:01:e1:27:e0:ac:ab:3b:44:b9:cf:
5c:86:bb:95:e0:6b:0d:f2:90:1a:b6:45:e4:ab:e6:22:
15:38
Ciphertext :
000 d3 1a 8d 34 64 8e 60 db 7b 86 af bc 53 ef 7e c2 ...4d.`.{...S.~.
016 a4 ad ed 51 29 6e 08 fe a9 e2 b5 a7 36 ee 62 d6 ...Q)n......6.b.
032 3d be a4 5e 8c a9 67 12 82 fa fb 69 da 92 72 8b =..^..g....i..r.
048 1a 71 de 0a 9e 06 0b 29 05 d6 a5 b6 7e cd 3b 36 .q.....)....~.;6
064 92 dd bd 7f 2d 77 8b 8c 98 03 ae e3 28 09 1b 58 ....-w......(..X
080 fa b3 24 e4 fa d6 75 94 55 85 80 8b 48 31 d7 bc ..$...u.U...H1..
096 3f f4 de f0 8e 4b 7a 9d e5 76 d2 65 86 ce c6 4b ?....Kz..v.e...K
112 61 16 a.
AEAD Construction for Poly1305 :
000 50 51 52 53 c0 c1 c2 c3 c4 c5 c6 c7 00 00 00 00 PQRS............
016 d3 1a 8d 34 64 8e 60 db 7b 86 af bc 53 ef 7e c2 ...4d.`.{...S.~.
032 a4 ad ed 51 29 6e 08 fe a9 e2 b5 a7 36 ee 62 d6 ...Q)n......6.b.
048 3d be a4 5e 8c a9 67 12 82 fa fb 69 da 92 72 8b =..^..g....i..r.
064 1a 71 de 0a 9e 06 0b 29 05 d6 a5 b6 7e cd 3b 36 .q.....)....~.;6
080 92 dd bd 7f 2d 77 8b 8c 98 03 ae e3 28 09 1b 58 ....-w......(..X
096 fa b3 24 e4 fa d6 75 94 55 85 80 8b 48 31 d7 bc ..$...u.U...H1..
112 3f f4 de f0 8e 4b 7a 9d e5 76 d2 65 86 ce c6 4b ?....Kz..v.e...K
128 61 16 00 00 00 00 00 00 00 00 00 00 00 00 00 00 a...............
144 0c 00 00 00 00 00 00 00 72 00 00 00 00 00 00 00 ........r.......
Noter les quatre octets nuls à la ligne 000 et les 14 octets nuls à la ligne 128.
Tag :
1a:e1:0b:59:4f:09:e2:6a:7e:90:2e:cb:d0:60:06:91