我已在Linux上使用此命令生成了私钥-证书对:
openssl req -x509 -newkey rsa:1024 -keyout key.pem -out certificate.pem -days 730 -nodes
现在在C ++中,我想使用私钥SHA1对某些数据进行签名,然后使用证书验证签名: RSA_sign 与 RSA_verify
这是我运行的完整代码(省略错误情况):
#include <openssl/err.h>
#include <openssl/rsa.h>
#include <openssl/sha.h>
#include <openssl/pem.h>
#include <QByteArray>
#include <QString>
QByteArray sign(const QString& data)
{
FILE * key_fd = NULL;
EVP_PKEY * key = NULL;
unsigned char * msg_to_sign = NULL;
QString key_file = "key.pem";
key_fd = fopen(key_file.toLatin1().data(), "rt");
key = PEM_read_PrivateKey(key_fd, NULL, NULL, NULL);
int data_len = data.size();
msg_to_sign = new unsigned char[data_len];
memcpy(msg_to_sign, data.toUtf8().constData(), data_len);
unsigned char msg_to_sign_sha1[SHA_DIGEST_LENGTH];
SHA1(msg_to_sign, data_len, msg_to_sign_sha1))
unsigned char signed_msg_hash[KEY_LENGTH_IN_BITS] = {0};
unsigned int signed_msg_hash_length = 0;
int ret = RSA_sign(NID_sha1,
msg_to_sign_sha1, SHA_DIGEST_LENGTH,
signed_msg_hash, &signed_msg_hash_length,
key->pkey.rsa);
QByteArray ba;
ba.append((char *) signed_msg_hash);
return ba;
}
bool verify(QString& data, QByteArray& signature)
{
FILE * certificate_fd = NULL;
unsigned char * msg_to_verify = NULL;
unsigned char * msg_signature = NULL;
QString cert_file("certificate.pem");
certificate_fd = fopen(cert_file.toLatin1().data(), "rt");
X509 * cert = PEM_read_X509(certificate_fd, NULL, NULL, NULL);
EVP_PKEY * evp_pubkey;
evp_pubkey = X509_get_pubkey(cert);
RSA * rsa_pubkey;
rsa_pubkey = EVP_PKEY_get1_RSA(evp_pubkey);
int signature_len = signature.size();
msg_signature = new unsigned char[signature_len];
memcpy(msg_signature, signature.constData(), signature_len);
int data_len = data.toUtf8().size();
msg_to_verify = new unsigned char[data_len];
memcpy(msg_to_verify, data.toUtf8().constData(), data_len);
int RESULT = RSA_verify(NID_sha1, msg_to_verify, data_len, msg_signature,
signature_len, rsa_pubkey);
return RESULT == 1;
}
int main()
{
QString dataToSign("a");
QByteArray signature = sign(dataToSign);
bool result = verify(dataToSign, signature);
// RESULT is FALSE
return 0;
}
验证的结果为 FALSE 。
ERR_get_error()返回 67702888 。
我在做什么错了?
答案 0 :(得分:0)
我正在签署msg-SHA1并仅验证msg。当它们一致时,就可以了。