首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

GmSSL windows C++ SM2(国密) 验签

  • 25-02-19 03:42
  • 4367
  • 13163
blog.csdn.net

目录

​编辑

说明

主要特性

源码编译

效果

项目

代码

下载


说明

GmSSL地址:https://github.com/guanzhi/GmSSL

GmSSL是由北京大学自主开发的国产商用密码开源库,实现了对国密算法、标准和安全通信协议的全面功能覆盖,支持包括移动端在内的主流操作系统和处理器,支持密码钥匙、密码卡等典型国产密码硬件,提供功能丰富的命令行工具及多种编译语言编程接口。

主要特性

  • 超轻量:GmSSL 3 大幅度降低了内存需求和二进制代码体积,不依赖动态内存,可以用于无操作系统的低功耗嵌入式环境(MCU、SOC等),开发者也可以更容易地将国密算法和SSL协议嵌入到现有的项目中。
  • 更合规:GmSSL 3 可以配置为仅包含国密算法和国密协议(TLCP协议),依赖GmSSL 的密码应用更容易满足密码产品型号检测的要求,避免由于混杂非国密算法、不安全算法等导致的安全问题和合规问题。
  • 更安全:TLS 1.3在安全性和通信延迟上相对之前的TLS协议有巨大的提升,GmSSL 3 支持TLS 1.3协议和RFC 8998的国密套件。GmSSL 3 默认支持密钥的加密保护,提升了密码算法的抗侧信道攻击能力。
  • 跨平台:GmSSL 3 更容易跨平台,构建系统不再依赖Perl,默认的CMake构建系统可以容易地和Visual Studio、Android NDK等默认编译工具配合使用,开发者也可以手工编写Makefile在特殊环境中编译、剪裁。

源码编译

cmake下载地址:Download CMake

cmake生成解决方案

生成后如下图:

使用VS2020打开,选择gmssl项目->右键->生成

gmssl属性页

效果

项目

附加包含目录

附加库目录

附加依赖项

代码

  1. #define _CRT_SECURE_NO_DEPRECATE
  2. #include <iostream>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include <gmssl/asn1.h>
  7. #include <gmssl/rand.h>
  8. #include <gmssl/error.h>
  9. #include <gmssl/sm2.h>
  10. #include <gmssl/sm2_z256.h>
  11. #include <gmssl/pkcs8.h>
  12. #include <fstream>
  13. #include <sstream>
  14. #include <vector>
  15. const std::vector<uint8_t> hexStrToByteVector(const std::string& hexStr)
  16. {
  17. std::vector<uint8_t> byte_vector;
  18. byte_vector.reserve(hexStr.size() / 2);
  19. for (std::string::const_iterator it = hexStr.begin(); it != hexStr.end(); it += 2)
  20. {
  21. byte_vector.push_back(
  22. static_cast<char>(strtol(std::string(it, it + 2).c_str(), nullptr, 16)));
  23. }
  24. return byte_vector;
  25. }
  26. int main(void)
  27. {
  28. //std::ifstream file("puk.pem"); //
  29. //std::string line;
  30. //if (file.is_open()) {
  31. // while (getline(file, line)) {
  32. // std::cout << line << std::endl;
  33. // }
  34. // file.close();
  35. //} else {
  36. // std::cout << "无法打开文件" << std::endl;
  37. //}
  38. FILE* publicKeyFile = fopen("puk.pem", "r");
  39. SM2_KEY sm2_key;
  40. int ret = 0;
  41. if (sm2_public_key_info_from_pem(&sm2_key, publicKeyFile) != 1)
  42. {
  43. error_print();
  44. std::cout << "sm2_public_key_info_from_pem失败" << std::endl;
  45. fclose(publicKeyFile);
  46. return -1;
  47. }
  48. fclose(publicKeyFile);
  49. sm2_key_print(stderr, 0, 0, "SM2_KEY", &sm2_key);
  50. std::cout << std::endl;
  51. //std::string message="lxw123abc!@#$%^&*()天天代码码天天SM验签测试";
  52. std::string messageHex = "6C787731323361626321402324255E262A2829E5A4A9E5A4A9E4BBA3E7A081E7A081E5A4A9E5A4A9534DE9AA8CE7ADBEE6B58BE8AF95";
  53. std::vector<uint8_t> message = hexStrToByteVector(messageHex);
  54. std::cout << "messageHex:" << std::endl << messageHex<< std::endl<<std::endl;
  55. std::string signatureHex = "3044022025c74f0d8d0bf00f26f30a7e330425479967110a1b816d42189c9197515e832d022054284f43b00d76a30d2aaf70499728e081bc0053638349bfe763da4210809b63";
  56. std::vector<uint8_t> signature = hexStrToByteVector(signatureHex);
  57. std::cout << "signatureHex:" << std::endl << signatureHex<< std::endl << std::endl;
  58. SM2_SIGNATURE sig;
  59. const uint8_t* cp = signature.data();
  60. size_t len = signature.size();
  61. if (sm2_signature_from_der(&sig, &cp, &len) != 1
  62. || asn1_length_is_zero(len) != 1) {
  63. error_print();
  64. std::cout << "sm2_signature_from_der失败" << std::endl;
  65. return -1;
  66. }
  67. SM2_SIGN_CTX sign_ctx;
  68. SM2_VERIFY_CTX vrfy_ctx;
  69. /* int ret=sm2_verify_init(&vrfy_ctx, &sm2_key, SM2_DEFAULT_ID, SM2_DEFAULT_ID_LENGTH);
  70. ret = sm2_verify_update(&vrfy_ctx, message.data(), message.size());
  71. ret = sm2_verify_finish(&vrfy_ctx, signature.data(), signature.size());*/
  72. if (sm2_verify_init(&vrfy_ctx, &sm2_key, SM2_DEFAULT_ID, SM2_DEFAULT_ID_LENGTH) != 1
  73. || sm2_verify_update(&vrfy_ctx, message.data(), message.size()) != 1
  74. || (ret = sm2_verify_finish(&vrfy_ctx, signature.data(), signature.size())) != 1) {
  75. std::cout << "验签失败" << std::endl;
  76. error_print();
  77. return -1;
  78. }
  79. else {
  80. std::cout << "验签通过" << std::endl;
  81. }
  82. getchar();
  83. return 0;
  84. }

puk.pem 

-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEpcOpKYODXlH4slAdbjwX3h10cqi1
4rJPAcXl+kPyl4JyuiiJjnh5nr4IQrIJ5tMmctx2slfuSkT/diodLIx+GQ==
-----END PUBLIC KEY----- 

C# SM2 加签、验签工具:http://iyenn.com/rec/1658238.html

下载

源码+GmSSL 2024-10-22 下载

天天代码码天天
微信公众号
.NET 人工智能实践
注:本文转载自blog.csdn.net的天天代码码天天的文章"https://lw112190.blog.csdn.net/article/details/143160201"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top