Passa al contenuto principale

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:

  1. Impostare T alla sequenza vuota. La lunghezza di T (in bit) è denotata tlen; quindi, a quel punto, tlen = 0.

  2. Mentre tlen < qlen, eseguire quanto segue:

    V = HMAC_K(V)
    T = T || V
  3. 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.