2016-09-05 74 views
0

我是libgcrypt版本1.6.1的新手,现在我试图为rsa算法产生一个公钥/私钥对。gcry_pk_genkey函数在libgcrypt中速度很慢

我列出了我在下面使用的代码。我陷入的是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虚拟机实例内。我在这里做错了什么?

回答

2

您能否测试您的/dev/random的速度?如果这太可怕了(可能是因为其他进程需要太多的熵),那么/dev/random会阻塞,直到收集到熵。这也可能是无头机器上的一个问题。我的笔记本电脑上Ubuntu的随机数生成速度肯定有问题。

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

验证数字是素数的时间花费的时间不可能是,即长。即使找到一个素数(或两个素数)的时间并不知晓它的发展,除了阻止随机数生成可能导致如此巨大的生成时间之外,其他任何事情都不太可能发生。

+0

你好马尔滕,非常感谢你的建议。您能否详细说明“稍不安全的随机数生成器”?我应该如何配置该设置?谢谢! – computereasy

+0

这是[在手册中](https://gnupg.org/documentation/manuals/gcrypt/gcrypt.pdf),用作字符串中的标志。还没有尝试过自己。如果这是个问题,你可能想看看你可以对'/ dev/random'执行较慢的操作,其他进程也可能遇到问题。 –

+0

你是对的...我试过'cat/dev/random',它产生了一些输出,然后被卡住了... – computereasy