C创建RSA密钥对时发出警告-随机:未初始化的urandom读取(读取32字节)
我正在使用以下代码(C和OpenSSL库)创建RSA密钥对: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结果中失败。”); 去自由所有人; }
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);
}