gcry_pk_genkey函数在libgcrypt中非常慢

时间:2016-09-05 17:31:06

标签: encryption cryptography rsa libgcrypt

我是$global:driver版本1.6.1的新手,现在我正在尝试为libgcrypt算法生成公钥/私钥对。

我列出了我正在使用的代码。我被困的是rsa函数,它可能需要1.5小时但永远不会返回。

gcry_pk_genkey

我知道这个函数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; } 。但是,我几乎不相信没有返回/抛出异常可能需要将近2个小时......

我在can take a few minutes. Your computer needs to gather random entropy. VM实例中使用32位Ubuntu 14.04。我在这里做错了吗?

1 个答案:

答案 0 :(得分:2)

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

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

验证数字是否为素数的时间非常不可能 长。即使找到一个素数(或两个)的时间不知道它的进展,除了阻止随机数生成之外的任何事情都不可能导致如此巨大的生成时间。