OpenSSL数字签名测试

#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <openssl/evp.h>

#include <openssl/x509.h>


/*数字签名*/
void signature_test() {
uint8_t sign_value[1024];
uint32_t sign_len;
EVP_MD_CTX md_ctx;
char* msg = "Test Message";
EVP_PKEY* evp_key = NULL;


RSA *rsa = NULL;
printf("正在产生rsa...\n");
rsa = RSA_generate_key(1024, RSA_F4, NULL, NULL);
if (rsa == NULL) {
printf("RSA_generate_key_ex error\n");
return;
}
printf("产生rsa成功\n");

evp_key = EVP_PKEY_new();
if (evp_key == NULL) {
printf("EVP_PKEY_new error\n");
RSA_free(rsa);
return;
}


if (!EVP_PKEY_set1_RSA(evp_key, rsa)) {
RSA_free(rsa);
EVP_PKEY_free(evp_key);
}


EVP_MD_CTX_init(&md_ctx);


EVP_SignInit_ex(&md_ctx, EVP_md5(), NULL);


EVP_SignUpdate(&md_ctx, msg, strlen(msg));


EVP_SignFinal(&md_ctx, sign_value, &sign_len, evp_key);


printf("签名信息:");


for (int i = 0 ; i < sign_len; i++) {
if (i%16 == 0)
printf("\n%08xH: ", i);
printf("0x%02x ", sign_value[i]);
}
printf("\n");


EVP_MD_CTX_cleanup(&md_ctx);


EVP_MD_CTX_init(&md_ctx);


EVP_VerifyInit(&md_ctx, EVP_md5());


EVP_VerifyUpdate(&md_ctx, msg, strlen(msg));


printf("开始验证...\n");
int ret = EVP_VerifyFinal(&md_ctx, sign_value, sign_len, evp_key);
printf("验证结果: ");
if (ret == 1) {
printf("签名验证正确\n");
} else {
printf("签名验证错误\n");
}


EVP_PKEY_free(evp_key);
RSA_free(rsa);
EVP_MD_CTX_cleanup(&md_ctx);
return;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值