2301_77294140 2024-10-16 10:43 采纳率: 0%
浏览 5
问题最晚将于10月24日00:00点结题

c++ gmssl sm2验签demo

c++ gmssl(使用3.+的版本)或者 openssl sm2验签demo,如果可以直接提供完整的可以直接运行的demo,可私信
已知内容:
证书内容:MIIC1jCCAn2gAwIBAgIUeo7eRsyx0WNovOkrH3LlPYqeHBIwCgYIKoZIzj0EAwIwgcAxCzAJBgNVBAYTAkNOMRUwEwYDVQQIDAzDp8Kmwo/DpcK7wroxFTATBgNVBAcMDMOnwqbCj8OlwrfCnjFRME8GA1UECgxIw6fCpsKPw6XCt8Kew6XCpcKUw6nCmMKzw6TCv8Khw6bCgcKvw6fCp8KRw6bCisKAw6bCnMKJw6nCmcKQw6XChcKsw6XCj8K4MRswGQYDVQQLDBI5MTM1MDEwMk1BOFRBTlFOOUQxEzARBgNVBAMMCmZ6Ynlrai5jb20wHhcNMjQwOTIzMDgxOTE1WhcNMjUwOTIzMDgxOTE1WjCBwDELMAkGA1UEBhMCQ04xFTATBgNVBAgMDMOnwqbCj8OlwrvCujEVMBMGA1UEBwwMw6fCpsKPw6XCt8KeMVEwTwYDVQQKDEjDp8Kmwo/DpcK3wp7DpcKlwpTDqcKYwrPDpMK/wqHDpsKBwq/Dp8KnwpHDpsKKwoDDpsKcwonDqcKZwpDDpcKFwqzDpcKPwrgxGzAZBgNVBAsMEjkxMzUwMTAyTUE4VEFOUU45RDETMBEGA1UEAwwKZnpieWtqLmNvbTBZMBMGByqGSM49AgEGCCqBHM9VAYItA0IABIz3etRu5RjoCuTxI3s8thmFV9B8i77odQZddb4BERs1iQ9tUM/LPgHvPs6l5I56UoQ9R2VOJXgF/K1XFbvpO9SjUzBRMB0GA1UdDgQWBBR9DZ1yh5uMz3ka2GrmIy7mZH7mOTAfBgNVHSMEGDAWgBR9DZ1yh5uMz3ka2GrmIy7mZH7mOTAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0cAMEQCID/Dck/ewqhO/iS2oBlgErYIAunhdXHKCuczhuMZIKJTAiB0wQBivIY4PoJfenABIprw/tVh372AGgUk0zImhDX4jg==

签名(base64):MEYCIQD5iW4hJtqFSD+fW6IWkDDyV2Koc0Pui7uVIad/MrMo7AIhANyRnAcPB1rtl2sBFziS/YwNbGN+GK9sYdFbMOeIsGcp

待验签数据:1=20241006153823.0001_1&10=TJPIvl9A2VzsSyLYQiXuM4tj8hBbDHew&11=&12=2024-10-06 15:38:23.0&13=测试福建省福州市&14=122.04&15=24.32&16=0&17=5.6&18=0&19=48&2=&20=202410061538230000009413d45a4dbb4d06b71e36471d23a82e&3=2024-10-06 15:38:23.821&4=&6=&7=20241006153823.0001&8=1&9=

未测试运行过的不要回答了,网上很多回答都是不行的

  • 写回答

13条回答 默认 最新

  • 阿齐Archie 嵌入式领域优质创作者 2024-10-16 10:45
    关注

    以下参考免费微信小程序:皆我百晓生 作答,并由阿齐Archie整理回复,若还有疑问可评论或留言。

    在C++中使用GmSSL库进行SM2算法的验签操作,你需要先确保已经安装了GmSSL库,并且你的项目能够链接到GmSSL的库文件。以下是一个简单的示例代码,展示了如何使用GmSSL库来验证SM2签名。

    首先,你需要包含GmSSL的头文件,并链接相应的库。在Linux系统中,通常你需要链接libgmssl库。

    #include <openssl/sm2.h>
    #include <openssl/evp.h>
    #include <openssl/err.h>
    #include <string>
    #include <iostream>
    #include <vector>
    #include <openssl/bio.h>
    #include <openssl/pem.h>
    
    int main() {
        // 初始化OpenSSL库
        OpenSSL_add_all_algorithms();
    
        // 证书内容,通常是PEM格式的字符串
        const char* cert_pem = "-----BEGIN CERTIFICATE-----\n...证书内容...\n-----END CERTIFICATE-----";
    
        // 待验签数据
        const char* data = "待验签的数据内容";
    
        // 签名内容,base64编码的字符串
        const char* signature_base64 = "签名的base64编码内容";
    
        // 将base64编码的签名解码为二进制数据
        BIO *bio, *b64;
        b64 = BIO_new(BIO_f_base64());
        bio = BIO_new_mem_buf(signature_base64, -1);
        bio = BIO_push(b64, bio);
    
        unsigned char signature[256]; // 根据实际情况调整大小
        int sig_len = BIO_read(bio, signature, sizeof(signature));
        BIO_free_all(bio);
    
        // 将证书内容转换为X509对象
        X509 *cert = nullptr;
        BIO *cert_bio = BIO_new_mem_buf(cert_pem, -1);
        cert = PEM_read_bio_X509(cert_bio, &cert, nullptr, nullptr);
        BIO_free(cert_bio);
    
        if (!cert) {
            std::cerr << "证书解析失败" << std::endl;
            ERR_print_errors_fp(stderr);
            return 1;
        }
    
        // 获取证书中的公钥
        EVP_PKEY *pkey = X509_get_pubkey(cert);
        if (!pkey) {
            std::cerr << "公钥提取失败" << std::endl;
            ERR_print_errors_fp(stderr);
            X509_free(cert);
            return 1;
        }
    
        // 使用SM2验签
        int ret = EVP_PKEY_verify_init(pkey);
        if (ret != 1) {
            std::cerr << "初始化SM2验签失败" << std::endl;
            ERR_print_errors_fp(stderr);
            EVP_PKEY_free(pkey);
            X509_free(cert);
            return 1;
        }
    
        ret = EVP_PKEY_verify(pkey, signature, sig_len, (unsigned char*)data, strlen(data));
        if (ret == 1) {
            std::cout << "签名验证成功" << std::endl;
        } else {
            std::cerr << "签名验证失败" << std::endl;
            ERR_print_errors_fp(stderr);
        }
    
        // 清理资源
        EVP_PKEY_free(pkey);
        X509_free(cert);
    
        return 0;
    }
    

    在编译这个程序时,你需要链接GmSSL的库。例如,如果你使用的是g++编译器,可以使用以下命令:

    g++ your_program.cpp -o your_program -lcrypto -lgmssl
    

    请确保替换your_program.cpp为你的源文件名,并且-lcrypto-lgmssl根据你的系统和安装的库进行相应的调整。

    注意:上面的代码只是一个示例,实际使用时你需要根据你的具体情况调整代码,比如证书内容、待验签数据和签名内容。此外,错误处理和资源清理也非常重要,以避免内存泄漏和安全问题。

    评论

报告相同问题?

问题事件

  • 修改了问题 今天
  • 创建了问题 今天

悬赏问题

  • ¥15 lvgl v8.2定时器提前到来
  • ¥20 关于#stm32#的问题:想用3*5的矩阵键盘输出数组来控制音乐模块播放15首音乐
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错
  • ¥15 拓扑学,凸集,紧集。。
  • ¥15 如何扩大AIS数据容量
  • ¥15 单纯型python实现编译报错
  • ¥15 c++2013读写oracle
  • ¥15 c++ gmssl sm2验签demo
  • ¥15 关于模的完全剩余系(关键词-数学方法)