Функция gcry_pk_genkey в libgcrypt работает крайне медленно

Я новичок в libgcrypt версия 1.6.1, и сейчас я пытаюсь создать пару открытый / закрытый ключ для rsa алгоритм.

Я перечислю код, который я использую ниже. То, что я пойман в ловушку, является gcry_pk_genkey функция, в которой это может занять более 1,5 часов, но никогда не вернуться.

void gcrypt_init()
{
 if (!gcry_check_version (GCRYPT_VERSION))
{
    xerr("gcrypt: library version mismatch");
}

gcry_error_t err = 0;

err &= gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN);

err &= gcry_control (GCRYCTL_INIT_SECMEM, 16384, 0);

err &= gcry_control (GCRYCTL_RESUME_SECMEM_WARN);
err &= gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);

if (err) {
    xerr("gcrypt: failed initialization");
}
}


#include "gcry.hh"
#include <cstdio>
#include <cstdlib>
#include <cstring>

int main(int argc, char** argv)
{
if (argc != 2) {
    fprintf(stderr, "Usage: %s <rsa-keypair.sp>\n", argv[0]);
    xerr1("Invalid arguments.");
}

gcrypt_init();

gcry_error_t err = 0;
gcry_sexp_t rsa_parms;
gcry_sexp_t rsa_keypair;

err &= gcry_sexp_build(&rsa_parms, NULL, "(genkey (rsa (nbits 4:2048)))");
if (err) {
    xerr1("gcrypt: failed to create rsa params");
}

err &= gcry_pk_genkey(&rsa_keypair, rsa_parms); <------- This function call
if (err) {
    xerr1("gcrypt: failed to create rsa key pair");
}

char* fname = argv[1];
err = gcrypt_sexp_to_file(fname, rsa_keypair, 1 << 16);

    printf("i am here3\n");
gcry_sexp_release(rsa_keypair);
gcry_sexp_release(rsa_parms);

return err;
}

Я знаю, что эта функция can take a few minutes. Your computer needs to gather random entropy., Тем не менее, я не могу поверить, что это может занять почти 2 часа без исключения возврата / броска...

Я использую 32-битную Ubuntu 14.04, внутри virtualbox Экземпляр ВМ. Я что-то здесь не так делаю?

1 ответ

Решение

Не могли бы вы проверить скорость вашего /dev/random? Если это ужасно медленно (возможно, потому что другие процессы требуют слишком много энтропии), то /dev/random будет блокировать, пока энтропия не будет собрана. Это также может быть проблемой для безголовых машин. У меня наверняка были проблемы со скоростью генерации случайных чисел в Ubuntu на моем ноутбуке.

Вы также можете указать transient-key (как флаг в выражении s) использовать несколько менее безопасный генератор случайных чисел, что, вероятно, означает меньшую энтропию и, следовательно, меньшую блокировку.

Маловероятно, что время, необходимое для проверки того, что число простое, занимает столько времени. И хотя время нахождения простого (или двух) неизвестно заранее, маловероятно, что что-либо, кроме блокировки для генерации случайных чисел, может вызвать такие огромные времена генерации.

Другие вопросы по тегам