Come RSACryptoServiceProvider genera le chiavi

3

La documentazione per il costruttore per gli stati di RSACryptoServiceProvider

"Se non viene trovata alcuna chiave predefinita, viene creata una nuova chiave. Questo costruttore crea una coppia di chiavi di Exchange adatta a crittografare le chiavi di sessione in modo che possano essere memorizzate e scambiate in modo sicuro con altri utenti. La chiave generata corrisponde a una chiave generata utilizzando il valore AT_KEYEXCHANGE utilizzato nell'API Microsoft Cryptographic (CAPI) non gestita. "

Questo lascia alcune domande;

  • Come viene generata questa chiave, penso che le chiavi RSA richiedano un grande numero massimo, ma non credo che .net mantenga una vasta lista di numeri primi disponibili. Né il costruttore impiega il tempo per trovare nuovi numeri primi.
  • Quando è disponibile una chiave predefinita?
  • Quanto sono sicure le chiavi generate da questo costruttore?
posta Taemyr 02.03.2016 - 12:28
fonte

1 risposta

4

RSACryptoServiceProvider , come la maggior parte delle classi di sistema in .NET, è un sottile involucro attorno alla precedente implementazione di Win32 (un'API che doveva essere usata con C o C ++ - o anche con Pascal, se veramente scaviamo in profondità). Vedi CryptAcquireContext () . Nella terminologia .NET, questo è chiamato "codice non gestito".

La generazione di una coppia di chiavi RSA comporta la produzione di nuovi numeri primi casuali. La conoscenza di questi primi è la chiave privata, quindi speriamo strongmente che l'implementazione Microsoft non usi semplicemente una lista fissa di numeri primi pre-generati! Concettualmente, questa generazione è semplice: produci sequenze di bit casuali della giusta dimensione e ripeti finché non ne trovi una che sia la prima.

Più in dettaglio, se si desidera una chiave RSA a 2048 bit, saranno necessari due numeri primi 1024 bit il cui prodotto è un numero intero a 2048 bit. Questo va così:

  1. Genera una sequenza di 1024 bit casuali, in modo che i primi due bit e l'ultimo siano uguali a 1; i 1021 altri bit sono ottenuti da una strong fonte casuale (in Win32, questo è CryptGenRandom () - RNGCryptoServiceProvider è il wrapper .NET).

  2. Interpreta i 1024 bit come un intero grande p . Poiché impostiamo i primi due bit su 1 e ci sono 1024 bit, il numero intero è maggiore di 3 × 2 1022 e inferiore a 4 × 2 1022 ; poiché l'ultimo bit è anche 1, il numero intero è dispari.

  3. Verifica che p -1 non sia un multiplo dell'esponente pubblico RSA scelto. L'esponente tradizionale è 65537. C'è una probabilità 1/65537 che p -1 è un multiplo di 65537; se lo è ancora, torna al passaggio 1 per generare un altro candidato.

  4. Prova il numero intero p per la primalità. Ci sono diversi metodi per questo; di solito viene utilizzato test di primalità di Miller-Rabin . Se p non viene trovato in primo piano, torna al passaggio 1 per generare un altro primo. Per un p a 1024 bit che ci siamo preoccupati di rendere strano, puoi aspettarti di testare una media di circa 500 candidati prima di trovare un primo.

  5. Una volta generato un primo p casuale, fallo di nuovo per ottenerne un altro, che chiameremo q .

  6. Il modulo sarà n = pq . L'esponente pubblico è il e scelto (65537 nell'esempio sopra). L'esponente privato d e gli altri componenti della chiave privata RSA sono calcolati algebricamente da p , q e e . Grazie al modo in cui sono stati generati p e q (due bit superiori a 1), è garantito che n avrà dimensione 2048 bit, non 2047.

L'intera API è a malapena utilizzabile. Il concetto della "chiave predefinita" è aberrante; non è possibile affidarsi decentemente ad esso in qualsiasi protocollo, dal momento che non si controlla né la sua conservazione né il suo ciclo di vita. Inoltre, quella chiave predefinita avrà una lunghezza di 1024 bit, che è un po 'troppo breve per la tecnologia odierna. Se vuoi ottenere e utilizzare una chiave RSA, dovresti chiedere esplicitamente la sua generazione, e certamente non registrarla come "predefinita" che qualsiasi altra applicazione può usare o possibile modificare, esportare, pubblicare o qualsiasi altra cosa.

È anche mal sottostimato. CryptAcquireContext () accetta più opzioni che influiscono sul modo in cui la chiave, se presente, viene generata e memorizzata; la documentazione per RSACryptoServiceProvider non indica quali opzioni vengono utilizzate. Se vuoi sapere cosa succede veramente sotto il cofano, devi approfondire il codice sorgente .

La linea di fondo è che il costruttore di RSACryptoServiceProvider genererà nuovi primi, per un modulo RSA a 1024 bit (quindi primi 512 bit), ma cercherà di mantenere una "chiave predefinita" "così che lo farà una volta sola, anche se lo chiami ripetutamente. Nota che produrre una nuova chiave RSA a 1024 bit richiede solo una frazione di secondo con un PC moderno.

    
risposta data 02.03.2016 - 13:49
fonte

Leggi altre domande sui tag