2

大家好,这是我在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 中)

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

4

1 回答 1

4

RSA_new() 仅创建 RSA 结构,它不会该结构内创建任何 bignum 对象,例如nande字段。您必须使用 BN_new() 自己创建这些,或者您更可能需要找到正确的 openssl 函数来生成或读取您的 RSA 密钥。

于 2010-03-27T21:48:25.470 回答