Geração de par de chaves RSA 2048: via openssl 0.5s via gpg 30s, por que a diferença
Existem vários programas que podem gerar pares de chaves públicas / privadas RSA
GnuPG / OpenPGP, por exemplo, tem um wizzard sendo enviado via
gpg --gen-key
O OpenSSL pode gerar um par de chaves usando essas linhas de comando
openssl genrsa -out testkey.private 2048
openssl rsa -in testkey.private -pubout -out testkey.public
para a mesma coisa, que está gerando um par de chaves RSA 2048 bit
Eu posso perceber - na mesma máquina - momentos bem diferentes.
openssl
gera um par de chaves em cerca de 0,5s
gpg
demora cerca de 30 e até anúncios "move o mouse para gerar aleatoriedade / entropia"
A diferença pode ser explicada?
Eu sei que o gpg faz um pouco mais do que apenas a criação da chave RSA, mas eu escolho especificamente a opção (4)
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
Your selection?
Portanto, a única coisa gerada é um par de chaves RSA de 2048 bits.
No entanto, a diferença de tempo é de 30 segundos?
Para mim, parece que ou o gpg está desperdiçando tempo desnecessariamente ou o OpenSSL não está esperando tempo suficiente e, portanto, cria chaves inseguras.
Minha pergunta é o que poderia explicar a diferença?
Atualizar
A criação de RSA deve tomar como entrada alguma aleatoriedade. Portanto, para ter certeza de que o speedy openssl não é simplesmente o resultado de usar alguma aleatoriedade armazenada, eu o rotulo várias vezes
time bash -c "for i in {1..50}; do openssl genrsa -out /dev/null 2048 ; done;"
que produz
real 0m16.577s
user 0m16.309s
sys 0m0.092s
que é que para 50 2048bits chaves RSA (suponho que preciso de muita entropia / aleatoriedade) openssl ainda só precisava de 16 segundos. Minha suposição aqui seria, portanto, a "resposta" que deve ser quebrada. Afinal, eu desconfio que meu Linux (um kernel 3.2.0-59) tenha se tornado tão bom em gerar aleatoriedade.
Talvez a diferença seja simplesmente que openssl usa /dev/urandom
e
gpg usa /dev/random
, o que, se for verdade, poderia explicar a diferença de tempo, meu problema é que eu não sei como descobriria isso, para verificar isso.
update2
Para testar a fonte do random de openssl usei
strace -xe trace=file,read,write,close openssl genrsa -out testkey5.private 2048 2>&1 | grep random -A1
que produz
open("/dev/urandom", O_RDONLY|O_NOCTTY|O_NONBLOCK) = 4
read(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
então parece que 32 bytes de /dev/urandom
(não o "melhor" /dev/random
) é suficiente para o par de chaves RSA de 2048 bits no openssl. Portanto, é tão rápido!
Medidas
2048bit Geração de par de chaves RSA significa
- 32 bytes de apenas
/dev/urandom
(usando openssl)
- 300 bytes de
dev/random
(usando o openPGP GNU Privacy Guard)
isso explica, claro, a diferença de tempo!