大家好,这是我在stackoverflow上的第一篇文章,如果有点长,我很抱歉。
我正在尝试为我自己的项目构建握手协议,并且在服务器将客户端 RSA 的公钥转换为 Bignum 时遇到问题。它适用于我的 clent 代码,但在尝试将客户端公共 RSA 的十六进制值转换为 bignum 时,服务器会出现段错误。
我已经检查过 RSA 数据之前或之后没有垃圾,并且在网上查看过,但我被卡住了。
头段:
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 输出)
在 0x50DBF9F 读取大小为 8 的无效:BN_hex2bn(在 /usr/lib/libcrypto.so.0.9.8 中)由 0x40F23E:Network::server_handshake() (Network.cpp:177) 由 0x40EF42:Network::startNet() ( Network.cpp:126) by 0x403C38: main (server.cpp:51) Address 0x20 is not stack'd, malloc'd or (recently) free'd
进程以信号 11 (SIGSEGV) 的默认操作终止 访问不在地址 0x20 处 0x50DBF9F 的映射区域内:BN_hex2bn(在 /usr/lib/libcrypto.so.0.9.8 中)
而且我不知道为什么会这样,我在客户端程序中使用完全相同的代码,它工作得很好。任何输入都非常受欢迎!