当前位置: 首页 > news >正文

Gmssl实战

最近项目要引入gm算法,实现aes和sm4数据加密,研究了一下两个系统的安装和测试用例

linux,从github下载GmSSL库( https://github.com/guanzhi/GmSSL.git  ),以下为安装方法。

## GmSSL库安装编译,需要确认已安装cmakeunzip GmSSL-master.zipcd GmSSL-mastermkdir buildcd buildcmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=/usr/localmakemake installcp /usr/local/lib/libgmssl.a ../../libs/

windows, 从github下载GmSSL库( https://github.com/guanzhi/GmSSL.git  ),以下为安装方法。

  • 确保安装了cmake https://cmake.org/download/
  • 我这里下载的 cmake-4.0.1-windows-x86_64.msi
  • 写一个脚本x86cmd.bat,用来打开vs的命令行
  • @echo off
    call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars32.bat"
    cmd
    
  • 打开x86cmd.bat,解压GmSSL到目录。

  • 这里说下我要用的gm库的格式,为静态库,mt,所以需要修改cmakelists.txt

  • project(GmSSL C)set(CMAKE_C_FLAGS_DEBUG "/MTd")
    set(CMAKE_C_FLAGS_RELEASE "/MT")
    set(CMAKE_CXX_FLAGS_DEBUG "/MTd")
    set(CMAKE_CXX_FLAGS_RELEASE "/MT")
  • 依次执行以下命令安装

  • mkdir build
    cd build
    cmake .. -G "NMake Makefiles" -DWIN32=ON -DBUILD_SHARED_LIBS=OFF
    nmake

  • 安装完后,我们可以在目录中找到gmssl.lib

测试代码及实现

gmssl_use.c  我用packet_id做iv的生成条件。


#include <gmssl/aes.h>
#include <gmssl/sm4.h>
#include "gmssl_use.h"void generate_ctr_iv_from_packet_id(int packet_id, uint8_t iv[IV_KEY_SIZE])
{memset(iv, 0, IV_KEY_SIZE);// 小端写入 packet_id 到 IV 的最后 4 字节iv[12] = (packet_id >> 0) & 0xff;iv[13] = (packet_id >> 8) & 0xff;iv[14] = (packet_id >> 16) & 0xff;iv[15] = (packet_id >> 24) & 0xff;
}int aes_ctr_encrypt_gmssl(const uint8_t *key,int packet_id, const uint8_t *in, uint8_t *out)
{AES_KEY aes_key;if (aes_set_encrypt_key(&aes_key, key, AES128_KEY_SIZE) != 1){return -1;}uint8_t iv[IV_KEY_SIZE];generate_ctr_iv_from_packet_id(packet_id, iv);aes_ctr_encrypt(&aes_key, iv, in, strlen((const char*)in), out);return 0;
}int aes_ctr_decrypt_gmssl(const uint8_t *key,int packet_id, const uint8_t *in, uint8_t *out)
{//加解密对称return aes_ctr_encrypt_gmssl(key, packet_id, in, out);
}int sm4_ctr_encrypt_gmssl(const uint8_t *key, int packet_id, const uint8_t *in,uint8_t *out)
{SM4_KEY sm4_key;sm4_set_encrypt_key(&sm4_key, key);uint8_t iv[IV_KEY_SIZE];generate_ctr_iv_from_packet_id(packet_id, iv);sm4_ctr_encrypt(&sm4_key, iv, in, strlen((const char*)in), out);return 0;
}int sm4_ctr_decrypt_gmssl(const uint8_t *key,int packet_id, const uint8_t *in, uint8_t *out)
{//加解密对称return sm4_ctr_encrypt_gmssl(key, packet_id, in, out);
}void test_func_gmssl()
{uint8_t key[16] = "1234567890abcdef";  // 示例密钥int packet_id = 1;uint8_t plaintext[] = "Hello GmSSL CTR!";uint8_t encrypted[128] = { 0 };uint8_t decrypted[128] = { 0 };printf("AES原文: %s\n", plaintext);aes_ctr_encrypt_gmssl(key, packet_id, plaintext, encrypted);printf("AES加密: %s\n", encrypted);aes_ctr_decrypt_gmssl(key, packet_id, encrypted, decrypted);printf("AES解密: %s\n", decrypted);packet_id = 50;uint8_t plaintext1[] = "Hello GmSSL CTR!";uint8_t encrypted1[128] = { 0 };uint8_t decrypted1[128] = { 0 };// SM4 加密解密printf("SM4原文: %s\n", plaintext1);uint8_t key1[16] = "1234567890abcdef";  // 示例密钥sm4_ctr_encrypt_gmssl(key1, packet_id, plaintext1, encrypted1);printf("SM4加密: %s\n", encrypted1);sm4_ctr_decrypt_gmssl(key1, packet_id, encrypted1, decrypted1);printf("SM4解密: %s\n", decrypted1);
}

http://www.xdnf.cn/news/61489.html

相关文章:

  • 【NLP 68、R-BERT】
  • Spark,HDFS客户端操作 2
  • WWW和WWWForm类
  • Linux的基础的操作指令
  • 基础服务系列-Windows10 安装AnacondaJupyter
  • MCP案例—客户端和服务端
  • LintCode第192题-通配符匹配
  • VLAN间通讯技术
  • uniapp云打包针对谷歌视频图片权限的解决方案
  • 实验八 版本控制
  • 大模型训练与推理:存储需求的差异及高性能全闪存储的效能提升
  • Vue2集成ElementUI实现左侧菜单导航
  • 【EasyPan】MySQL主键与索引核心作用解析
  • 《AI大模型应知应会100篇》第30篇:大模型进行数据分析的方法与局限:从实战到边界探索
  • 论文笔记-arXiv2025-FilterLLM
  • 免疫定量分析仪:精准医疗时代的诊断利器与市场蓝海
  • 富文本编辑器
  • ubuntu--字体设置
  • 深度图可视化
  • 4月谷歌新政 | Google Play今年对“数据安全”的管控将全面升级!
  • 极狐GitLab 自定义实例级项目模板功能介绍
  • Unreal如何使用后处理材质实现一个黑屏渐变效果
  • 人类行为的原动力是自我保存-来自ChatGPT
  • 【SpringBoot】HttpServletRequest获取使用及失效问题(包含@Async异步执行方案)
  • 使用IntersectionObserver实现目标元素可见度的交互
  • web原生API AbortController网络请求取消方法使用介绍:防止按钮重复点击提交得最佳方案
  • 数码管静态显示一位字符(STC89C52单片机)
  • QT 的.pro 转 vsproject 工程
  • C++ 2025 展望:现代编程需求与新兴技术驱动下的变革
  • 目标检测篇---R-CNN梳理