Passa al contenuto principale

2.6 Generating the Poly1305 Key Using ChaCha20 (Generazione della chiave Poly1305 con ChaCha20)

2.6 Generating the Poly1305 Key Using ChaCha20 (Generazione della chiave Poly1305 con ChaCha20)

Come detto nella Sezione 2.5, è accettabile generare la chiave Poly1305 monouso in modo pseudocasuale. Questa sezione definisce un tale metodo.

Per generare una tale coppia di chiavi (r,s), si usa la funzione a blocchi ChaCha20 descritta nella Sezione 2.3. Ciò presuppone una chiave di sessione da 256 bit dedicata specificamente alla funzione Message Authentication Code (codice di autenticazione del messaggio, MAC). Qualsiasi documento che specifichi l'uso di Poly1305 come algoritmo MAC per un protocollo DEVE specificare che 256 bit sono allocati per la chiave di integrità. Notare che nella costruzione AEAD (Authenticated Encryption with Associated Data, cifratura autenticata con dati associati) definita nella Sezione 2.8, la stessa chiave è usata per la cifratura e per la generazione della chiave.

Il metodo consiste nel chiamare la funzione a blocchi con i seguenti parametri:

  • La chiave di integrità di sessione da 256 bit è usata come chiave ChaCha20.

  • Il contatore di blocchi è impostato a zero.

  • Il protocollo specificherà un nonce da 96 o 64 bit. Questo DEVE essere univoco per ogni invocazione con la stessa chiave, quindi NON DEVE essere generato in modo casuale. Un contatore è un buon modo per implementarlo, ma sono accettabili anche altri metodi, come un Linear Feedback Shift Register (registro a scorrimento con retroazione lineare, LFSR). ChaCha20 come specificato qui richiede un nonce da 96 bit. Se il nonce fornito è solo da 64 bit, i primi 32 bit del nonce saranno impostati a una costante. Di solito sarà zero, ma per protocolli con più mittenti può essere diversa per ciascun mittente, ma DOVREBBE essere la stessa per tutte le invocazioni della funzione con la stessa chiave da parte di un determinato mittente.

Dopo l'esecuzione della funzione a blocchi, si ha uno stato da 512 bit. Si prendono i primi 256 bit dello stato serializzato e si usano come chiave Poly1305 monouso: i primi 128 bit sono sottoposti a clamp e formano « r », mentre i successivi 128 bit diventano « s ». Gli altri 256 bit sono scartati.

Notare che molti protocolli prevedono un nonce per gli algoritmi di cifratura (spesso chiamato Initialization Vector, vettore di inizializzazione, IV), ma di solito non una disposizione analoga per la funzione MAC. In tal caso, il nonce per invocazione dovrà provenire da altrove, ad esempio da un contatore di messaggi.

2.6.1 Poly1305 Key Generation in Pseudocode (Generazione della chiave Poly1305 in pseudocodice)

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 (Vettore di test per la generazione della chiave Poly1305)

Per questo esempio, impostiamo:

Chiave:

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              ............

Stato ChaCha iniziale con chiave, nonce e contatore di blocchi zero:

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

Stato ChaCha dopo 20 giri:

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

Byte di output:

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

Tale output è anche la chiave monouso da 32 byte usata per Poly1305.