Encryption 在libgcrypt中,gcry_pk_genkey函数的速度非常慢

Encryption 在libgcrypt中,gcry_pk_genkey函数的速度非常慢,encryption,cryptography,rsa,libgcrypt,Encryption,Cryptography,Rsa,Libgcrypt,我是libgcrypt1.6.1版的新手,现在我正在尝试为rsa算法生成公钥/私钥对 我在下面列出了我正在使用的代码。我被困在gcry\u pk\u genkey功能中,它可能需要超过1.5个小时,但永远不会返回 void gcrypt_init() { if (!gcry_check_version (GCRYPT_VERSION)) { xerr("gcrypt: library version mismatch"); } gcry_error_t err = 0; err &

我是
libgcrypt
1.6.1版的新手,现在我正在尝试为
rsa
算法生成公钥/私钥对

我在下面列出了我正在使用的代码。我被困在
gcry\u pk\u 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;
}
void gcrypt_init()
{
如果(!gcry\u检查版本(GCRYPT\u版本))
{
xerr(“gcrypt:库版本不匹配”);
}
gcry\u error\u t err=0;
err&=gcry\u control(GCRYCTL\u SUSPEND\u SECMEM\u WARN);
err&=gcry\u control(GCRYCTL\u INIT\u SECMEM,16384,0);
err&=gcry\u control(GCRYCTL\u RESUME\u SECMEM\u WARN);
err&=gcry\u控制(GCRYCTL\u初始化完成,0);
如果(错误){
XER(“gcrypt:初始化失败”);
}
}
#包括“gcry.hh”
#包括
#包括
#包括
int main(int argc,字符**argv)
{
如果(argc!=2){
fprintf(stderr,“用法:%s\n”,argv[0]);
xerr1(“无效参数”);
}
gcrypt_init();
gcry\u error\u t err=0;
gcry_sexp_t rsa_parms;
gcry_sexp_t rsa_密钥对;
err&=gcry\u sexp\u build(&rsa\u parms,NULL,”(genkey(rsa(nbits 4:2048)));
如果(错误){
XER1(“gcrypt:未能创建rsa参数”);
}

err&=gcry\u pk\u genkey(&rsa\u keypair,rsa\u parms);您能测试一下
/dev/random
的速度吗?如果速度非常慢(可能是因为其他进程需要太多的熵)然后,
/dev/random
将阻塞,直到熵被收集。这在无头机器上可能也是一个问题。我的笔记本电脑上Ubuntu的随机数生成速度肯定有问题

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


验证一个数字是否为素数所花费的时间不太可能花那么长。即使找到一个(或两个)素数所花费的时间目前尚不清楚,除了阻止生成随机数之外,不太可能有任何其他原因导致生成时间如此之长。

你好,Maarten,非常感谢你的建议。请详细说明“安全性稍差的随机数生成器”的相关内容?我应该如何配置该设置?谢谢!它被用作字符串中的标志。我自己还没有尝试过。您可能想看看如何处理慢速
/dev/random
,如果这是问题所在,其他进程也可能会遇到问题。您是对的……我尝试了
cat/dev/random
,它会产生一些输出,然后得到Stuck…我在主机中生成了密钥,现在一切看起来都很好..谢谢!不客气。如果您确实需要VM和/dev/random,您可能需要使用它们来添加熵。