Diffie-Hellman funziona in un sottogruppo di interi modulo a prime p . Vale a dire, si ha un generatore g , che è un modulo intero convenzionale p . Quel generatore ha un ordine r che è il più piccolo intero positivo tale che g r = 1 mod p . I due sistemi che si occupano di DH scelgono le chiavi private a e b rispettivamente come numeri interi in un dato intervallo, e le corrispondenti chiavi pubbliche DH (che scambiano sul filo) sono g a mod p e g b mod p .
DH è sicuro finchè:
-
p è "corretto": abbastanza grande (almeno 1024 bit) e non prodotto con una "struttura speciale" che rende logaritmo discreto facile. Un primo generato in modo casuale della giusta dimensione andrà bene.
- Il massimo principale divisore di r ha dimensione almeno 2k bit, quando si mira a un livello di sicurezza di " k bit". Fondamentalmente, il primo principale divisore di r dovrebbe essere un numero primo intero di dimensioni di almeno 160 bit (200 bit o più sarebbe preferito dagli standard odierni).
- Le chiavi private DH sono generate in un intervallo di dimensioni almeno 2 2k o giù di lì. Fondamentalmente, a e b dovrebbero anche essere 2k -bit interi.
Il valore esatto del generatore g non ha importanza, purché entrambe le parti utilizzino lo stesso valore. Si può dimostrare che se qualcuno può calcolare logaritmo discreto relativamente a un generatore g , può calcolarlo come relativamente relativamente a qualsiasi generatore g ' dello stesso sottogruppo. Quindi, ciò che conta è l'ordine di sottogruppo , non il generatore. Puoi usare 2 o 5 , non cambierà la sicurezza.
L'uso di un generatore breve ha alcuni (lievi) benefici per le prestazioni, motivo per cui sono preferiti. La differenza di prestazioni tra 2 e 5 sarà tuttavia trascurabile. In alcuni protocolli, il generatore è concordato a livello di protocollo, cioè non trasmesso sul filo; è hardcoded in entrambi i sistemi. Alcuni protocolli impongono l'uso di 2 , altri vogliono usare 5 , per ragioni storiche e tradizionali. OpenSSL, come libreria generica, può generare parametri per entrambi i casi.
Ci sono dettagli , però. Fare in modo che il generatore scelto abbia effettivamente un ordine con un primo divisore abbastanza grande può essere difficile. Per impostazione predefinita, openssl dhparam
genererà un cosiddetto "primo sicuro", ovvero genera numeri primi casuali q finché non ne trova uno tale che p = 2q + 1 è anch'esso un numero intero. L'ordine di qualsiasi g modulo q è sempre un divisore di p-1 . Quindi, usando un primo sicuro, OpenSSL è garantito che l'ordine r di qualsiasi generatore g nell'intervallo 2..p-2 ( in particolare 2 e 5 ) sarà uguale a q o 2q , quindi sempre un multiplo di q , che è un numero abbastanza grande.
Se OpenSSL genera un p casuale senza assicurarsi che sia un "sicuro primo", quindi l'ordine effettivo di g = 2 o 5 sarebbe difficile da calcolare esattamente (implicherebbe il factoring p-1 , che è costoso).
In alcuni contesti non-DH, vale a dire nell'algoritmo di firma DSA, si deve avere un sottogruppo DH-like tale che l'ordine del generatore sia esattamente uguale a un dato primo non troppo grande q , invece di essere semplicemente un multiplo di q . In tal caso, OpenSSL (con l'interruttore della riga di comando -dsaparam
) genererà prima q , quindi p = qt + 1 per i valori casuali di t fino a quando non viene trovato un primo; e il generatore sarà ottenuto prendendo un s modulo p casuale e calcolando g = s t modulo p (questo produce necessariamente 1 o un intero di ordine esattamente q ). Quando si producono i parametri DSA, il generatore non può essere forzato (o del tutto) ad essere un numero intero piccolo specifico come 2 o 5 . Per DSA, il generatore è "grande".