EVP_PKEY_verify()函数使用代码示例’
时间: 2023-09-18 11:08:02 浏览: 360
EVP_PKEY_verify()函数用于验证数据的数字签名是否与公钥匹配。下面是一个使用EVP_PKEY_verify()函数的简单示例:
```c
#include <openssl/evp.h>
#include <openssl/pem.h>
int main()
{
EVP_PKEY *pkey = NULL;
EVP_MD_CTX *mdctx = NULL;
unsigned char sig[1024];
int siglen;
unsigned char data[] = "Hello world";
int datalen = strlen(data);
// 从文件中读取公钥
FILE *fp = fopen("public_key.pem", "r");
if (!fp) {
printf("Failed to open public_key.pem\n");
return 1;
}
pkey = PEM_read_PUBKEY(fp, NULL, NULL, NULL);
fclose(fp);
// 初始化消息摘要上下文
mdctx = EVP_MD_CTX_new();
EVP_DigestInit(mdctx, EVP_sha256());
// 计算消息摘要
EVP_DigestUpdate(mdctx, data, datalen);
unsigned char digest[EVP_MAX_MD_SIZE];
unsigned int digestlen;
EVP_DigestFinal(mdctx, digest, &digestlen);
// 从文件中读取签名
fp = fopen("signature.bin", "rb");
if (!fp) {
printf("Failed to open signature.bin\n");
return 1;
}
siglen = fread(sig, 1, sizeof(sig), fp);
fclose(fp);
// 验证签名
int ret = EVP_PKEY_verify(pkey, sig, siglen, digest, digestlen);
if (ret == 1) {
printf("Signature is valid\n");
} else if (ret == 0) {
printf("Signature is invalid\n");
} else {
printf("Error: EVP_PKEY_verify() returned %d\n", ret);
}
// 清理资源
EVP_PKEY_free(pkey);
EVP_MD_CTX_free(mdctx);
return 0;
}
```
需要注意的是,此示例仅适用于使用 SHA256 消息摘要算法和 RSA 密钥对进行签名的情况。使用其他算法和密钥对的代码可能会有所不同。
阅读全文