C# 实现 国密SM4/ECB/PKCS7Padding对称加密解密

C# 实现 国密SM4/ECB/PKCS7Padding对称加密解密,为了演示方便本问使用的是Visual Studio 2022 来构建代码的

1、新建项目,之后选择 项目 鼠标右键选择  管理NuGet程序包管理,输入  BouncyCastle 回车 添加BouncyCastle程序包

2、代码如下:CBC模式

                        byte[] plaintext = Encoding.UTF8.GetBytes("1234567890国abcdefghijklmnopqrstuvwxyz");byte[] keyBytes = Encoding.UTF8.GetBytes("1234567890123456");byte[] iv = Encoding.UTF8.GetBytes("0123456789ABCDEF");// SM4/CBC加密KeyParameter key = ParameterUtilities.CreateKeyParameter("SM4", keyBytes);ParametersWithIV keyParamWithIv = new ParametersWithIV(key, iv);IBufferedCipher inCipher = CipherUtilities.GetCipher("SM4/CBC/PKCS7Padding");inCipher.Init(true, keyParamWithIv);byte[] cipher = inCipher.DoFinal(plaintext);//Console.WriteLine("加密后的密文(hex): {0}", BitConverter.ToString(cipher, 0).Replace("-", string.Empty));rtbCard.Text = $"加密后的密文: {Convert.ToBase64String(cipher).Replace("-", string.Empty)}";// SM4/CBC解密inCipher.Reset();inCipher.Init(false, key);byte[] bin = inCipher.DoFinal(cipher);string ans = Encoding.UTF8.GetString(bin);//Console.WriteLine("解密后的密文(hex): {0}", Convert.ToBase64String(cipher).Replace("-", string.Empty));//Console.WriteLine("解密明文内容:  {0}\t是否匹配: {1}", ans, Enumerable.SequenceEqual(plaintext, bin));rtbCard.Text = rtbCard.Text + "\r\n" + $"解密明文内容:  {ans}\t是否匹配: {Enumerable.SequenceEqual(plaintext, bin)}";

代码如下:ECB模式

 byte[] plaintext = Encoding.UTF8.GetBytes("1234567890国abcdefghijklmnopqrstuvwxyz");byte[] keyBytes = Encoding.UTF8.GetBytes("1234567890123456");byte[] iv = Encoding.UTF8.GetBytes("0123456789ABCDEF");// SM4/ECB加密KeyParameter key = ParameterUtilities.CreateKeyParameter("SM4", keyBytes);//ParametersWithIV keyParamWithIv = new ParametersWithIV(key, iv);ParametersWithIV keyParamWithIv = new ParametersWithIV(key, iv);//IBufferedCipher inCipher = CipherUtilities.GetCipher("SM4/CBC/PKCS7Padding");IBufferedCipher inCipher = CipherUtilities.GetCipher("SM4/ECB/PKCS7Padding");//inCipher.Init(true, keyParamWithIv);inCipher.Init(true, key);byte[] cipher = inCipher.DoFinal(plaintext);//Console.WriteLine("加密后的密文(hex): {0}", BitConverter.ToString(cipher, 0).Replace("-", string.Empty));rtbCard.Text = $"加密后的密文: {Convert.ToBase64String(cipher).Replace("-", string.Empty)}";// SM4/ECB解密inCipher.Reset();//inCipher.Init(false, keyParamWithIv);inCipher.Init(false, key);byte[] bin = inCipher.DoFinal(cipher);string ans = Encoding.UTF8.GetString(bin);Console.WriteLine("解密后的密文(hex): {0}", Convert.ToBase64String(cipher).Replace("-", string.Empty));Console.WriteLine("解密明文内容:  {0}\t是否匹配: {1}", ans, Enumerable.SequenceEqual(plaintext, bin));rtbCard.Text = rtbCard.Text + "\r\n" + $"解密明文内容:  {ans}\t是否匹配: {Enumerable.SequenceEqual(plaintext, bin)}"; 

3、运行

4、SM4密码算法是一个分组算法。数据分组长度为128比特,密钥长度为128 比特。加密算法采用32 轮迭代结构,每轮使用一个轮密钥。我们在实现可用data字节的形式,即秘钥Data为16位,加密数据Data需为16的整数倍,这两点很重要。

1、ECB模式

观察第一块,和第三块,皆为明文块0,相同的输入产生相同的输出

 2、CBC模式

CBC(密文分组链接方式),它的实现机制使加密的各段数据之间有了联系。

也是按照data 16位来分组,第一组数据与初始化向量IV异或后的结果进行加密,密得到第一组密文C1(初始化向量I为全零),第二组数据与第一组的加密结果C1异或以后的结果进行加密,得到第二组密文C2...... 最后C1C2C3......Cn即为加密结果。此种方法安全性高,但是不利于并行计算,有误差传递,需要初始化向量IV。

 参考链接:国密sm4 ECB、CEC模式探究与在iOS中的应用_sm4 ecb_落尘修竹的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/56516.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决elementUI打包上线后icon图标偶尔乱码的问题

解决vue-elementUI打包后icon图标偶尔乱码的问题 一、背景二、现象三、原因四、处理方法方式1:使用css-unicode-loader方式2:升高 sass版本到1.39.0方式3:替换element-ui的样式文件方式4:更换打包压缩方式知识扩展:方式…

如何给图片加水印?

如何给图片加水印?在我们的日常生活中,许多热爱摄影的朋友都会选择给自己的照片添加水印。这是因为我们深知,一张出色的照片背后需要付出大量的努力和心血,而通过添加水印可以有效地保护自己照片的版权,这样即使将图片…

1. 学习 K8S: Docker 基础

学习 K8S: Docker 基础 1. Docker 的诞生 1.1 首次展示 2013 年 3 月 15 日,在北美的圣克拉拉市召开了一场 Python 开发者社区的主题会议 PyCon,研究和探讨各种 Python 开发技术和应用, 在当天的会议日程快结束时,有一位名为 S…

Qt 打开文件列表选择文件,实现拖拽方式打开文件

1. 实现打开文件列表选择文件 1.1. 创建 Qt 工程,并添加几个简单控件 这里笔者选用的是 QMainWindow,创建好工程后在 ui 界面设计中添加 QLineEdit、QPushBtton至少这两个控件,如下图摆放。 1.2. 头文件中添加相关操作 在 mainwindow.h 中…

【python】Leetcode(primer-dict-list)

文章目录 260. 只出现一次的数字 III(字典 / 位运算)136. 只出现一次的数字(字典)137. 只出现一次的数字 II(字典)169. 求众数(字典)229. 求众数 II(字典)200…

【【Verilog典型电路设计之CORDIC算法的Verilog HDL 实现】】

Verilog典型电路设计之CORDIC算法的Verilog HDL 实现 典型电路设计之CORDIC算法的Verilog HDL 实现 坐标旋转数字计算机CORDIC(Coordinate Rotation Digital Computer)算法,通过移位和加减运算,能递归计算常用函数值,如sin,cos,…

【mq】如何保证消息可靠性

文章目录 mq由哪几部分组成rocketmqkafka 为什么需要这几部分nameserver/zookeeper可靠性 broker可靠性 生产者消费者 mq由哪几部分组成 rocketmq kafka 这里先不讨论Kafka Raft模式 比较一下,kafka的结构和rocketmq的机构基本上一样,都需要一个注册…

AI智能工服识别算法

AI智能工服识别算法通过yolov5python网络深度学习算法模型,AI智能工服识别算法通过摄像头对现场区域利用算法分析图像中的工服特征进行分析实时监测工作人员的工服穿戴情况,识别出是否规范穿戴工服,及时发现不规范穿戴行为,提醒相…

数字孪生体技术--学习笔记

一.数字孪生体技术概述 数字孪生体技术是跨层级,跨尺度的现实世界和虚拟世界的建立沟通的桥梁,是第四次工业革命的通用目的技术和核心技术体系之一,是支撑万物互联的综合技术系统,是数字经济发展的基础,是未来智能时代…

Android/Java中,各种数据类型之间的互相转换,给出各种实例,附上中文注释

目录 1.字符串(String)转整数(int): 2.整数(int)转字符串(String): 3.字符串(String)转浮点数(float)&…

axios 进阶

axios 进阶 接口传参方式 使用 xhr 原生技术或者是 axios 时,它的 post 传参方式是键值对的形式 keyvalue。但是在实际开发中一般是使用对象的形式定义数据,方便读取和赋值。所以当我们需要发起请求时可以通过 qs 这一款插件将对象转成键值对形式&…

2023华为软件测试笔试面试真题,抓紧收藏不然就看不到了

一、选择题 1、对计算机软件和硬件资源进行管理和控制的软件是(D) A.文件管理程序 B.输入输出管理程序 C.命令出来程序 D.操作系统 2、在没有需求文档和产品说明书的情况下只有哪一种测试方法可以进行的(A) A.错误推测法测试…

R语言13-R语言中的数据导入导出和批量导入

数据导入 CSV 文件&#xff1a; 使用 read.csv() 函数导入逗号分隔的文本文件。 data <- read.csv("data.csv")Excel 文件&#xff1a; 使用 readxl 包中的函数 read_excel() 导入 Excel 文件。 install.packages("readxl") # 安装 readxl 包&#…

深眸科技创新赋能视觉应用产品,以AI+机器视觉解决行业应用难题

随着工业4.0时代的加速到来&#xff0c;我国工业领域对于机器视觉技术引导的工业自动化和智能化需求持续上涨&#xff0c;国内机器视觉行业进入快速发展黄金期&#xff0c;但需求广泛出现同时也对机器视觉产品的检测能力提出了更高的要求。 传统机器视觉由人工分析图像特征&am…

forEach和map有什么区别,使用场景?

forEach和map有什么区别&#xff0c;使用场景&#xff1f; 区别什么意思&#xff1f;forEach: 不直接改变原始数组&#xff0c;但可以在回调中更改原始数组。 区别 forEach 和 map 都是数组的常用方法&#xff0c;但它们有不同的目的和用法。下面是它们之间的主要区别以及各自…

RE:从零开始的车载Android HMI(四) - 收音机刻度尺

最近比较忙&#xff0c;研究复杂的东西需要大量集中的时间&#xff0c;但是又抽不出来&#xff0c;就写点简单的东西吧。车载应用开发中有一个几乎避不开的自定义View&#xff0c;就是收音机的刻度条。本篇文章我们来研究如何绘制一个收音机的刻度尺。 本系列文章的目的是在讲…

视觉SLAM14讲笔记-第3讲-三维空间刚体运动

空间向量之间的运算包括&#xff1a; 数乘、加法、减法、内积、外积。 内积&#xff1a;可以描述向量间的投影关系&#xff0c;结果是一个标量。 a ⃗ ⋅ b ⃗ ∑ i 1 3 a i b i ∤ a ∤ ∤ b ∤ c o s ⟨ a , b ⟩ \vec{a} \cdot \vec{b}\sum_{i1}^3{{a _i}{b_i}} \nmid a…

Leetcode-每日一题【剑指 Offer 36. 二叉搜索树与双向链表】

题目 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点&#xff0c;只能调整树中节点指针的指向。 为了让您更好地理解问题&#xff0c;以下面的二叉搜索树为例&#xff1a; 我们希望将这个二叉搜索树转化为双向循环链表…

vim常用命令汇总

vim常用命令 1.光标移动删除撤销/恢复查找替换 vim可以作为vscode插件使用 1.光标移动 快捷键功能描述 删除 快捷键功能描述dd删除光标所在行&#xff0c;删除之后&#xff0c;下一行上移ndd删除当前行&#xff08;包括此行&#xff09;后 n 行文本dw移动光标到单词的开头以…

【Vue2】---->mixins 复用

#记录 mixins 复用 - 处理登录确认框的弹出 1 新建一个 mixin 文件 mixins/loginConfirm.js export default {methods: {// 是否需要弹登录确认框// (1) 需要&#xff0c;返回 true&#xff0c;并直接弹出登录确认框// (2) 不需要&#xff0c;返回 falseloginConfirm () {if…