Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C创建RSA密钥对时发出警告-随机:未初始化的urandom读取(读取32字节)_C_Random_Openssl_Cryptography_Rsa - Fatal编程技术网

C创建RSA密钥对时发出警告-随机:未初始化的urandom读取(读取32字节)

C创建RSA密钥对时发出警告-随机:未初始化的urandom读取(读取32字节),c,random,openssl,cryptography,rsa,C,Random,Openssl,Cryptography,Rsa,我正在使用以下代码(C和OpenSSL库)创建RSA密钥对: void rsa\u gen\u keys\u ca(){ RSA*密钥对=空; 无符号字符*pub_key=NULL; BIGNUM*bne=NULL; 无符号长e=RSA_F4; int成功=0; bne=BN_new(); success=BN\u set\u单词(bne,e); 如果(!成功){ errx(1,“\nrsa\u gen\u keys\u ca在BN\u set\u word结果中失败。”); 去自由所有人; }

我正在使用以下代码(C和OpenSSL库)创建RSA密钥对:

void rsa\u gen\u keys\u ca(){
RSA*密钥对=空;
无符号字符*pub_key=NULL;
BIGNUM*bne=NULL;
无符号长e=RSA_F4;
int成功=0;
bne=BN_new();
success=BN\u set\u单词(bne,e);
如果(!成功){
errx(1,“\nrsa\u gen\u keys\u ca在BN\u set\u word结果中失败。”);
去自由所有人;
}
keypair=RSA_new();
success=RSA_generate_key_ex(密钥对,RSA_key_SIZE,bne,NULL);
如果(!成功){
errx(1,“\nrsa\u gen\u keys\u ca在RSA\u generate\u key\u ex result上失败。”);
去自由所有人;
}
success=i2d_RSAPublicKey(密钥对和发布密钥);
如果(成功<0){
errx(1,“\nrsa\u gen\u keys\u ca在i2d\u RSAPublicKey结果中失败。”);
去自由所有人;
}
printf(“=============RSA公钥成功提取:%s”,发布密钥);
全部免费:
无RSA_(密钥对);
无BN_(bne);
}
运行时,我收到以下警告:

随机:未初始化的URADOM读取(读取32字节)

我认为在代码中留下这个警告将是一个安全问题,因为在过去我读过一些关于
uradom
生成器的文章


有人能解释一下这个警告以及如何避免它吗?

你可以使用
else
语句而不是
goto
。这里的每个人都会感谢您linux机器上的
random
uradom
设备消耗熵(比如鼠标的移动)来创建伪随机数。但是,如果您消耗了所有生成的熵,并且仍然需要更多的随机数,
random
将阻塞,直到生成更多的熵<另一方面,code>Uradom将退回到生成随机数的算法。这很可能是一种情况,它会返回并警告您它正在这样做。@TimRandall错误处理是
goto
@DaltonCézane的公认用法之一。我对我的学科知识没有信心,无法将一些关键的东西声明为“足够安全”。试着阅读手册(
man4random
),也许它能让你自己做出决定。不过,我将留下这段摘录:“如果您不确定是应该使用/dev/random还是/dev/urandom,那么您可能希望使用后者。一般来说,/dev/urandom应该用于除长期使用的GPG/SSL/SSH密钥以外的所有用途。”谷歌表示,这实际上不是一个C警告,而是来自内核的一条消息,警告说
uradom
在安全随机设备进行令人满意的初始化之前正在从该设备发送字节。这可能是个问题,也可能不是,但我不会忽视它,特别是对于长寿命的RSA密钥。
void rsa_gen_keys_ca() {
    RSA *keypair = NULL;
    unsigned char *pub_key = NULL;
    BIGNUM *bne = NULL;
    unsigned long e = RSA_F4;
    int success = 0;

    bne = BN_new();
    success = BN_set_word(bne, e);
    if (!success) {
        errx(1, "\nrsa_gen_keys_ca failed at BN_set_word result.");
        goto free_all;
    }

    keypair = RSA_new();
    success = RSA_generate_key_ex(keypair, RSA_KEY_SIZE, bne, NULL);
    if (!success) {
        errx(1, "\nrsa_gen_keys_ca failed at RSA_generate_key_ex result.");
        goto free_all;
    }

    success = i2d_RSAPublicKey(keypair, &pub_key);
    if (success < 0) {
        errx(1, "\nrsa_gen_keys_ca failed at i2d_RSAPublicKey result.");
        goto free_all;
    }
    printf("==========RSA Public Key successfully extracted: %s", pub_key);

free_all:
    RSA_free(keypair);
    BN_free(bne);
}