c++ openssl生成签名并将签名写入文件
时间: 2023-08-05 16:04:18 浏览: 186
数字签名验签的OpenSSL代码实现Demo
下面是一个示例代码,展示了如何使用 OpenSSL 中的 EVP 接口生成签名并将签名写入文件:
```c++
#include <openssl/evp.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/bio.h>
#include <openssl/buffer.h>
#include <iostream>
#include <fstream>
using namespace std;
string base64_encode(const unsigned char* buffer, size_t length) {
BIO *bio, *b64;
BUF_MEM *bptr = BUF_MEM_new();
b64 = BIO_new(BIO_f_base64());
bio = BIO_new(BIO_s_mem());
bio = BIO_push(b64, bio);
BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL);
BIO_write(bio, buffer, length);
BIO_flush(bio);
BIO_get_mem_ptr(bio, &bptr);
BIO_set_close(bio, BIO_NOCLOSE);
BIO_free_all(bio);
return string(bptr->data, bptr->length);
}
int main(int argc, char* argv[]) {
// 初始化 OpenSSL 库
OpenSSL_add_all_algorithms();
ERR_load_crypto_strings();
// 读取私钥
ifstream key_file("private_key.pem");
if (!key_file.is_open()) {
cerr << "Failed to open private key file" << endl;
return 1;
}
RSA* rsa = PEM_read_RSAPrivateKey(key_file, nullptr, nullptr, nullptr);
if (rsa == nullptr) {
cerr << "Failed to read private key" << endl;
return 1;
}
// 生成签名
EVP_MD_CTX* md_ctx = EVP_MD_CTX_new();
EVP_SignInit(md_ctx, EVP_sha256());
string data = "Hello, world!";
EVP_SignUpdate(md_ctx, data.c_str(), data.size());
unsigned int sig_len = EVP_PKEY_size(rsa);
unsigned char* sig = new unsigned char[sig_len];
EVP_SignFinal(md_ctx, sig, &sig_len, rsa);
// 将签名写入文件
ofstream sig_file("signature.bin", ios::binary);
if (!sig_file.is_open()) {
cerr << "Failed to open signature file" << endl;
return 1;
}
sig_file.write(reinterpret_cast<const char*>(sig), sig_len);
sig_file.close();
// 输出 Base64 编码的签名
string sig_base64 = base64_encode(sig, sig_len);
cout << "Base64-encoded signature: " << sig_base64 << endl;
// 清理资源
delete[] sig;
EVP_MD_CTX_free(md_ctx);
RSA_free(rsa);
ERR_free_strings();
EVP_cleanup();
return 0;
}
```
这段代码通过 OpenSSL 库读取指定的私钥文件(`private_key.pem`),使用 SHA-256 算法计算数据(`Hello, world!`)的摘要,并使用私钥对摘要进行签名。签名结果保存在一个二进制文件中(`signature.bin`),同时输出 Base64 编码的签名到控制台。
阅读全文