Diffie Hellman - quanto dovrebbe essere grande il numero casuale?

4

Quando si utilizza lo scambio Diffie Hellman con il secondo gruppo Oakley 1024 bit Prime per RFC 2409 (*), quanto dovrebbero essere grandi i numeri casuali generati da entrambi i lati?

In RFC 2631 questa è chiamata la chiave privata e sto citando:

X9.42 requires that the private key x be in the interval [2, (q -
2)]. x should be randomly generated in this interval. y is then
computed by calculating g^x mod p. To comply with this memo, m MUST
be >=160 bits in length, (consequently, q MUST be at least 160 bits
long). When symmetric ciphers stronger than DES are to be used, a
larger m may be advisable.

Utilizzerò AES-256 per la crittografia del contenuto.

Non so cosa q sia per il secondo gruppo di Oakley.

160 bit sono sufficienti? Devo arrivare fino a 1024 bit?

Inutile dire che ho un problema con la capacità di generazione di rumore e sto già soffrendo, quindi ho bisogno della minima quantità di rumore che mantiene il sistema ancora sicuro (a circa 112 bit equivalenti di sicurezza che è approssimativamente il livello di sicurezza fornita dalla DH con un primo di 1024 bit).

(*) So che questo primo non è eccezionale, è deprecato e tutto il resto. Questo è un sistema legacy per il quale non posso ingrandire il primo.

EDIT - chiarimento sulla mia motivazione: sto usando un buon generatore di numeri casuali reali (nessuna magia "pseudo"). Tuttavia per mantenere l'indipendenza statistica dell'output c'è una frequenza di campionamento massima. C'è uno scenario nel sistema che richiede una rapida configurazione di migliaia di connessioni sicure. Preferirei non archiviare il rumore su disco in preparazione per questo scenario (molte insidie su questo percorso, per non parlare dei requisiti di certificazione) né "espandere" il rumore usando una delle molte tecniche.

    
posta Tal Weiss 23.03.2012 - 08:08
fonte

3 risposte

5

Risposta breve. Sì, penso che sia corretto scegliere x come un numero casuale a 160 bit. (Non ci scommetterei la vita, ma sono abbastanza sicuro che vada bene.)

Dettagli tecnici. Ci sono (almeno) due modi per attaccare Diffie-Hellman.

  1. Un modo è utilizzare algoritmi elaborati per calcolare il logaritmo discreto, ad esempio, in base al setaccio di campi numerici o simili. Il tempo di esecuzione di questi algoritmi dipende dal modulo primario p, e hai bisogno che p sia grande (certamente almeno 1024 bit) per resistere a questi attacchi.

  2. Un altro modo è usare algoritmi più elementari, come l'algoritmo passo passo di baby-step o l'algoritmo di Pollard. Il tempo di esecuzione di questi algoritmi dipende dalla dimensione minore di q o dalla dimensione dell'esponente x. Hai bisogno che q sia grande (almeno 160 bit) per resistere a questi attacchi. È necessario che l'esponente sia scelto da un grande spazio (ad esempio, almeno 160 bit di entropia) per resistere a questi attacchi.

Dato che ci sono due diversi attacchi, dovrai scegliere i tuoi parametri per sconfiggerli entrambi. Ecco perché hai bisogno che il tuo esponente abbia almeno 160 bit.

Ora, la cosa più prudente da fare è scegliere x in modo casuale a caso nell'intervallo [0, q-1] (o [2, q-2] se preferisci, non ha molta importanza). Questo sarà sicuramente sicuro, purché p e q siano abbastanza grandi. La citazione che hai estratto sembra dire che X9.42 ti consiglia di utilizzare questo approccio conservativo.

Tuttavia in molti casi è possibile ottenere un'ottimizzazione, a volte nota come ottimizzazione dell'esponente breve. L'idea è di scegliere x uniformemente a caso da un intervallo più piccolo, ad esempio [0, 2 160 - 1]. Questo di solito è sicuro, se il protocollo è progettato correttamente, anche se ci sono state alcune eccezioni. Il vantaggio è che se q è grande, scegliere una x più corta come questa può migliorare significativamente le prestazioni.

Per il gruppo che hai citato, q = (p-1) / 2. (*) In altre parole, q è lungo circa 1023 bit. Ciò significa che la cosa più conservativa da fare è scegliere la tua x nell'intervallo completo [0, q-1], ma credo che tu possa probabilmente cavartela usando l'ottimizzazione dell'esponente breve. Ho provato a leggere i documenti IKE e non ho trovato immediatamente una dichiarazione esplicita sull'ottimizzazione dell'ottimizzazione a breve esponente per IKE, anche se ho trovato alcune osservazioni che sembrano indicare che gli sviluppatori hanno anticipato potrebbe essere OK da usare.

Nota a piè di pagina (*): puoi dedurlo come segue. RFC 2409 dice che "le proprietà di questi gruppi sono descritte in [RFC2412]". La sezione E.2 di RFC 2412 elenca il gruppo corrispondente ed elenca il più grande fattore primo dell'ordine di gruppo. Il primo fattore più grande può essere verificato (p-1) / 2. Da ciò segue che q = (p-1) / 2.

Modifica 3/24: Ho appena notato, grazie alla risposta di @ CodeinChaos, che hai menzionato la ragione per cui utilizzi un breve esponente non è la performance ma piuttosto l'entropia limitata nel tuo PRNG. Lo trovo un po 'strano. Quale PRNG stai usando? Sei sicuro di avere un PRNG cripto-resistente? La maggior parte dei PRNG crittografici può essere usata per tirare una stringa pseudocasuale di lunghezza arbitraria. Se il tuo non lo fa, puoi sempre prendere l'output del tuo PRNG ed espanderlo a una stringa pseudocasuale a 1024 bit: ad esempio, generare una chiave AES a 128 bit K, quindi utilizzare AES (K, 0), AES (K , 1), AES (K, 2), AES (K, 3), ..., AES (K, 7) per generare una stringa pseudocasuale a 1024 bit. Una volta che hai una stringa pseudocasuale a 1024 bit (purché sia di cripto-qualità e l'RNG originale abbia abbastanza entropia in esso), puoi usarlo come esponente a 1024 bit a lunghezza intera.

Verifica che il tuo RNG / PRNG sia criptato. Ad esempio, /dev/urandom e CryptGenRandom sono buoni, ma rand() , random() , drand48() sono tutti negativi. ( /dev/random è strong ma non necessario; usa invece /dev/urandom e sarai in grado di disegnare un esponente a lunghezza intera senza problemi.) Cerca su questo sito per ulteriori informazioni sui PRNG di qualità crittografica.

    
risposta data 23.03.2012 - 09:52
fonte
1

Needless to say I have a noise-generation capacity problem and I'm hurting already, so I need the least amount of noise that still keeps the system secure (at a roughly 112 bit equivalent bits of security which is approximately the level of security provided by the DH with a 1024 bit prime).

Cercherò di usare un buon CRPto PRNG che tu semini (e occasionalmente ri-semina) con la tua effettiva entropia. In questo modo puoi facilmente creare grandi quantità di numeri casuali. Credo che fortuna sia una scelta popolare per un PRNG.

Una volta che la generazione di numeri casuali è a buon mercato, non vi è alcun motivo per utilizzare numeri minori della gamma massima. Ma dal momento che non ho molta familiarità con DH, non so quale sia questo intervallo.

    
risposta data 23.03.2012 - 13:05
fonte
0

160 bit sono sufficienti per 1024 bit DH, ma questo sarà più debole del tuo AES a 256 bit. Vedere ad esempio la Tabella 2 in NIST SP 800-57 o questa calcolatrice della lunghezza della chiave . (Per l'equivalenza con le chiavi simmetriche a 256 bit raccomandano il DH da 15360 bit (con un numero casuale a 512 bit) o, più praticamente, usando una curva ellittica da 512 bit.)

Quindi, se il tuo sistema legacy smette di utilizzare uno scambio di chiavi più strong, l'uso di una chiave a 256 bit potrebbe essere una perdita di tempo.

    
risposta data 21.04.2013 - 15:43
fonte

Leggi altre domande sui tag