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?/dev/urandom
era boa o suficiente para fins de criptografia. Na lista de discussão do GnuPG, ele provavelmente seria motivo de riso por isso. AFAIK é impossível provar que certos dados são puramente aleatórios. Você pode encontrar não aleatoriedade, mas apenas onde você procura exatamente esse padrão./dev/random
enquanto o openssl usa apenas 32 bytes de/dev/urandom
parece sugerir um risco potencial à segurança do usuário cauteloso, como deseja um par de chaves RSA de 2048 bits. Eu, portanto, optar por gpg. 32bytes parece terrivelmente pequeno/dev/urandom
é que (no linux) não é bloqueada antes de ser propagada diretamente após a inicialização. Uma vez semeado, permanecerá seguro para sempre.Sua sugestão de que essa diferença ocorre porque
openssl
usa / dev / urandom egpg
usos/dev/random
está correto.Você pode assistir a entropia disponível diminuindo enquanto gera chaves
gpg
usando:Eu usei um programa para gerar a descrição das etapas para a configuração de um cartão inteligente OpenGPG
gpg
, então tive que executargpg
várias vezes até que tudo desse certo. Após as execuções iniciais, notei que/dev/random
não haveria entropia suficiente e o gpg ficaria parado aguardando a acumulação de nova entropia.Escrevi um pequeno programa para fornecer dados não aleatórios extras e, ao fazê-lo
gpg
, não "pararia", mas geraria as chaves quase imediatamente: bom para testar o script para executar corretamente, mas é claro que não é algo que você deve fazer ao gerar seu real chaves.O programa para acelerar
gpg
( não use em situações reais ):Quando eu executo isso enquanto assisto
entropy_avail
, vejo a entropia disponível subir para mais de 3800.fonte
cat
por si só ainda não drena a entropia? Você tem alguma evidência ou fonte que diz/dev/random
que o uso de gpg aperfeiçoaria a resposta? Por fim, isso também significa que o openssl gera pares de chaves RSA de qualidade inferior ao gqg?Unattended key generation
no arquivo/usr/share/doc/packages/gpg2/DETAILS
(ou o que quer que esteja na sua distribuição). A/dev/random
evidência está na minha resposta.read
builtin shell:while read -r < /proc/sys/kernel/random/entropy_avail; do clear; date; printf '\nAvailable entropy: %s bytes\n' "$REPLY"; sleep 1; done