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博客

相关推荐
luteres1 小时前
Mybatis+SSM整合笔记
java·开发语言·mybatis
郝学胜-神的一滴1 小时前
《C++11 工程级应用01:告别冗长类型,开启简洁高效编码新时代》深度解读
开发语言·c++·算法·软件开发·系统设计
其实防守也摸鱼1 小时前
推荐一个自动化教育SRC漏洞挖掘系统--AutoHunter
运维·开发语言·人工智能·学习·安全·web安全·自动化
覆东流8 小时前
7.Java数组
java·开发语言·后端
码行山野赴时序归途8 小时前
三道经典数组题:从暴力到最优的算法思维
c语言·开发语言·数据结构·算法·leetcode
lzhdim8 小时前
提高 SQL 语句执行速度的方法
java·开发语言·数据库·sql·oracle
JavaPub-rodert8 小时前
王仕宇在 Go Context 如何解决协程泄漏与超时控制
开发语言·后端·golang·iphone·javapub·王仕宇
ly768910 小时前
JavaScript 从入门到进阶:核心语法、异步编程与工程化实践
开发语言·javascript·ecmascript
落魄大学生之流水线上谋生计10 小时前
Java锁全面指南:从基础概念到企业级应用
java·开发语言
for_ever_love__10 小时前
python基础语法学习: 闭包
开发语言·python·学习·闭包