问候,这是我在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中)
我不知道为什么,我在客户端程序中使用完全相同的代码,它工作得很好。任何输入都很受欢迎!
答案 0 :(得分:4)
RSA_new()只创建RSA结构,不创建该结构中的任何bignum对象,如n
和e
字段。您必须使用BN_new()自己创建这些,或者更有可能需要找到正确的openssl函数来生成或读入RSA密钥。