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

国密起步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

         所以不会有冲突。


(这里是文档结束)        

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PyTorch详解-可视化模块
  • Redis 在 Spring Boot 项目中的实际应用及问题解决
  • OpenCV和Tesseract OCR识别复杂验证码喽~~
  • Wine容器内程序执行sh脚本问题研究
  • 「数组」堆排序 / 大根堆优化(C++)
  • 短信验证码倒计时 (直接复制即可使用) vue3
  • C# List定义和常用方法
  • 接口测试到底测试什么?
  • uniapp 如何自定义导航栏并自适应机型
  • 【 Kubernetes 风云录 】- Cert证书更新
  • YoloV10改进策略:上采样改进|动态上采样|轻量高效,即插即用(适用于分类、分割、检测等多种场景)
  • JVM代码运行逻辑
  • Python基础学习(1)
  • linux中将文本转为unix格式
  • 如何进行数字化基础设施的构建呢?
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【译】理解JavaScript:new 关键字
  • FineReport中如何实现自动滚屏效果
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • js继承的实现方法
  • JS实现简单的MVC模式开发小游戏
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Python语法速览与机器学习开发环境搭建
  • springboot_database项目介绍
  • unity如何实现一个固定宽度的orthagraphic相机
  • Vue 重置组件到初始状态
  • Zsh 开发指南(第十四篇 文件读写)
  • 从0到1:PostCSS 插件开发最佳实践
  • 从零开始的无人驾驶 1
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 码农张的Bug人生 - 初来乍到
  • 目录与文件属性:编写ls
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 温故知新之javascript面向对象
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • No resource identifier found for attribute,RxJava之zip操作符
  • 国内开源镜像站点
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • ‌分布式计算技术与复杂算法优化:‌现代数据处理的基石
  • #LLM入门|Prompt#3.3_存储_Memory
  • #宝哥教你#查看jquery绑定的事件函数
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (转)ORM
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .CSS-hover 的解释
  • .net core 的缓存方案
  • .net dataexcel 脚本公式 函数源码
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .net 托管代码与非托管代码