【发布时间】:2015-08-25 06:43:37
【问题描述】:
我正在尝试实现 SSL 等价物:
openssl dgst -sha1 -binary -out digest.txt what.txt
openssl rsautl -sign -inkey key.pem -in what.txt -out signature.txt
我有我的 7 行私钥,304 个字符:
const char* k = "-----BEGIN... \n... \n... END RSA.."
我使用的代码是这个:
BIO* bio = BIO_new_mem_buf((void*)k, (int)strlen(k));
RSA* privateKey = PEM_read_bio_RSAPrivateKey(bio, NULL, 0, NULL);
std::string appName = "hello";
unsigned char SHA[20];
SHA1((const unsigned char*)appName.c_str(), appName.size(), SHA);
然后我使用以下代码进行签名,将 SHA 及其大小作为缓冲区和 bufferSize(在这种情况下应始终为 20,这是正确的)传递,而签名大小为 32:
unsigned int privateKeySize = RSA_size(privateKey);
*signature = new unsigned char[ privateKeySize ];
RSA_sign(NID_sha1, buffer, bufferSize, *signature, signatureSize, privateKey);
RSA_sign 返回 0,我找不到任何错误代码等。 SHA[] 数组内容与文件 digest.txt 相同,但签名完全错误。我找不到任何这样的例子。你知道这应该如何工作,或者指出我正确的方向吗?
谢谢。
【问题讨论】:
-
"... RSA_sign 返回 0..." -
ERR_get_error()在失败时返回什么?此外,您应该使用EVP_*来签署验证。请参阅 OpenSSL wiki 上的 EVP Signing and Verifying。
标签: c++ security openssl cryptography sha1