2.8 AEAD Construction (Costruzione AEAD)
2.8 AEAD Construction (Costruzione AEAD)
AEAD_CHACHA20_POLY1305 è un algoritmo di crittografia autenticata con dati associati (Authenticated Encryption with Associated Data, AEAD). Gli ingressi di AEAD_CHACHA20_POLY1305 sono:
-
Una chiave di 256 bit
-
Un nonce di 96 bit, diverso per ogni invocazione con la stessa chiave
-
Un testo in chiaro (plaintext) di lunghezza arbitraria
-
Dati autenticati aggiuntivi (Additional Authenticated Data, AAD) di lunghezza arbitraria
Alcuni protocolli possono avere ingressi unici per invocazione che non sono lunghi 96 bit. Ad esempio, IPsec può specificare un nonce di 64 bit. In tal caso, spetta al documento di protocollo definire come trasformare il nonce del protocollo in un nonce di 96 bit, ad esempio concatenando un valore costante.
Le primitive ChaCha20 e Poly1305 sono combinate in un AEAD che usa una chiave di 256 bit e un nonce di 96 bit come segue:
-
Prima, una chiave monouso Poly1305 è generata dalla chiave di 256 bit e dal nonce mediante la procedura descritta nella Sezione 2.6.
-
Poi, viene chiamata la funzione di crittografia ChaCha20 per cifrare il plaintext, usando la stessa chiave e lo stesso nonce, con il contatore iniziale impostato a 1.
-
Infine, viene chiamata la funzione Poly1305 con la chiave Poly1305 calcolata sopra, e un messaggio costruito come concatenazione dei seguenti elementi:
-
L'AAD
-
padding1 -- il padding è di al massimo 15 byte zero e porta la lunghezza totale fino a quel punto a un multiplo intero di 16. Se la lunghezza dell'AAD era già un multiplo intero di 16 byte, questo campo ha lunghezza zero.
-
Il ciphertext
-
padding2 -- il padding è di al massimo 15 byte zero e porta la lunghezza totale fino a quel punto a un multiplo intero di 16. Se la lunghezza del ciphertext era già un multiplo intero di 16 byte, questo campo ha lunghezza zero.
-
La lunghezza dei dati aggiuntivi in ottetti (come intero little-endian a 64 bit).
-
La lunghezza del ciphertext in ottetti (come intero little-endian a 64 bit).
-
L'uscita dell'AEAD è la concatenazione di:
-
Un ciphertext della stessa lunghezza del plaintext.
-
Un tag di 128 bit, che è l'uscita della funzione Poly1305.
La decifratura è simile, con le seguenti differenze:
-
I ruoli di ciphertext e plaintext sono invertiti, quindi la funzione di crittografia ChaCha20 è applicata al ciphertext, producendo il plaintext.
-
La funzione Poly1305 viene comunque eseguita su AAD e ciphertext, non sul plaintext.
-
Il tag calcolato è confrontato bit a bit con il tag ricevuto. Il messaggio è autenticato se e solo se i tag coincidono.
Alcune note su questa progettazione:
-
La quantità di dati cifrabili in una singola invocazione è di
2^32-1blocchi da 64 byte ciascuno, a causa della dimensione del campo contatore di blocco nella funzione di blocco ChaCha20. Ciò dà un totale di 274.877.906.880 byte, o quasi 256 GB. Dovrebbe essere sufficiente per protocolli di traffico come IPsec e TLS, ma può essere troppo piccolo per la crittografia di file e/o dischi. Per tali usi, si può tornare alla progettazione originale, ridurre il nonce a 64 bit, e usare l'intero in posizione 13 come 32 bit superiori di un contatore di blocco a 64 bit, aumentando la dimensione totale del messaggio a oltre un milione di petabyte (1.180.591.620.717.411.303.360 byte esatti). -
Nonostante il punto precedente, il campo lunghezza del ciphertext nella costruzione del buffer su cui opera Poly1305 limita la dimensione del ciphertext (e quindi del plaintext) a
2^64byte, o sedici mila petabyte (18.446.744.073.709.551.616 byte esatti).
La costruzione AEAD in questa sezione è una composizione nuova di ChaCha20 e Poly1305. Un'analisi di sicurezza di questa composizione è data in [Procter].
Ecco l'elenco dei parametri per questa costruzione come definiti nella Sezione 4 di [RFC5116]:
-
K_LEN (lunghezza della chiave) è 32 ottetti.
-
P_MAX (dimensione massima del plaintext) è 274.877.906.880 byte, o quasi 256 GB.
-
A_MAX (dimensione massima dei dati associati) è impostata a
2^64-1ottetti dal campo di lunghezza per i dati associati. -
N_MIN = N_MAX = 12 ottetti.
-
C_MAX = P_MAX + lunghezza del tag = 274.877.906.896 ottetti.
Ingressi AAD distinti (come descritto nella Sezione 3.3 di [RFC5116]) DEVONO essere concatenati in un unico ingresso a AEAD_CHACHA20_POLY1305. Spetta all'applicazione creare una struttura nell'ingresso AAD se necessario.
2.8.1 Pseudocode for the AEAD Construction (Pseudocodice per la costruzione AEAD)
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 (Esempio e vettore di prova)
Per un vettore di prova, useremo i seguenti ingressi alla funzione 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 ....
Configurazione per generare la chiave monouso Poly1305 (mittente id=7):
61707865 3320646e 79622d32 6b206574
83828180 87868584 8b8a8988 8f8e8d8c
93929190 97969594 9b9a9998 9f9e9d9c
00000000 00000007 43424140 47464544
Dopo la generazione della chiave monouso Poly1305:
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.......
Notare i quattro byte zero nella riga 000 e i 14 byte zero nella riga 128.
Tag:
1a:e1:0b:59:4f:09:e2:6a:7e:90:2e:cb:d0:60:06:91