PEM_read_bio_RSAPrivateKey() Windows 的差异

PEM_read_bio_RSAPrivateKey() difference on Windows

我正在为 RSA 签名数据编写一些代码。我已经让这段代码在 Ubuntu 上成功运行(OpenSSL 版本是 1.0.1f-1ubuntu2.7)。代码获取消息,并使用私钥生成签名结果,我可以使用单独的程序和匹配的 public 密钥验证是否正确。

在 Windows 下,完全相同的代码会产生不同的结果,签名的数据不同(并且不验证。我不明白为什么。我正在使用来自 http://slproweb.com/products/Win32OpenSSL.html.

这是代码:

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 *),这可能是出现问题的地方。