Генерация пар ключей 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?