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