【问题标题】:gcry_pk_genkey function is extremely slow in libgcryptgcry_pk_genkey 函数在 libgcrypt 中非常慢
【发布时间】:2016-09-05 17:31:06
【问题描述】:

我是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 个小时才能没有返回/抛出异常......

我在 virtualbox VM 实例中使用 32 位 Ubuntu 14.04。我在这里做错什么了吗?

【问题讨论】:

    标签: encryption cryptography rsa libgcrypt


    【解决方案1】:

    你能测试一下/dev/random 的速度吗?如果这非常慢(可能是因为其他进程需要太多熵),那么/dev/random 将阻塞直到收集到熵。这也可能是无头机器上的问题。我在笔记本电脑上的 Ubuntu 上生成随机数的速度确实存在问题。

    您还可以指定transient-key(作为 s 表达式中的标志)以使用安全性稍差的随机数生成器,这可能意味着更少的熵,因此也更少阻塞。

    验证一个数是否为素数所花费的时间不太可能花费那么长的时间。即使不知道找到素数(或两个素数)的时间提前了,但除了阻塞随机数生成之外的任何事情都不太可能导致如此巨大的生成时间。

    【讨论】:

    • 您好 Maarten,非常感谢您的建议。您能否详细说明“不太安全的随机数生成器”?我应该如何配置该设置?谢谢!
    • 它是in the manual,用作字符串中的标志。自己没试过。如果这是问题所在,您可能想看看如何处理缓慢的/dev/random,但其他进程也可能遇到问题。
    • 你是对的......我试过cat /dev/random,它产生了一些输出,然后卡住了......
    • 我在主机中生成了密钥,现在一切看起来都很好。谢谢!
    • 不客气。如果您确实需要 VM 和 /dev/random,您可能需要使用 this 来添加熵。
    猜你喜欢
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    相关资源
    最近更新 更多