我正在编写一些代码来对 RSA 签名数据进行处理。我已经让这段代码在 Ubuntu 上成功运行(OpenSSL 版本是 1.0.1f-1ubuntu2.7)。该代码获取消息,并使用私钥生成签名结果,我可以使用单独的程序和匹配的公钥来验证是否正确。
在Windows下,完全相同的代码产生不同的结果,签名的数据不同(并且不验证。我不明白为什么。我使用来自http://slproweb.com/products/Win32OpenSSL.html的OpenSSL发行版'Win64OpenSSL-1_0_1j'。
代码如下:
const char * rsa_pri_key = "-----BEGIN RSA PRIVATE KEY-----\n"
"MII...L1t\n"
"yC0...+zk\n"
"c0...5Q\n"
"-----END RSA PRIVATE KEY-----\n";
BIO* bio = BIO_new_mem_buf( (void*)rsa_pri_key, -1 );
BIO_set_flags( bio, BIO_FLAGS_BASE64_NO_NL );
RSA* private_key = PEM_read_bio_RSAPrivateKey(bio, NULL, NULL, NULL ) ;
if( !private_key )
{
std::cout << "Key load failed" << std::endl;
}
BIO_free( bio ) ;
// Sign the data
signature = (unsigned char*) malloc(RSA_size(private_key));
RSA_sign(NID_md5, (unsigned char*) message, strlen(message), signature, &slen, private_key)
最佳答案
我认为这个问题可能与 Linux 和 Windows 上的 char 类型不同(无论是否有符号)有关。您正在转换为 (unsigned char *),这可能是出现问题的地方。
关于c++ - Windows 上的 PEM_read_bio_RSAPrivateKey() 差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27830950/