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?/dev/urandom
era lo suficientemente bueno para fines de cifrado. En la lista de correo de GnuPG probablemente se reiría de eso por eso. AFAIK es imposible demostrar que ciertos datos son puramente aleatorios. Puede encontrar no aleatoriedad, pero solo donde busca exactamente ese patrón./dev/random
mientras openssl usa solo 32bytes de/dev/urandom
parece sugerir un riesgo de seguridad potencial para el usuario cauteloso que quiere un par de claves RSA de 2048 bits. Por lo tanto, optaría por gpg. 32bytes parece poco awefully/dev/urandom
es que (en Linux) no se bloquea antes de ser sembrada directamente después del arranque. Una vez que se haya sembrado, permanecerá seguro para siempre.Su sugerencia de que esta diferencia se debe a que
openssl
utiliza / dev / urandom ygpg
utiliza/dev/random
es correcta.Puede ver la entropía disponible que baja mientras genera claves con el
gpg
uso de:Utilicé un programa para generar la descripción de los pasos para configurar una tarjeta inteligente OpenGPG
gpg
, por lo que tuve que ejecutargpg
varias veces hasta que todo funcionó según lo previsto. Después de las ejecuciones iniciales, noté que/dev/random
no tendría suficiente entropía y gpg simplemente se detendría esperando que se acumule una nueva entropía.Escribí un pequeño programa para proporcionar datos adicionales no aleatorios, y al hacerlo
gpg
no se "detendría" sino que generaría las claves casi de inmediato: es bueno probar que el script se ejecuta correctamente, pero por supuesto no es algo que debas hacer al generar tu verdadero llaves.El programa para acelerar
gpg
( no usar en situaciones reales ):Cuando ejecuto esto mientras
entropy_avail
veo, puedo ver que la entropía disponible sube a más de 3800.fuente
cat
por sí misma no drena la entropía? ¿Tiene alguna evidencia o fuente que indique los usos de gpg/dev/random
que perfeccionarían la respuesta? Por último, ¿eso también significa que openssl genera pares de claves RSA de menor calidad que gqg?Unattended key generation
en el archivo/usr/share/doc/packages/gpg2/DETAILS
(o lo que sea que esté en su distribución). La/dev/random
evidencia está en mi respuesta.read
shell incorporado:while read -r < /proc/sys/kernel/random/entropy_avail; do clear; date; printf '\nAvailable entropy: %s bytes\n' "$REPLY"; sleep 1; done