Generación de pares de claves RSA 2048: a través de openssl 0.5s a través de gpg 30s, por qué la diferencia Hay varios programas que pueden generar pares de claves públicos / privados de RSA
GnuPG / OpenPGP, por ejemplo, tiene un wizzard siendo invocado a través de
gpg --gen-key
OpenSSL puede generar un par de claves usando estas líneas de comando
openssl genrsa -out testkey.private 2048 openssl rsa -in testkey.private -pubout -out testkey.public
por lo mismo, eso es generar un par de claves RSA 2048 bit que puedo percibir, en la misma máquina, tiempos muy diferentes.
openssl
genera un par de claves en aproximadamente 0.5s,
gpg
toma aproximadamente 30 e incluso los anuncios "mueven el mouse para generar aleatoriedad / entropía"
¿Se puede explicar la diferencia? Sé que gpg hace algo más que la creación de la clave RSA, pero elijo específicamente la opción (4)
Seleccione qué tipo de clave desea: (1) RSA y RSA (predeterminado) (2) DSA y Elgamal (3) DSA (solo signo) (4) RSA (solo señal) ¿Tu seleccion?
Por lo tanto, realmente lo único generado es un par de claves RSA de 2048 bits. ¿Sin embargo, la diferencia horaria es de 30 segundos?
Para mí, parece que o gpg está perdiendo tiempo innecesariamente o OpenSSL no está esperando suficiente tiempo y, por lo tanto, crea claves inseguras.
Mi pregunta es, ¿qué podría explicar la diferencia?
Actualizar
La creación de RSA debe tomar como entrada algo de aleatoriedad. Por lo tanto, para asegurarme de que el openssl rápido no es simplemente el resultado de usar una aleatoriedad almacenada, la ejecuté varias veces
time bash -c "para i en {1..50}; do openssl genrsa -out / dev / null 2048; hecho;"
cuyos rendimientos
0m16.577s reales usuario 0m16.309s sys 0m0.092s
que es que para 50 claves de 2048 bits RSA (supongo que se necesita mucha entropía / aleatoriedad), openssl todavía solo necesitó 16 segundos. Por lo tanto, mi suposición aquí sería la "respuesta" que openssl debe romperse. Después de todo, desconfío de que mi Linux (un kernel 3.2.0-59) se haya vuelto tan bueno en generar aleatoriedad.
Tal vez la diferencia es simplemente que los usos de openssl /dev/urandom
y gpg /dev/random
que, de ser cierto, podrían explicar la diferencia horaria, mi problema es que no sé cómo averiguaría esto, para verificarlo.
actualización2
Para probar la fuente del azar de openssl utilicé
strace -xe trace = archivo, leer, escribir, cerrar openssl genrsa -out testkey5.private 2048 2> & 1 | grep random -A1
cuyos rendimientos
abierto ("/ dev / urandom", O_RDONLY | O_NOCTTY | O_NONBLOCK) = 4 leer (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
entonces parece que 32 bytes de /dev/urandom
(no el "mejor" /dev/random
) es suficiente para el par de claves RSA de 2048 bits en openssl. ¡Por eso es tan rápido!
Mediciones
La generación de pares de claves RSA de 2048 bits significa
- Solo 32 bytes
/dev/urandom
(usando openssl) - 300 bytes de
/dev/random
(usando openPGP GNU Privacy Guard)
¡Esto explica, por supuesto, la diferencia horaria!
/dev/urandom
gpg de menor calidad, incluso dice "1 byte/dev/random
no es lo suficientemente bueno para 1 byte de aleatorio". ¿No significa esto que las claves openssl son más propensas a "muy poca aleatoriedad" en comparación con las GPG?