rsa数字签名及验签c++
时间: 2023-07-19 14:29:59 浏览: 70
RSA数字签名及验签可以使用openssl库来实现,以下是C++代码示例:
数字签名:
```c++
#include <openssl/rsa.h>
#include <openssl/pem.h>
void rsa_sign(const char* priv_key_file, const char* data, size_t data_len, unsigned char* sign, size_t* sign_len)
{
FILE* fp = fopen(priv_key_file, "rb");
RSA* rsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, NULL);
fclose(fp);
EVP_MD_CTX* ctx = EVP_MD_CTX_create();
EVP_SignInit(ctx, EVP_sha256());
EVP_SignUpdate(ctx, data, data_len);
EVP_SignFinal(ctx, sign, sign_len, rsa);
EVP_MD_CTX_destroy(ctx);
RSA_free(rsa);
}
```
验签:
```c++
#include <openssl/rsa.h>
#include <openssl/pem.h>
bool rsa_verify(const char* pub_key_file, const char* data, size_t data_len, unsigned char* sign, size_t sign_len)
{
FILE* fp = fopen(pub_key_file, "rb");
RSA* rsa = PEM_read_RSA_PUBKEY(fp, NULL, NULL, NULL);
fclose(fp);
EVP_MD_CTX* ctx = EVP_MD_CTX_create();
EVP_VerifyInit(ctx, EVP_sha256());
EVP_VerifyUpdate(ctx, data, data_len);
int ret = EVP_VerifyFinal(ctx, sign, sign_len, rsa);
EVP_MD_CTX_destroy(ctx);
RSA_free(rsa);
return ret == 1;
}
```
需要注意的是,私钥文件必须是PEM格式,公钥文件可以是PEM或DER格式。签名使用SHA256算法,验签时也需要指定相同的算法。