C 为什么RSA_generate_密钥使用未初始化的值(根据valgrind)

C 为什么RSA_generate_密钥使用未初始化的值(根据valgrind),c,openssl,rsa,valgrind,C,Openssl,Rsa,Valgrind,我一直在做一些涉及密码学的事情。我必须承认我的密码学知识是非常基础的。因此,我决定在通过RSA\u generate\u key从openssl库生成RSA密钥之后,看看RSA结构包含什么。但我有一个分段错误: const unsigned long e = 3; const int num = 3072; ... RSA *rsa_key = RSA_generate_key(num, e, NULL, NULL); if (!rsa_key) { printf("Failed

我一直在做一些涉及密码学的事情。我必须承认我的密码学知识是非常基础的。因此,我决定在通过
RSA\u generate\u key
openssl
库生成RSA密钥之后,看看
RSA
结构包含什么。但我有一个分段错误:

const unsigned long e = 3;
const int num = 3072;   
...
RSA *rsa_key = RSA_generate_key(num, e, NULL, NULL);
if (!rsa_key)
{
    printf("Failed to generate RSA key!\n");
    return RSA_ERROR_CODE;
}

printf("rsa->pad=0x%x\n", rsa_key->pad);
printf("rsa->version=0x%lx\n", rsa_key->version);
if (rsa_key->n)
{
    printf("rsa->n->top=0x%x\n", rsa_key->n->top); // HERE I got the seg fault
    ....
对我来说,它看起来很奇怪,所以我编写了一个最小的代码来测试它。以下是C语言的代码:

#include "openssl/rsa.h"
#include <stdio.h>

int main()
{       
    const unsigned long e = 3;   // the exponent, 3 in QVRSA
    const int num = 3072;   

    RSA *rsa_key = RSA_generate_key(num, e, NULL, NULL);

    if (rsa_key == NULL)
    {
        printf("RSA is invalid!\n");
        return 1;
    }

    printf("rsa->pad=0x%x\n", rsa_key->pad);
    printf("rsa->version=0x%lx\n", rsa_key->version);
    if (rsa_key->n)
    {
        printf("rsa->n->top=0x%x\n", rsa_key->n->top);
    }

    RSA_free(rsa_key);
    rsa_key = NULL;
    return 0;
}
但是
valgrind
触发了大量错误消息:

==6916==条件跳转或移动取决于未初始化的值
==6916==0x4DAEB37:BN_bin2bn(in/usr/lib64/libcrypto.so.0.9.8)
==6916==0x4DB1B62:???(in/usr/lib64/libcrypto.so.0.9.8)
==6916==by 0x4DB4471:BN_generate_prime_ex(in/usr/lib64/libcrypto.so.0.9.8)
==6916==by 0x4DC8763:RSA_generate_key_ex(in/usr/lib64/libcrypto.so.0.9.8)
==6916==by 0x4DCB763:RSA_生成_密钥(在/usr/lib64/libcrypto.so.0.9.8中)
==6916==0x40072E:main(rsa.c:9)
==6916==堆分配创建了未初始化的值
==6916==at 0x4B23D6D:malloc(vg\U替换\U malloc.c:270)
==6916==0x4D8936A:CRYPTO_malloc(在/usr/lib64/libcrypto.so.0.9.8中)
==6916==0x4DB1AD1:???(in/usr/lib64/libcrypto.so.0.9.8)
==6916==by 0x4DB4471:BN_generate_prime_ex(in/usr/lib64/libcrypto.so.0.9.8)
==6916==by 0x4DC8763:RSA_generate_key_ex(in/usr/lib64/libcrypto.so.0.9.8)
==6916==by 0x4DCB763:RSA_生成_密钥(在/usr/lib64/libcrypto.so.0.9.8中)
==6916==0x40072E:main(rsa.c:9)
==6916==条件跳转或移动取决于未初始化的值
==6916==0x4DB44D0:BN_generate_prime_ex(in/usr/lib64/libcrypto.so.0.9.8)
==6916==by 0x4DC8763:RSA_generate_key_ex(in/usr/lib64/libcrypto.so.0.9.8)
==6916==by 0x4DCB763:RSA_生成_密钥(在/usr/lib64/libcrypto.so.0.9.8中)
==6916==0x40072E:main(rsa.c:9)
==6916==堆分配创建了未初始化的值
==6916==at 0x4B23D6D:malloc(vg\U替换\U malloc.c:270)
==6916==0x4D8936A:CRYPTO_malloc(在/usr/lib64/libcrypto.so.0.9.8中)
==6916==0x4DB1AD1:???(in/usr/lib64/libcrypto.so.0.9.8)
==6916==by 0x4DB4471:BN_generate_prime_ex(in/usr/lib64/libcrypto.so.0.9.8)
==6916==by 0x4DC8763:RSA_generate_key_ex(in/usr/lib64/libcrypto.so.0.9.8)
==6916==by 0x4DCB763:RSA_生成_密钥(在/usr/lib64/libcrypto.so.0.9.8中)
==6916==0x40072E:main(rsa.c:9)
还有许多其他条件跳转或移动依赖于未初始化的值

为什么??openSSL中是否存在已知的bug,或者它只是一个假警报,而我的原始分段错误与我的原始代码中隐藏的bug有关

我用过:

  • gcc v4.5.2

  • valgrind v3.8.1

  • OpenSSL 0.9.8a


    • OpenSSL使用一些未初始化的变量生成随机数据来生成密钥。然后Valgrind会抱怨,所以这不是假阳性

      根据,要摆脱它,请使用-DPURIFY编译。
      但是,您可以讨论测试与生产二进制不同的编译二进制是否是一个好主意。

      请看:部分14@Missu谢谢这可能就是问题所在。我想知道为什么我所有的谷歌搜索都没有找到那个链接。但是,我只有opensl的头和共享对象。如何知道它是否是用-DPURIFY编译的?如果使用
      openssl
      调试程序中的内存泄漏对您至关重要,请使用
      -DPURIFY
      标志从源代码处编译openssl。这是众所周知的。只需下载openssl的源代码并将其解压,然后将cd放入目录并键入以下内容
      /Configure--prefix=/usr--openssldir=/etc/ssl-shared-DPURIFY linux-(您的拱门)
      。还有,你为什么要用这么旧的版本?@iharob谢谢你。相信我,我没有选择这个版本。这是我工作的地方的默认openSSL版本:)他们似乎使用了旧的操作系统。可能是debian,没有其他发行版使用这样的旧软件。请添加此链接(由@Missu提供)以加强您的回答:
      rsa->pad=0x0 
      rsa->version=0x0 
      rsa->n->top=0x30