3.2. Generation of k (Generazione di k)
3.2. Generation of k (Generazione di k)
Dato il messaggio di input m, viene applicato il seguente processo:
a. Elaborare m attraverso la funzione hash H, producendo:
h1 = H(m)
(h1 è una sequenza di hlen bit).
b. Impostare:
V = 0x01 0x01 0x01 ... 0x01
in modo tale che la lunghezza di V, in bit, sia uguale a 8*ceil(hlen/8). Ad esempio, su un sistema basato su ottetti, se H è SHA-256, allora V viene impostato a una sequenza di 32 ottetti di valore 1. Si noti che in questo passaggio e in tutti i passaggi successivi, utilizziamo la stessa funzione H utilizzata nel passaggio 'a' per elaborare il messaggio di input; questa scelta sarà discussa più in dettaglio nella Sezione 3.6.
c. Impostare:
K = 0x00 0x00 0x00 ... 0x00
in modo tale che la lunghezza di K, in bit, sia uguale a 8*ceil(hlen/8).
d. Impostare:
K = HMAC_K(V || 0x00 || int2octets(x) || bits2octets(h1))
dove || denota concatenazione. In altre parole, calcoliamo HMAC con chiave K, sulla concatenazione dei seguenti elementi, nell'ordine: il valore corrente di V, una sequenza di otto bit di valore 0, la codifica della chiave privata (EC)DSA x, e il messaggio hashato (possibilmente troncato ed esteso come specificato dalla trasformazione bits2octets). Il risultato HMAC è il nuovo valore di K. Si noti che la chiave privata x è nell'intervallo [1, q-1], quindi un input appropriato per int2octets, che produce rlen bit di output, cioè, un numero integrale di ottetti (rlen è un multiplo di 8).
e. Impostare:
V = HMAC_K(V)
f. Impostare:
K = HMAC_K(V || 0x01 || int2octets(x) || bits2octets(h1))
Si noti che l'"ottetto interno" è 0x01 questa volta.
g. Impostare:
V = HMAC_K(V)
h. Applicare il seguente algoritmo fino a quando non viene trovato un valore appropriato per k:
-
Impostare T alla sequenza vuota. La lunghezza di T (in bit) è denotata tlen; quindi, a quel punto, tlen = 0.
-
Mentre tlen < qlen, eseguire quanto segue:
V = HMAC_K(V)
T = T || V -
Calcolare:
k = bits2int(T)Se quel valore di k è nell'intervallo [1,q-1], ed è adatto per DSA o ECDSA (cioè, risulta in un valore r che non è 0; vedere Sezione 3.4), allora la generazione di k è terminata. Il valore ottenuto di k viene utilizzato in DSA o ECDSA. Altrimenti, calcolare:
K = HMAC_K(V || 0x00)
V = HMAC_K(V)e ripetere il ciclo (tentare di generare una nuova T, e così via).
Si prega di notare che quando k viene generato da T, il risultato di bits2int viene confrontato con q, non ridotto modulo q. Se il valore non è tra 1 e q-1, il processo si ripete. Eseguire una semplice riduzione modulare indurrebbe distorsioni che sarebbero dannose per la sicurezza della firma.