BN_hex2bn在openSSL中神奇地发生了段错误

时间:2010-03-27 20:30:11

标签: c++ encryption openssl rsa bignum

问候,这是我在stackoverflow上的第一篇文章,如果它有点长,我很抱歉。

我正在尝试为自己的项目构建一个握手协议,并且服务器将客户端RSA的公钥转换为Bignum时遇到问题。它适用于我的代码,但是当尝试将客户端公共RSA的十六进制值转换为bignum时,服务器会出现段错误。

我已经检查过RSA数据之前或之后没有garbidge,并且已经在线查看,但我已经卡住了。

标题段:

typedef struct KEYS {  
    RSA *serv;  
    char* serv_pub;  
    int pub_size;  
    RSA *clnt;  
} KEYS;

KEYS keys;

初始化功能:

// Generates and validates the servers key

/* code for generating server RSA left out, it's working */
//Set client exponent
keys.clnt = 0;
keys.clnt = RSA_new();
BN_dec2bn(&keys.clnt->e, RSA_E_S); // RSA_E_S contains the public exponent

问题代码(在Network :: server_handshake中):

// *Recieved an encrypted message from the network and decrypt into 'buffer' (1024 byte long)*
cout << "Assigning clients RSA" << endl;
// I have verified that 'buffer' contains the proper key
if (BN_hex2bn(&keys.clnt->n, buffer) < 0) { 
    Error("ERROR reading server RSA");
}
cout << "clients RSA has been assigned" << endl;

程序段错误

BN_hex2bn(&keys.clnt->n, buffer)

带错误(valgrind输出)

  

读取大小8无效       在0x50DBF9F:BN_hex2bn(在/usr/lib/libcrypto.so.0.9.8中)       by 0x40F23E:Network :: server_handshake()(Network.cpp:177)       by 0x40EF42:Network :: startNet()(Network.cpp:126)       by 0x403C38:main(server.cpp:51)   地址0x20未堆叠,malloc'd或(最近)自由

     

使用信号11(SIGSEGV)的默认操作终止进程   不在地址0x20的映射区域内访问       在0x50DBF9F:BN_hex2bn(在/usr/lib/libcrypto.so.0.9.8中)

我不知道为什么,我在客户端程序中使用完全相同的代码,它工作得很好。任何输入都很受欢迎!

1 个答案:

答案 0 :(得分:4)

RSA_new()只创建RSA结构,创建该结构中的任何bignum对象,如ne字段。您必须使用BN_new()自己创建这些,或者更有可能需要找到正确的openssl函数来生成或读入RSA密钥。