首页 > 编程语言 >C# 实现 国密SM4/ECB/PKCS7Padding对称加密解密

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

时间:2023-08-25 09:56:37浏览次数:47  
标签:加密 ECB C# SM4 inCipher 解密 cipher byte

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

 

标签:加密,ECB,C#,SM4,inCipher,解密,cipher,byte
From: https://www.cnblogs.com/1175429393wljblog/p/17656089.html

相关文章

  • VisionPro C#混合编程环境搭建(基于VS2019)
    VisionPro工具分组(因为Vs2019导入VisionPro是全导入,为了方便,可以自建项进行分类)各选择项1VisionProToolEditControls2VisionProDisplayControls3VisionProShapeEditControls4VisionProSystemControls各选择项下的组件VisionProDisplayControls:CogRecor......
  • select查询优化命令::::
    MySQL优化原理可不像大家想的那样简单啊!点击关注......
  • VScode settings.json默认配置文件路径
    LinuxUbuntu:/home/${用户名}/.config/Code/User/settings.jsonWindows:C:\Users\用户名\AppData\Roaming\Code\User来源、参考:https://blog.csdn.net/cyqzy/article/details/130011314......
  • VisionPro C#混合编程实现工业相机实时图像采集
    1usingSystem;2usingSystem.Collections.Generic;3usingSystem.ComponentModel;4usingSystem.Data;5usingSystem.Drawing;6usingSystem.Linq;7usingSystem.Text;8usingSystem.Windows.Forms;9usingCognex.VisionPro;10usingC......
  • [LeetCode][198]house-robber
    ContentYouareaprofessionalrobberplanningtorobhousesalongastreet.Eachhousehasacertainamountofmoneystashed,theonlyconstraintstoppingyoufromrobbingeachofthemisthatadjacenthouseshavesecuritysystemsconnectedanditwilla......
  • SAP GUI Scripting VBA Code Snippet to Detect all IDs of the UI Elements
    '-Begin-----------------------------------------------------------------OptionExplicitDimgColl()AsStringDimjAsIntegerSubGetAll(ObjAsObject)'---------------------------------------------'-'-Recursivelycalledsubro......
  • tomcat9中设置jks证书和pfx证书
    jks证书设置server.xml<Connectorport="443"protocol="org.apache.coyote.http11.Http11NioProtocol"maxThreads="1000"connectionTimeout="30000"maxPostSize="-1"enabl......
  • ASP.NET Core实时库SignalR简单应用
    一、什么是SignalR:SignalR是用于构建需要实时用户交互或实时数据更新的Web应用程序的一个开放源代码.NET库。不仅仅用在Web应用中,后面会讲到它的应用范围。它简化了简化了构建实时应用程序的过程,包括ASP.NETServer库和JavaScriptClient库,以便管理Client与Server连接并将内容......
  • 公司来了个大佬,把 FullGC 40 次/天优化为 10 天 1 次,太秀了~!
    来源:https://heapdump.cn/article/1859160通过这一个多月的努力,将FullGC从40次/天优化到近10天才触发一次,而且YoungGC的时间也减少了一半以上,这么大的优化,有必要记录一下中间的调优过程。对于JVM垃圾回收,之前一直都是处于理论阶段,就知道新生代,老年代的晋升关系,这些知......
  • VS插件DevExpress CodeRush v23.1 - 支持Visual Studio ARM
    DevExpress CodeRush是一个强大的VisualStudio.NET插件,它利用整合技术,通过促进开发者和团队效率来提升开发者体验。CodeRush能帮助你以极高的效率创建和维护源代码。Consume-first申明,强大的模板,智能的选择工具,智能代码分析和创新的导航以及一个无与伦比的重构集,在它们的帮助......