Generazione di keypair RSA 2048: tramite openssl 0,5s tramite gpg 30s, perché la differenza Esistono diversi programmi che possono gerarchizzare i keypair pubblici / privati RSA
GnuPG / OpenPGP, ad esempio, ha un wizzard invocato tramite
gpg --gen-key
OpenSSL può generare una coppia di chiavi usando queste righe di comando
openssl genrsa -out testkey.private 2048 openssl rsa -in testkey.private -pubout -out testkey.public
per la stessa cosa, che sta generando una coppia di chiavi RSA 2048 bit che riesco a percepire - sulla stessa macchina - tempi molto diversi.
openssl
genera una coppia di chiavi in circa 0,5 secondi
gpg
richiede circa 30 e persino annunci "sposta il mouse per generare casualità / entropia"
La differenza può essere spiegata? So che gpg fa un po 'di più della semplice creazione della chiave RSA, tuttavia scelgo specificamente l'opzione (4)
Seleziona il tipo di chiave che desideri: (1) RSA e RSA (impostazione predefinita) (2) DSA ed Elgamal (3) DSA (solo segno) (4) RSA (solo segno) La tua selezione?
Quindi davvero l'unica cosa generata è una coppia di chiavi RSA a 2048 bit. Eppure la differenza di tempo sta crollando a 30 secondi?
A me sembra che o gpg stia sprecando inutilmente tempo o OpenSSL non stia aspettando abbastanza tempo e quindi crea chiavi insicure.
La mia domanda è: cosa potrebbe spiegare la differenza?
Aggiornare
La creazione di RSA deve prendere come input un po 'di casualità. Quindi per essere sicuro che il rapido openssl non sia semplicemente il risultato dell'uso di una casualità memorizzata, l'ho eseguito in batch più volte
time bash -c "per i in {1..50}; do openssl genrsa -out / dev / null 2048; done;"
che cede
0m16.577 reali utente 0m16.309s sys 0m0.092s
il che è che per 50 chiavi RSA a 2048 bit (presumo occorra molta entropia / casualità) si apre ancora solo 16 secondi. La mia ipotesi qui sarebbe quindi la "risposta" che openssl deve essere rotta. Dopotutto sono diffidente sul fatto che il mio Linux (un kernel 3.2.0-59) sia diventato così eccezionale nel generare casualità.
Forse la differenza è semplicemente che openssl usa /dev/urandom
e gpg usa /dev/random
che se vero potesse spiegare la differenza di tempo il mio problema è che non so come lo scoprirò, per verificarlo.
Update2
Per testare la fonte di random di openssl ho usato
strace -xe trace = file, leggi, scrivi, chiudi openssl genrsa -out testkey5.private 2048 2> & 1 | grep random -A1
che cede
aperto ("/ dev / urandom", O_RDONLY | O_NOCTTY | O_NONBLOCK) = 4 leggi (4, "\ x21 \ xd8 \ xaa \ xf1 \ x2b \ x5f \ x4a \ x89 \ x5d \ x6c \ x58 \ x82 \ xc1 \ x88 \ x21 \ x04 \ xfa \ x5b \ x18 \ x98 \ x8a \ x34 \ x2b \ xe3 \ xf3 \ xc0 \ xb1 \ xef \ xfb \ x44 \ x15 \ x09 ", 32) = 32
quindi sembra che 32 byte da /dev/urandom
(non il "migliore" /dev/random
) siano sufficienti per la coppia di chiavi RSA a 2048 bit in openssl. Quindi è così veloce!
misure
Mezzi di generazione della coppia di chiavi RSA a 2048 bit
- Solo 32 byte
/dev/urandom
(usando openssl) - 300 byte di
/dev/random
(usando openPGP GNU Privacy Guard)
questo spiega ovviamente la differenza di tempo!
/dev/urandom
gpg di qualità inferiore dice anche "1 byte/dev/random
non è abbastanza buono per 1 byte di casuale". Ciò non significherebbe che le chiavi di openssl sono più inclini a "troppa casualità" rispetto a quelle di gpg?