2010-06-21 3 views
16

Sorprendentemente, sul Web sono disponibili pochissime informazioni sull'utilizzo dell'API leggera di Bouncy Castle. Dopo aver cercato per un po 'sono stato in grado di mettere insieme un esempio di base:Bouncy Castle Generazione di chiavi in ​​mano RSA con Lightweight API

RSAKeyPairGenerator generator = new RSAKeyPairGenerator(); 
generator.init(new RSAKeyGenerationParameters 
    (
     new BigInteger("10001", 16),//publicExponent 
     SecureRandom.getInstance("SHA1PRNG"),//prng 
     1024,//strength 
     80//certainty 
    )); 

AsymmetricCipherKeyPair keyPair = generator.generateKeyPair(); 

ho una conoscenza di base della RSA e la matematica che succede dietro le quinte, così ho capito che cosa publicExponent e strength sono. Presumo che lo publicExponent si riferisca ad un coprime di phi(pq) e da quello che ho raccolto può essere piccolo (come 3) purché venga usato il padding appropriato. Tuttavia, non ho idea di cosa si riferisca a certainty (qualche posto menzionato potrebbe riferirsi a una percentuale ma voglio essere sicuro). L'uso di SecureRandom è auto-esplicativo. Il numero documentation of RSAKeyGenerationParameters è completamente privo di valore (nessuna sorpresa). La mia unica ipotesi è che abbia qualcosa a che fare con la precisione dei tasti generati, ma di nuovo voglio essere sicuro. Quindi la mia domanda è quali sono i valori appropriati per certainty e publicExponent?

P.S. Si prega di non rispondere con "dipende dal contesto - quanto sicuro si desidera che l'informazione sia". E 'abbastanza sicuro assumere il più alto grado di sicurezza (es. Chiave RSA 4096-bit o superiore) se non diversamente specificato ... Gradirei anche collegamenti a fonti che danno un buon esempio dell'uso dell'API Lightweight di Bouncy Castle (non sono a tutti interessati all'implementazione della JCA o ad alcuni esempi che lo riguardano).

risposta

9

Si stanno utilizzando valori corretti per entrambi.

Il publicExponent deve essere un Fermat Number. 0x10001 (F4) è il valore consigliato corrente. 3 (F1) è noto per essere sicuro anche.

La generazione della chiave RSA richiede numeri primi. Tuttavia, è impossibile generare numeri primi assoluti. Come ogni altra biblioteca crittografica, BC usa probabili numeri primi. La certezza indica in che misura vuoi che il numero sia primo. Qualunque cosa al di sopra degli 80 rallenterà considerevolmente la generazione di chiavi.

Si noti che l'algoritmo RSA funziona ancora nell'improbabile caso in cui il numero primo non sia vero primo perché BC verifica la primità relativa.

+0

Dato che il punto del "probabile primo" è che non si può tenerlo in considerazione, come si può verificare se è relativamente primo ad un altro numero? La verifica della primità relativa non è solo un altro controllo probabilistico? – Jherico

+0

La primità relativa può essere controllata facilmente calcolando GCD. Se è 1, 2 numeri sono relativi prime. –

+0

Non * è * impossibile generare in modo definitivo numeri interi, ma è più costoso e considerato non necessario per RSA. Ueli Maurer ha dato un algoritmo veloce per questo molti anni fa. –

8

avrei dovuto approfondire il loro codice sorgente di essere "certo", ma credo che il parametro certainty viene passata al BigInteger costruttore, che dice: "La probabilità che il nuovo BigInteger rappresenta un numero primo si eccedere (1 - 1/2 certezza). Il tempo di esecuzione di questo costruttore è proporzionale al valore di questo parametro. "

Quindi, con un valore di 80, c'è meno di 1 possibilità in 2 che il numero non sia primo. Il commento suggerisce che il tempo di generazione del numero primo è lineare rispetto a questo parametro, ma è necessario verificarlo per accertarsi che si scelga di aumentarlo. Potrebbe essere sensato utilizzare un valore coerente con la dimensione della chiave che si sta utilizzando. Ad esempio, il NIST dice che una chiave RSA a 1024 bit è forte come una chiave simmetrica a 80 bit. Per una chiave RSA a 2048 bit, è possibile utilizzare una certezza di 112 bit (la dimensione simmetrica della forza equivalente) e così via.

Sembra che tu sia a conoscenza della vulnerabilità dell'utilizzo di 3 come esponente pubblico in casi particolari. Il valore 65537 è usato quasi universalmente ora.

+2

Le "vulnerabilità" di 3 come esponente pubblico sono per lo più un grande equivoco storico. 65537 è un primo esempio di culto del carico nell'informatica. 65537 non è male, ma 3 non è neanche peggiore; se 3 porta a punti di debolezza, allora stai facendo qualcos'altro che non va, e l'uso di 65537 invece probabilmente non ti salverà. –

+0

@Thomas: Per quanto riguarda l'impostazione del valore dell'esponente pubblico a 65537, ho sospettato altrettanto. Potrebbe anche essere maggiore di 65537, giusto? Qualunque primo farà? – Andrey

+2

@yamsha: l'esponente pubblico può essere qualsiasi valore che sia _relativamente primo_ in p-1 e q-1 (dove p e q sono i fattori primi del modulo RSA). Il generatore di chiavi RSA utilizza l'esponente pubblico fornito come parametro e seleziona i parametri appropriati peq. Questo esclude valori pari. Qualsiasi numero intero dispari (tranne 1) può essere usato come esponente pubblico; l'utilizzo di un primo solo lo rende leggermente più semplice per il generatore di chiavi. Il costo delle operazioni a chiave pubblica aumenta con le dimensioni dell'esponente pubblico, quindi probabilmente vorrai mantenerlo piccolo. –

3

Una buona referenza è FIPS PUB 186-3. In particolare, l'appendice B, sezione 3, ha molti parametri di sicurezza, così come algoritmi di prime generazione.certainty è il numero di iterazioni del test di primalità di Miller-Rabin.

2

See this answer on crypto.stackexchange.com per ulteriori informazioni su come calcolare il valore della certezza.

Anteprima della risposta di Paolo Ebermann:

Certezza di x bit significa che la probabilità che qualcosa (in questo caso p essere primo) non conformi è più piccola di 2-x. Questa è la stessa probabilità di indovinare correttamente un valore di x bit casuale sul primo tentativo di , da cui il nome.

Come selezionare x? Vogliamo che la probabilità di p (e q) di non essere primo sia sufficientemente piccola che una probabilità di errore in questo punto non è più grande di altri modi in cui il sistema potrebbe essere rotto - come indovinare una chiave simmetrica , factoring del modulo ecc.

Quindi qui una tabella di corrispondenza delle dimensioni della chiave simmetrica e asimmetrica dovrebbe aiutare. http://www.keylength.com/ Scegli la stessa certezza principale di come sceglieresti una dimensione della chiave simmetrica che accompagni l'utilizzo della chiave pubblica.