【问题标题】:BN_hex2bn magically segfaults in openSSLBN_hex2bn 在 openSSL 中神奇的段错误
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • BN_hex2bn 应该在正确调用时实际初始化 n(如果 n 为 NULL)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多