国密起步7:BouncyCastle使用SM4自定义格式加解密C#版
初级代码游戏的专栏介绍与文章目录-CSDN博客
我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。
github源码指引的指引-CSDN博客
本文是国密起步6:GmSSL3使用SM4自定义格式加解密C++版-CSDN博客的对应C#版。
GmSSL没有C#接口,所以C#上要用别的库,比如BouncyCastle这个著名加解密库。nuget上的名字是BouncyCastle.Cryptography。
一、源码
因为是跟C++版是对照关系,直接上源码了:
static public string gm4DecryptMessage(string text, string userkey){try{byte[] encryptdata = Convert.FromBase64String(text);//格式为版本1字节、IV16字节、加密后的数据(第一个块是明文长度,仅用8字节,其余未用)byte[] key = new byte[16];//密钥var bytesUserKey = Encoding.UTF8.GetBytes(userkey);for (int i = 0; i < 16; ++i){if (i < userkey.Length) key[i] = bytesUserKey[i];else key[i] = 0;}KeyParameter Key = ParameterUtilities.CreateKeyParameter("SM4", key);ParametersWithIV keyParamWithIv = new ParametersWithIV(Key, encryptdata.Skip(1).Take(16).ToArray());IBufferedCipher inCipher = CipherUtilities.GetCipher("SM4/CBC/NoPadding");inCipher.Init(false, keyParamWithIv);byte[] full_plaindata = inCipher.ProcessBytes(encryptdata.Skip(17).ToArray());int nPlainLength = (int)BitConverter.ToInt64(full_plaindata.Take(8).ToArray());text = Encoding.UTF8.GetString(full_plaindata.Skip(16).Take(nPlainLength).ToArray());}catch (Exception ex){text = ex.ToString();}return text;}static public string gm4EncryptMessage(string text, string userkey){try{//格式为版本1字节、IV16字节、加密后的数据(第一个块是明文长度,仅用8字节,其余未用)byte[] key = new byte[16];//密钥var bytesUserKey = Encoding.UTF8.GetBytes(userkey);for (int i = 0; i < 16; ++i){if (i < userkey.Length) key[i] = bytesUserKey[i];else key[i] = 0;}byte[] IV = new byte[16];Random rand = new Random();for (int i = 0; i < 16; ++i) IV[i] = (byte)rand.Next(0, 255);KeyParameter Key = ParameterUtilities.CreateKeyParameter("SM4", key);ParametersWithIV keyParamWithIv = new ParametersWithIV(Key, IV);IBufferedCipher inCipher = CipherUtilities.GetCipher("SM4/CBC/NoPadding");inCipher.Init(true, keyParamWithIv);int plainBufLen;//明文缓冲区长度,第一个块是明文长度,其后是原始数据,按照16字节补齐if (0 == text.Length % 16) plainBufLen = 16 + text.Length;else plainBufLen = 16 + (text.Length / 16 + 1) * 16;byte[] plainBuf = new byte[plainBufLen];BitConverter.GetBytes((long)text.Length).CopyTo(plainBuf, 0);//必须是8位整数Encoding.UTF8.GetBytes(text).CopyTo(plainBuf, 16);byte[] tmp = new byte[1 + 16 + plainBufLen];//输出缓冲区tmp[0] = 1;IV.CopyTo(tmp, 1);byte[] cipher = inCipher.ProcessBytes(plainBuf);cipher.CopyTo(tmp, 17);text = "G" + Convert.ToBase64String(tmp);}catch (Exception ex){text = ex.ToString();}return text;}
加密后的数据转为base64编码并增加一个“G”开头。实际使用的格式是这样的:
- 明文,json格式,总是以‘{’开头
- 压缩,C+base64
- AES,E+base64
- 国密,G+base64
所以不会有冲突。
(这里是文档结束)
相关文章:
国密起步7:BouncyCastle使用SM4自定义格式加解密C#版
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 github源码指引的指引-CSDN博…...
Qt优秀开源项目之二十三:QSimpleUpdater
QSimpleUpdater是开源的自动升级模块,用于检测、下载和安装更新。 github地址:https://github.com/alex-spataru/QSimpleUpdater QSimpleUpdater目前Star不多(911个),但已在很多开源项目看到其身影,比如Not…...
使用 Nmap 进行 SSL/TLS 加密套件枚举
1. Nmap 简介 Nmap(Network Mapper)是一个开源的网络探测和安全审计工具。它广泛用于扫描网络并发现设备、端口及服务,同时也支持多种脚本来进行更高级的安全扫描。Nmap 的 -sV 参数可以用于探测开放端口上的服务及版本信息,配合…...
探索 Python 的火焰:Fire 库的神秘力量
文章目录 🔥 探索 Python 的火焰:Fire 库的神秘力量第一部分:背景介绍第二部分:Fire 库是什么?第三部分:如何安装 Fire?第四部分:简单库函数使用方法第五部分:场景应用第…...
【Day14-单例设计模式动态代理】
单例设计模式 什么是设计模式(Design pattern) ? 一个问题通常有n种解法,其中肯定有一种解法是最优的,这个最优的解法被人总结出来了,称之为设计模式。设计模式有20多种,对应20多种软件开发中会遇到的问题…...
代码随想录训练营Day7 | 454.四数相加II | 383. 赎金信 | 15. 三数之和 | 18. 四数之和
代码随想录 (programmercarl.com) Leetcode 454. 四数相加 II 题目描述 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] B[j] C[k] D[l] 0。 为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N&#…...
C++和OpenGL实现3D游戏编程【目录】
欢迎来到zhooyu的专栏。 个人主页:【zhooyu】 文章专栏:【OpenGL实现3D游戏编程】 贝塞尔曲面演示: 贝塞尔曲面演示zhooyu 本专栏内容: 我们从游戏的角度出发,用C去了解一下游戏中的功能都是怎么实现的。这一切还是要…...
03-Mac系统PyCharm主题设置
目录 1. 打开PyCharm窗口 2. Mac左上角点击PyCharm,点击Settings 3. 点击第一项Appearance& Behavior 4. 点击Appearance 5. 找到Theme进行设置 1. 打开PyCharm窗口 2. Mac左上角点击PyCharm,点击Settings 3. 点击第一项Appearance& Behavi…...
Java并发的四大定律
每一个进入 Java 并发世界的人,都会不可避免地面临一系列问题:线程安全、并发控制、锁,以及共享资源。这些概念复杂又抽象,往往让人无从下手。幸运的是,业界早已总结出一些法则,这些法则为我们处理并发问题…...
java项目之基于springboot的贸易行业crm系统(源码+文档)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的基于springboot的贸易行业crm系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于sp…...
General OCR Theory: Towards OCR-2.0 via a Unified End-to-end Model
摘要 传统的OCR系统(OCR-1.0)越来越无法满足人们对智能处理人造光学字符的需求。在本文中,我们将所有人造光学信号(例如,普通文本、数学/分子公式、表格、图表、乐谱,甚至是几何形状)统称为“字…...
二十种编程语言庆祝中秋节
二十种编程语言庆祝中秋节 文章目录 二十种编程语言庆祝中秋节中秋快乐!家人们 🥳一 Python二 C三 C四 Java五 C#六 Perl七 Go八 Asp九 PHP十 JavaScript十一 JavaScript HTML十二 Visual Basic十三 早期 VB十四 Visual C十五 Delphi十六 Shell十七 Cobo…...
202409012在飞凌的OK3588-C的核心板上使用Rockchip原厂的Buildroot点MIPI屏【背光篇】
202409012在飞凌的OK3588-C的核心板上使用Rockchip原厂的Buildroot点MIPI屏【背光篇】 2024/9/12 10:44 缘起,拿到一块MIPI屏,需要使用飞凌的OK3588-C的核心板在Android12下点亮。 在飞凌的Linux R4下修改部分屏参之后即可直接点亮。 但是在飞凌的Andro…...
DMDRS搭建
DMDRS搭建 本次进行DMDRS工具的部署搭建以及使用 环境配置 操作系统及数据库配置 操作系统:使用CentOS7数据库:dm8_20240408_x86_rh7_64 服务器配置 实例名服务器IPDM1192.168.19.7(源DMDRS)DM2192.168.19.4(目的…...
【油猴脚本】00006 案例 Tampermonkey油猴脚本自定义表格列名称,自定义表格表头,自定义表格的thead里的td
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【油…...
JS - 获取剪切板内容 Clipboard API
目录 1,需求最终效果 2,实现示例 3,注意点1,只支持安全上下文环境2,只能读取当前页面的剪切板3,权限获取问题4,获取内容的 MIME_TYPE 问题1,文本内容2,图片内容 5&#x…...
Qt自动打开文件夹并高亮文件
在Qt中,如果你想要打开一个文件夹并在文件管理器中高亮显示(选中)某个文件,你可以使用以下方法: 对于Windows系统,你可以使用QProcess来启动explorer命令,并带上/select,参数来高亮显示文件。以…...
神经网络-MNIST数据集训练
文章目录 一、MNIST数据集1.数据集概述2.数据集组成3.文件结构4.数据特点 二、代码实现1.数据加载与预处理2. 模型定义3. 训练和测试函数4.训练和测试结果 三、总结 一、MNIST数据集 MNIST数据集是深度学习和计算机视觉领域非常经典且基础的数据集,它包含了大量的手…...
数据结构二
求 sizeof(name1)?(晟安信息) struct name1{ char str; short x; int num; }; sizeof name1内存对齐 8个字节 char分配8个字节 然后 short节省空间在4个字节中 而这个int独自分配分配内存 4个字节所以共8个字节 (电工时代) typedef struct _a { char c1; long i…...
Python|基于Kimi大模型,删除已上传的“指定文档”或“全部文档”(6)
前言 本文是该专栏的第6篇,后面会持续分享AI大模型干货知识,记得关注。 在本专栏上一篇《Python|基于Kimi大模型,实现上传文档并进行对话(5)》中,笔者有详细介绍“基于kimi大模型,上传指定文档并结合prompt,获取目标文本数据”。对此感兴趣的同学,可以直接点击翻阅查…...
别再只用UI库了!用Tailwind CSS V4快速给Canvas画板组件搭个现代感工具栏
用Tailwind CSS V4为Canvas画板打造专业级工具栏的5个关键技巧 在构建现代Web绘图应用时,Canvas提供了强大的绘图能力,但往往需要配套的UI控件来实现完整的用户体验。传统UI库虽然方便,却可能带来冗余的样式和性能开销。Tailwind CSS V4以其原…...
Spring Boot pom.xml 属性配置 <properties> 没有统一管理 lombok 依赖版本,这里可以正常使用 ${lombok.version}
问题:<!-- 属性配置,统一管理依赖版本 --><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!-- MapStruct 版本 --><org.mapstruct.version>1.6.3</org.mapstruct.version>…...
实战应用:基于编译原理,利用快马AI构建你的首个代码压缩工具
实战应用:基于编译原理,利用快马AI构建你的首个代码压缩工具 最近在学习编译原理,发现这门看似高深的学科其实离我们日常开发很近。比如代码压缩工具,就是编译原理技术的典型应用场景。今天就用InsCode(快马)平台来快速实现一个简…...
旧设备优化与系统兼容性提升:OpenCore Legacy Patcher全流程指南
旧设备优化与系统兼容性提升:OpenCore Legacy Patcher全流程指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是一款专…...
Qwen3-14B私有化效果闭环:从部署→使用→反馈→迭代的完整链路
Qwen3-14B私有化效果闭环:从部署→使用→反馈→迭代的完整链路 1. 开箱即用的私有化部署方案 Qwen3-14B作为通义千问系列的最新大语言模型,在14B参数规模下展现出惊人的理解与生成能力。但对于企业用户而言,如何在自有环境中实现稳定、高效…...
Modern.js 多环境配置终极指南:开发、测试、预发布与生产环境的完整实践
Modern.js 多环境配置终极指南:开发、测试、预发布与生产环境的完整实践 【免费下载链接】modern.js Modern.js is a web engineering system, including a web framework and a npm package solution. 项目地址: https://gitcode.com/gh_mirrors/mo/modern.js …...
3大突破:让网课学习效率提升300%的智能方案
3大突破:让网课学习效率提升300%的智能方案 【免费下载链接】auto-play-course 简单好用的刷课脚本[支持平台:职教云,智慧职教,资源库] 项目地址: https://gitcode.com/gh_mirrors/hc/auto-play-course 在数字化学习普及的今天,职业教育学生平均每…...
Qwen3-14B企业知识图谱构建:从私有文档抽取实体关系实践
Qwen3-14B企业知识图谱构建:从私有文档抽取实体关系实践 1. 企业知识图谱构建概述 在当今企业数字化转型浪潮中,知识图谱作为结构化知识表示的重要方式,正成为企业知识管理的核心基础设施。传统知识图谱构建需要大量人工标注和规则设计&…...
基于Spark+Hadoop+Hive 深度学习大数据的运河航运效率提升平台的设计与实现
前言随着全球贸易的不断发展,运河航运作为连接内陆与海洋的重要交通方式,其运输效率的提升对于促进经济发展、优化资源配置具有重要意义。基于大数据的运河航运效率提升平台的设计与实现,旨在通过收集、处理和分析大量的航运数据,…...
CVAT数据标注工具保姆级安装教程:从Docker部署到第一个标注任务
CVAT数据标注工具保姆级安装教程:从Docker部署到第一个标注任务 计算机视觉项目的成功往往始于高质量的数据标注。CVAT(Computer Vision Annotation Tool)作为英特尔开源的标注工具,凭借其丰富的标注类型支持和灵活的部署方式&am…...
