Questões relacionadas à geração de chaves RSA com o GnuPG

2

Atualmente estou fazendo um projeto de ensino médio estudando chaves RSA para melhor compreendê-los teoricamente e praticamente. Uma parte do projeto consiste em um experimento, e eu escolho testar e ver quão grande a carga de trabalho será para a CPU ao gerar chaves RSA de diferentes comprimento. Eu também gostaria de salvar o tempo como um ponto de dados, se eu precisar chegar a uma conclusão.

A máquina está executando o Ubuntu 16.04 e os aplicativos são baixados dos repositórios padrão.

O plano é usar o GnuPG para gerar chaves RSA de comprimento diferente (1024, 2048, e 4096) e GNU Time para obter a carga de trabalho da CPU e o tempo para executar o processo. O processo será automatizado com um script python e será parecido com isto:

  1. Para tamanho em [1024, 2048, 4096]:

    1.1. Por X vezes:

    1.1.1. Execute o comando Gnu PG e monitore os recursos do sistema

    1.1.2. Escreva o uso de recursos do sistema para arquivar

Posteriormente, planejarei alguns gráficos para ver se minha hipótese está correta.

Mas eu tenho algumas perguntas sobre a implementação do meu teste GnuPG. Uma explicação de como minha implementação virá depois das perguntas. Minhas perguntas são:

  • Essa configuração faz o que eu quero fazer?
  • Posso desativar a criação automática de certificados de revogação?
  • Por que demora muito mais para gerar algumas chaves?
  • Por que o GnuPG dá a resposta que demorou 0 CPU-segundos em userspace para a criação das chaves? Isso é feito em outro processo?
  • Por que o parâmetro de carga de trabalho da CPU mostra apenas um valor (0 < CPU) quando Demorou menos de um segundo (relógio de parede > 1) para criar as chaves?

Lendo o manual parece que a maneira mais simples de gerar as chaves está com a opção --batch ativada. Eu configurei as opções em um arquivo com as seguintes instruções:

# Text syntax in this file
#%dry-run

%echo Generating RSA key...

# Don't ask after passphrase
%no-protection

Key-type: RSA
Key-Length: 1024
Name-Real: Real Name
Name-Email: [email protected]
Expire-Date: 0

# Generate RSA key
%commit

%echo Done!

O comando que executa este arquivo tem duas partes, a parte do Gnu Time e a parte do GnuPG. O comando GNU Time tem a seguinte aparência:

$ time --format="Wall clock: %e[s], CPU (userspace): %U[s], CPU (workload): %P%"

E o comando GnuPG é o seguinte.

$ gpg2 --gen-key --homedir=./rsa-keys --batch [filename]

O comando que eu executo na minha shell (fish shell se é importante) é o seguinte (GNU Time + GnuPG):

$ time --format="Wall clock: %e[s], CPU (userspace): %U[s], CPU (workload): %P%" gpg2 --gen-key --homedir=./rsa-keys --batch [filename]

Saída do comando:

Wall clock: 36.83[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 0.04[s], CPU (userspace): 0.00[s], CPU (workload): 8%
Wall clock: 4.76[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 72.39[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 57.52[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 84.71[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 63.32[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 51.10[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 47.58[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 64.72[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 0.05[s], CPU (userspace): 0.00[s], CPU (workload): 6%
Wall clock: 0.03[s], CPU (userspace): 0.00[s], CPU (workload): 11%
Wall clock: 29.62[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 55.02[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 36.08[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 42.92[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 40.41[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 204.36[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 246.42[s], CPU (userspace): 0.00[s], CPU (workload): 0%
Wall clock: 51.50[s], CPU (userspace): 0.00[s], CPU (workload): 0%
    
por dumbl3d0re 20.05.2017 / 19:33

1 resposta

2

O GnuPG lê a partir de /dev/random , que bloqueia quando não há entropia suficiente disponível ( que é um comportamento discutível ). O esforço computacional real é bastante insignificante. Você também pode observar que a primeira execução / poucas execuções terminam mais rápido, já que o pool de entropia ainda estava cheio de "bits novos". Eu recomendo rodar watch cat /proc/sys/kernel/random/entropy_avail em um terminal adicional para entender quando o GnuPG entra em modo de "baixa entropia".

Nas plataformas de hardware atuais, os processos bloqueados por IO ou suspensão serão colocados em segundo plano, portanto, nenhum tempo de CPU será contabilizado.

$ time --format='Wall clock: %e[s], CPU (userspace): %U[s], CPU (workload): %P%' sleep 5
Wall clock: 5.00[s], CPU (userspace): 0.00[s], CPU (workload): 0%

Isso também é visível ao copiar alguns bytes de /dev/random (o que pode levar algum tempo, especialmente em máquinas virtuais):

time --format='Wall clock: %e[s], CPU (userspace): %U[s], CPU (workload): %P%' dd if=/dev/random of=/dev/null bs=1 count=512
512+0 records in
512+0 records out
512 bytes copied, 210.672 s, 0.0 kB/s
Wall clock: 210.67[s], CPU (userspace): 0.00[s], CPU (workload): 0%

Finalmente, isso também explica por que as iterações rápidas têm uma carga de trabalho de CPU muito maior: como os processos foram bloqueados em E / S, espere por um período de tempo muito menor, a parte do tempo real de execução é muito maior .

    
por 20.05.2017 / 20:07

Tags