【发布时间】:2011-02-01 14:46:20
【问题描述】:
您好,这是我在 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 输出)
大小为 8 的读取无效 在 0x50DBF9F:BN_hex2bn(在 /usr/lib/libcrypto.so.0.9.8 中) 由 0x40F23E: Network::server_handshake() (Network.cpp:177) 通过 0x40EF42: Network::startNet() (Network.cpp:126) 由 0x403C38: 主要 (server.cpp:51) 地址 0x20 没有被堆栈、malloc 或(最近)释放
进程以信号 11 (SIGSEGV) 的默认操作终止 访问不在地址 0x20 的映射区域内 在 0x50DBF9F:BN_hex2bn(在 /usr/lib/libcrypto.so.0.9.8 中)
我不知道为什么会这样,我在客户端程序中使用了完全相同的代码,而且效果很好。任何输入都非常受欢迎!
【问题讨论】:
-
你检查过,你设置的 bigint 是否不为 NULL?
标签: c++ encryption openssl rsa bignum