C openssl sm2签名EVP_DigetSign 示例
以下是一个使用OpenSSL的C代码示例,用于使用SM2算法进行签名:
#include <stdio.h>
#include <stdlib.h>
#include <openssl/evp.h>
#include <openssl/sm2.h>
#include <openssl/rand.h>
int main() {
EVP_PKEY_CTX *ctx;
EVP_PKEY *pkey;
unsigned char *signature;
size_t signature_len;
const unsigned char *msg = (const unsigned char *)"Hello, World!";
size_t msg_len = strlen((const char *)msg);
// 初始化 OpenSSL
OpenSSL_add_all_algorithms();
// 创建 SM2 密钥对
ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL);
EVP_PKEY_keygen_init(ctx);
EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, NID_sm2);
EVP_PKEY_keygen(ctx, &pkey);
EVP_PKEY_CTX_free(ctx);
// 创建签名上下文
ctx = EVP_PKEY_CTX_new(pkey, NULL);
EVP_PKEY_CTX_set_signature_md(ctx, EVP_sm3());
// 计算签名长度
EVP_PKEY_sign_init(ctx);
EVP_PKEY_sign(ctx, NULL, &signature_len, msg, msg_len);
// 分配签名缓冲区
signature = (unsigned char *)malloc(signature_len);
// 进行签名
EVP_PKEY_sign(ctx, signature, &signature_len, msg, msg_len);
// 输出签名结果
printf("Signature: ");
for (int i = 0; i < signature_len; i++) {
printf("%02x", signature[i]);
}
printf("\n");
// 验证签名
int result = EVP_PKEY_verify(pkey, signature, signature_len, msg, msg_len);
// 输出验证结果
if (result == 1) {
printf("Signature is valid.\n");
} else {
printf("Signature is invalid.\n");
}
// 释放资源
EVP_PKEY_free(pkey);
EVP_PKEY_CTX_free(ctx);
free(signature);
return 0;
}
请注意,此代码假设您已经正确安装了OpenSSL库,并且在编译时已正确链接到OpenSSL库。此外,代码还假设您已经正确安装了SM2算法的实现。
编译和运行此代码时,将生成一个SM2密钥对,并使用私钥对消息进行签名。签名结果将输出到控制台,并验证签名的结果。
原文地址: https://www.cveoy.top/t/topic/i7xa 著作权归作者所有。请勿转载和采集!