Генерация пар ключей RSA 2048: через openssl 0.5s через gpg 30s, почему разница Есть несколько программ, которые могут генерировать открытые / закрытые пары ключей RSA
Например, в GnuPG / OpenPGP волшебник вызывается через
gpg --gen-key
OpenSSL может генерировать пару ключей, используя эти командные строки
openssl genrsa -out testkey.private 2048 openssl rsa -in testkey.private -pubout -out testkey.public
для той же самой вещи, которая генерирует пару ключей RSA 2048, которую я могу воспринимать - на одной и той же машине - очень разные времена.
openssl
генерирует пару ключей примерно за 0,5 с,
gpg
занимает около 30, и даже реклама "двигать мышь, чтобы генерировать случайность / энтропию"
Можно ли объяснить разницу? Я знаю, что gpg делает немного больше, чем просто создание ключа RSA, но я специально выбрал вариант (4)
Пожалуйста, выберите, какой ключ вы хотите: (1) RSA и RSA (по умолчанию) (2) DSA и Эльгамал (3) DSA (только подпись) (4) RSA (только подпись) Ваш выбор?
Поэтому на самом деле генерируется только 2048-битная пара ключей RSA. И все же разница во времени уменьшается на 30 секунд?
Мне кажется, что либо gpg напрасно тратит время, либо OpenSSL не ждет достаточно времени и, следовательно, создает небезопасные ключи.
Мой вопрос, что может объяснить разницу?
Обновить
Создание RSA должно быть случайным. Следовательно, чтобы убедиться, что быстрый openssl - это не просто результат использования некоторой накопленной случайности, я запускаю его несколько раз
time bash -c "для i в {1..50}; сделать openssl genrsa -out / dev / null 2048; сделано;"
что дает
реальный 0m16.577s пользователь 0m16.309s sys 0m0.092s
что означает, что для 50 2048-битных ключей RSA (я полагаю, нужно много энтропии / случайности) openssl все еще требуется всего 16 секунд. Мое предположение здесь, следовательно, будет «ответом», что openssl должен быть нарушен. В конце концов, я не доверяю тому, что мой Linux (ядро 3.2.0-59) настолько хорош в генерировании случайности.
Возможно, разница в том, что openssl использует /dev/urandom
и gpg использует, /dev/random
что если true может объяснить разницу во времени, то моя проблема в том, что я не знаю, как я узнаю об этом, чтобы это проверить.
Update2
Чтобы проверить источник случайного openssl я использовал
strace -xe trace = файл, чтение, запись, закрытие openssl genrsa -out testkey5.private 2048 2> & 1 | grep random -A1
что дает
open ("/ dev / urandom", O_RDONLY | O_NOCTTY | O_NONBLOCK) = 4 читать (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
так что кажется, что 32 байта из /dev/urandom
(не «лучшего» /dev/random
) достаточно для 2048-битной пары ключей RSA в openssl. Поэтому так быстро!
измерения
2048bit RSA означает создание пары ключей
- Только 32 байта
/dev/urandom
(используя openssl) - 300 байт
/dev/random
(используя openPGP GNU Privacy Guard)
это объясняет конечно разницу во времени!
/dev/urandom
gpg, даже говорит, что «1 байт/dev/random
недостаточно для 1 байта случайного числа». Не означает ли это, что ключи openssl более склонны к "слишком малой случайности" по сравнению с ключами gpg?/dev/urandom
он достаточно хорош для криптографических целей. В списке рассылки GnuPG он, вероятно, будет смеяться за это. AFAIK невозможно доказать, что определенные данные являются чисто случайными. Вы можете найти неслучайность, но только там, где вы ищете именно эту модель./dev/random
то время как openssl использует только 32 байта,/dev/urandom
кажется, предполагает потенциальный риск безопасности для осторожного пользователя, который хочет 2048-битную пару ключей RSA. Я бы поэтому выбрал gpg. 32 байта кажется ужасно маленьким/dev/urandom
является то, что (в Linux) он не блокируется, пока не будет посеян непосредственно после загрузки. Как только он будет посеян, он останется в безопасности навсегда.Ваше предположение, что это различие, потому что
openssl
использует / dev / urandom иgpg
использует/dev/random
правильно.Вы можете наблюдать снижение доступной энтропии при генерации ключей с
gpg
помощью:Я использовал программу для генерации описания шагов по настройке смарт-карты OpenGPG с помощью
gpg
, поэтому мне пришлось запускатьсяgpg
несколько раз, пока все не заработало как задумано. После начальных прогонов я заметил,/dev/random
что энтропии будет недостаточно, и gpg просто остановится в ожидании накопления новой энтропии.Я написал небольшую программу для предоставления дополнительных неслучайных данных, и при этом
gpg
не "останавливался", а генерировал ключи почти сразу: это удобно для проверки правильности работы скрипта, но, конечно, это не то, что вы должны делать при генерации своего реального ключи.Программа для ускорения
gpg
( не используйте в реальных ситуациях ):Когда я запускаю это во время просмотра,
entropy_avail
я вижу, что доступная энтропия возрастает до 3800.источник
cat
сам по себе не истощает энтропию? Есть ли у вас какие-либо доказательства или источник, который сообщает об использовании gpg,/dev/random
который бы улучшил ответ? Наконец, это также означает, что openssl генерирует пары ключей RSA меньшего качества, чем gqg?Unattended key generation
в файле/usr/share/doc/packages/gpg2/DETAILS
(или в любом другом месте вашего дистрибутива)./dev/random
Доказательства в моем ответе.read
встроенной оболочки:while read -r < /proc/sys/kernel/random/entropy_avail; do clear; date; printf '\nAvailable entropy: %s bytes\n' "$REPLY"; sleep 1; done