Вопросы по генерации ключей RSA с помощью GnuPG

Вопросы по генерации ключей RSA с помощью GnuPG

В настоящее время я работаю над школьным проектом, изучая ключи RSA для лучшего понимания их теоретически и практически. Часть проекта состоит из эксперимента, и я решил провести тестирование и посмотреть, насколько большой будет нагрузка на ЦП при генерации ключей RSA разной длины. Я также хотел бы сохранить время в качестве точки данных, если мне нужно будет прийти к выводу.

На компьютере установлена ​​ОС Ubuntu 16.04, а приложения загружаются из репозиториев по умолчанию.

План состоит в том, чтобы использовать GnuPG для генерации ключей RSA разной длины (1024, 2048 и 4096) и GNU Time для получения рабочей нагрузки процессора и времени выполнения процесса. Процесс будет автоматизирован с помощью скрипта на Python и будет выглядеть примерно так:

  1. Для длины в [1024, 2048, 4096]:

    1.1. Для X раз:

    1.1.1. Выполнение команды Gnu PG и мониторинг системных ресурсов

    1.1.2 Запись использования системных ресурсов в файл

После этого я построю несколько графиков, чтобы проверить, верна ли моя гипотеза.

Но у меня есть несколько вопросов по реализации моего теста GnuPG. Объяснение того, как я это реализую, будет после вопросов. Мои вопросы:

  • Делают ли эти настройки то, что мне нужно?
  • Можно ли как-то отключить автоматическое создание сертификатов отзыва?
  • Почему генерация некоторых ключей занимает гораздо больше времени?
  • Почему GnuPG выдает ответ, что создание ключей заняло 0 CPU-секунд в пользовательском пространстве? Это делается в другом процессе?
  • Почему параметр нагрузки ЦП показывает только значение (0 < ЦП), когда на создание ключей ушло меньше секунды (часы > 1)?

Читая руководство, кажется, что самый простой способ генерации ключей — --batchвключить эту опцию. Я задал опции в файле со следующими инструкциями:

# 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!

Команда, которая выполняет этот файл, состоит из двух частей: Gnu Time и GnuPG. Команда GNU Time выглядит следующим образом:

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

А команда GnuPG следующая.

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

Команда, которую я выполняю в своей оболочке (fish shell, если это важно), выглядит следующим образом (GNU Time + GnuPG):

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

Вывод команды:

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%

решение1

GnuPG считывает из /dev/random, который блокируется, когда недостаточно энтропии (что является спорным поведением). Фактические вычислительные усилия довольно незначительны. Вы также можете заметить, что первый запуск/несколько запусков завершаются быстрее, поскольку пул энтропии все еще заполнен "свежими битами". Я рекомендую запустить watch cat /proc/sys/kernel/random/entropy_availв дополнительном терминале, чтобы понять, когда GnuPG переходит в режим "низкой энтропии".

На текущих аппаратных платформах процессы, заблокированные вводом-выводом или спящим режимом, будут переведены в фоновый режим, поэтому процессорное время не будет учитываться.

$ 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%

Это также видно при копировании некоторых байтов /dev/random(что может занять довольно много времени, особенно в виртуальных машинах):

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%

Наконец, это также объясняет, почему быстрые итерации имели гораздо более высокую нагрузку на ЦП: поскольку процессы блокировались в режиме ожидания ввода-вывода в течение гораздо меньшего периода времени, доля фактического времени вычислений в полном времени выполнения была намного больше.

Связанный контент