Geração de pares 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úblicos / privados RSA
O GnuPG / OpenPGP, por exemplo, tem um wizzard sendo invocado 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
pela mesma coisa, que está gerando um par de chaves RSA 2048 bit, posso perceber - na mesma máquina - tempos muito diferentes.
openssl
gera um par de chaves em cerca de 0,5s
gpg
leva cerca de 30 e até anúncios "movem 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)
Selecione o tipo de chave que você deseja: (1) RSA e RSA (padrão) (2) DSA e Elgamal (3) DSA (somente assinatura) (4) RSA (somente sinal) Sua seleção?
Portanto, realmente a única coisa gerada é um par de chaves RSA de 2048 bits. No entanto, a diferença horária está diminuindo 30 segundos?
Para mim, parece que o gpg está perdendo 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 do RSA deve ter como entrada alguma aleatoriedade. Por isso, para ter certeza de que o openssl veloz não é simplesmente o resultado do uso de alguma aleatoriedade armazenada, eu o executo várias vezes
time bash -c "para i em {1..50}; do openssl genrsa -out / dev / null 2048; pronto;"
que produz
0m16.577s reais usuário 0m16.309s sys 0m0.092s
ou seja, para 50 chaves RSA de 2048 bits (presumo que exista muita entropia / aleatoriedade), o openssl ainda precisa apenas de 16 segundos. Minha suposição aqui seria, portanto, a "resposta" que openssl deve ser quebrada. Afinal, 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 o uso do openssl /dev/urandom
e o gpg /dev/random
que, se verdadeiro, poderiam explicar a diferença de horário. Meu problema é que eu não sei como descobrir isso, para verificar isso.
update2
Para testar a fonte aleatória do openssl, usei
strace -xe trace = arquivo, ler, escrever, fechar 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
) são suficientes para o par de chaves RSA de 2048 bits no openssl. Portanto, é tão rápido!
Medidas
A geração de pares de chaves RSA de 2048 bits significa
- Apenas 32 bytes
/dev/urandom
(usando o openssl) - 300 bytes de
/dev/random
(usando o openPGP GNU Privacy Guard)
isso explica, é claro, a diferença de horário!
/dev/urandom
gpg diz "1 byte/dev/random
não é bom o suficiente para 1 byte de forma aleatória". Isso não significa que as chaves openssl são mais propensas a "pouca aleatoriedade" em comparação com os gpg?