以下是一个使用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密钥对,并使用私钥对消息进行签名。签名结果将输出到控制台,并验证签名的结果。

C openssl sm2签名EVP_DigetSign 示例

原文地址: https://www.cveoy.top/t/topic/i7xa 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录