openssl+ SM2 + linux 签名校验开发实例(C++)

这篇具有很好参考价值的文章主要介绍了openssl+ SM2 + linux 签名校验开发实例(C++)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、SM2校验理论基础

SM2的校验过程是使用椭圆曲线上的公钥验证签名的有效性。以下是SM2校验的理论基础相关知识点:

  1. SM2签名算法: SM2的校验基于椭圆曲线数字签名算法(ECDSA)。在签名算法中,签名者使用私钥对消息的哈希值进行签名,而验证者使用相应的公钥、签名值和消息的哈希值进行验证。

  2. 公钥验证签名: SM2签名校验的核心在于使用签名者的公钥对签名值进行验证。只有持有私钥的一方才能够生成有效的签名,而任何人都可以使用相应的公钥验证签名的有效性。

  3. 椭圆曲线运算: 校验过程中涉及到椭圆曲线上的数学运算,包括点的加法、点的乘法等。这些运算是基于椭圆曲线离散对数问题的难解性来保障安全性。

  4. 消息摘要算法: SM2签名使用消息摘要算法对原始消息进行哈希,通常采用SM3算法。在校验过程中,验证者也需要使用相同的哈希算法对接收到的消息进行哈希。

  5. 椭圆曲线的离散对数问题: ECC的安全性基于椭圆曲线上的离散对数问题的难解性。在校验过程中,验证者需要执行椭圆曲线运算,确保签名值与消息的哈希值匹配。

  6. SM2校验流程:

    • 选择椭圆曲线参数。
    • 生成公钥。
    • 获取签名值、消息的哈希值和公钥。
    • 使用椭圆曲线运算验证签名的有效性。
  7. 随机数生成: 随机数的生成在签名的校验中通常不涉及,因为验证者只需要使用公钥进行椭圆曲线运算。

  8. 校验结果: 如果校验成功,说明签名是由持有相应私钥的一方生成的,消息在传输过程中没有被篡改,校验者可以信任消息的完整性和真实性。

理解这些基础知识点有助于深入了解SM2校验的工作原理和安全性。在实际应用中,确保正确管理公钥,处理错误和异常情况,并根据具体需求进行适当的安全性考虑。

二、SM2签名校验开发实例(C++)

在Linux环境下使用C++和OpenSSL库进行SM2签名校验的示例代码如下。请注意,这里的公钥和签名数据是预先准备好的,你需要替换为你实际的公钥、签名和消息哈希值。

#include <openssl/evp.h>
#include <openssl/sm2.h>
#include <openssl/pem.h>

int main() {
    EVP_PKEY* pubKey = EVP_PKEY_new();
    FILE* publicKeyFile = fopen("public_key.pem", "r");

    // 从文件中加载公钥
    if (!PEM_read_PUBKEY(publicKeyFile, &pubKey, NULL, NULL)) {
        perror("Error loading public key");
        return 1;
    }

    fclose(publicKeyFile);

    // 待验证的签名
    const char* signatureHex = "3046022100...";
    const char* messageHex = "e1e2a1...";

    // 将十六进制的签名和消息哈希值转换为二进制数据
    unsigned char* signature;
    unsigned char* messageHash;
    size_t sigLen, hashLen;

    sigLen = strlen(signatureHex) / 2;
    hashLen = strlen(messageHex) / 2;

    signature = (unsigned char*)malloc(sigLen);
    messageHash = (unsigned char*)malloc(hashLen);

    if (!signature || !messageHash) {
        perror("Memory allocation error");
        return 1;
    }

    if (hex2bin(signatureHex, signature, sigLen) != 0 ||
        hex2bin(messageHex, messageHash, hashLen) != 0) {
        perror("Error converting hex to binary");
        free(signature);
        free(messageHash);
        return 1;
    }

    // 创建 SM2 验签上下文
    EVP_MD_CTX* ctx = EVP_MD_CTX_new();
    EVP_MD_CTX_init(ctx);

    // 选择 SM3 摘要算法
    const EVP_MD* md = EVP_sm3();

    // 初始化验签
    if (!EVP_DigestVerifyInit(ctx, NULL, md, NULL, pubKey)) {
        perror("Error initializing verification");
        free(signature);
        free(messageHash);
        return 1;
    }

    // 添加待验证的消息
    if (!EVP_DigestVerifyUpdate(ctx, messageHash, hashLen)) {
        perror("Error updating verification");
        free(signature);
        free(messageHash);
        return 1;
    }

    // 执行验签
    int result = EVP_DigestVerifyFinal(ctx, signature, sigLen);

    // 输出验签结果
    if (result == 1) {
        printf("Signature verification successful\n");
    } else {
        printf("Signature verification failed\n");
    }

    // 释放资源
    EVP_MD_CTX_free(ctx);
    EVP_PKEY_free(pubKey);
    free(signature);
    free(messageHash);

    return 0;
}

请确保替换public_key.pemsignatureHexmessageHex为你实际使用的公钥文件、签名和消息哈希值。这个示例中的hex2bin函数用于将十六进制字符串转换为二进制数据,你可以根据需要实现或使用现有的实现。文章来源地址https://www.toymoban.com/news/detail-815962.html

到了这里,关于openssl+ SM2 + linux 签名校验开发实例(C++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenSSL 3.1.1 ECC 加密、解密、签名、验签(国密 sm2、sm3)

    openssl 3 默认废弃了 旧版本 (opessl 1.x) 的部分api 导致部分旧ecc 代码无法使用(可以通过配置编译选项打开) ,这里展示如何使用新接口用ECC 进行加密解密。 新接口是真的方便,基本上你都不需要懂啥密码学知识,对我们这种密码白痴来说太好了 头文件 生成密钥对 导出公

    2024年02月05日
    浏览(61)
  • openssl+sha256开发实例(C++)

    SHA-256(Secure Hash Algorithm 256-bit)是一种哈希算法,属于 SHA-2(Secure Hash Algorithm 2)家族的一员。SHA-256 产生的哈希值是一个256位(32字节)的二进制数字,通常以64个十六进制字符的形式表示。 以下是 SHA-256 的一些关键特点和应用: 安全性: SHA-256 被广泛认为是安全的哈希算法

    2024年01月17日
    浏览(49)
  • sm2签名与sm4加密(三)

    二简单介绍了一下理论,三来简单说下sm2签名的实现, 首先因为openssl太复杂没搞懂,就去看gmssl的代码,gmssl的密钥结构体很简单,长这个样子: 很明显公钥是一个点由xy两个坐标组成,私钥是一个长串。 sm2签名过程可以大体上分成三步,生成公私钥——(交换密钥)——使

    2024年01月18日
    浏览(42)
  • sm2签名与sm4加密(一)

    因为某些不可抗原因,友商加密平台系统无法提供接口进行加密验签,以至于需要自己实现监管要求的加密验签。 接口要求,报文先经过sm2生成签名,之后进行sm4加密。收到报文后,先进行sm4解密,解密后将报文进行验签。验证成功之后既结束全部流程。 所以整体上分为两

    2024年02月12日
    浏览(42)
  • PHP SM2签名如何实现

    SM2是一种基于椭圆曲线密码算法的公钥密码体制,包括数字签名、密钥交换和公钥加密三部分。本文将介绍如何使用PHP实现SM2签名。 在开始实现SM2签名之前,确保已经安装了以下依赖: PHP 7.0 或更高版本 OpenSSL 扩展 使用一个流行的第三方库 php-gmssl 来实现SM2签名。首先,通过

    2024年02月10日
    浏览(51)
  • golang使用SM2(SM2withSM3)签名、验签数据

    对接招行支付 私钥:Hex格式,SM2标准秘钥格式,私钥为32字节字节流,转换为HEX格式为64字节 公钥:base64格式,并且符合ANS1标准,base64编码后总长度为124字节 SM2标准公钥头:3059301306072A8648CE3D020106082A811CCF5501822D03420004 数字签名采用SM2withSM3签名算法,签名方式为PKCS#1裸签名,签

    2024年02月13日
    浏览(37)
  • Java基于BC包的实现SM2签名验签方案,以及SM2签名中bc包冲突的部分解决方法

    信创改造也有一段时间了,这里记录和总结一些关于SM2算法的知识点。 或 由于BC包版本多种多样,且实现SM2算法的过程和结果并不相同。因此在引入bc包时,需要考虑bc包版本的问题,否则将出现包冲突或 ClassNotFound 的问题。 这里特别强调 ,特别是进行SDK开发时,需询问接入

    2024年02月14日
    浏览(47)
  • sm2证书生成(openssl生成公私钥对)—使用

    用上一篇的命令生成公私钥对。 1、sm2PubKey.pem 2、sm2PriKeyPkcs8.pem 3、openssl ec -in sm2PriKeyPkcs8.pem -text 5、工具类 BCECUtil.java SM2Util.java 6、写一个main方法 执行结果: 密钥和命令解析出来的一样。 依赖包:bcprov-jdk15on-1.70.jar SM2加密算法的结果长度,取决于明文长度,没记错的话是

    2024年02月02日
    浏览(41)
  • openssl生成SM2公私钥对命令详解

            (1)获得openssl支持椭圆曲线算法列表         命令:openssl ecparam -list_curves         返回结果:   secp112r1 : SECG/WTLS curve over a 112 bit prime field   secp112r2 : SECG curve over a 112 bit prime field   secp128r1 : SECG curve over a 128 bit prime field   secp128r2 : SECG curve over a 128 bit pr

    2024年02月05日
    浏览(48)
  • C#实现SM2签名(对接医保接口注意事项)

    最近在做对接医保接口的项目,入参要求进行SM2签名(注意:是签名而非加密,开始理解成加密研究了一堆加密源码,使用提供的私钥也会报错,后面才发现SM2有专门的签名方法,而接口调用签名也就是 SM2签名 而非加密) 下面是说明适用于2022年云南省医保平台相关项目:

    2024年02月15日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包