用c++实现基于openssl的签名
时间: 2023-11-12 19:06:39 浏览: 126
下面是一个使用 C++ 和 OpenSSL 进行数字签名的示例代码:
```cpp
#include <iostream>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/evp.h>
#include <openssl/err.h>
using namespace std;
int main()
{
// 1. 读取私钥
FILE* fp = fopen("private_key.pem", "r");
if (!fp) {
cout << "Failed to open private key file." << endl;
return -1;
}
RSA* rsa = PEM_read_RSAPrivateKey(fp, nullptr, nullptr, nullptr);
fclose(fp);
if (!rsa) {
cout << "Failed to read private key." << endl;
return -1;
}
// 2. 读取要签名的数据
fp = fopen("data.txt", "r");
if (!fp) {
cout << "Failed to open data file." << endl;
return -1;
}
fseek(fp, 0, SEEK_END);
size_t data_len = ftell(fp);
fseek(fp, 0, SEEK_SET);
unsigned char* data = new unsigned char[data_len];
fread(data, 1, data_len, fp);
fclose(fp);
// 3. 计算 SHA256 摘要
unsigned char md[EVP_MAX_MD_SIZE];
unsigned int md_len = 0;
EVP_MD_CTX* ctx = EVP_MD_CTX_new();
EVP_DigestInit(ctx, EVP_sha256());
EVP_DigestUpdate(ctx, data, data_len);
EVP_DigestFinal(ctx, md, &md_len);
EVP_MD_CTX_free(ctx);
// 4. 使用私钥进行签名
unsigned char sig[RSA_size(rsa)];
unsigned int sig_len = 0;
int ret = RSA_sign(NID_sha256, md, md_len, sig, &sig_len, rsa);
if (ret != 1) {
cout << "Failed to sign data." << endl;
RSA_free(rsa);
return -1;
}
// 5. 保存签名结果
fp = fopen("signature.bin", "wb");
if (!fp) {
cout << "Failed to open signature file." << endl;
RSA_free(rsa);
return -1;
}
fwrite(sig, 1, sig_len, fp);
fclose(fp);
RSA_free(rsa);
delete[] data;
cout << "Signature successfully generated." << endl;
return 0;
}
```
这个程序读取私钥文件 `private_key.pem` 和要签名的数据文件 `data.txt`,计算 SHA256 摘要并使用私钥进行签名,最后把签名结果保存到文件 `signature.bin` 中。需要注意的是,这里没有对错误和异常情况进行详细处理,实际应用中需要更加谨慎地处理这些情况。
阅读全文