.NET C# 实现国密算法加解密

.NET C# 实现国密算法加解密

  • 概述
    • 1. SM1
    • 2. SM2
    • 3. SM3
    • 4. SM4
    • 5. SM7
    • 6. SM9
    • 7. ZUC
  • C#代码实现
    • 1 SM2
    • 2 SM3
    • 3 SM4

概述

国密算法(SM算法)是中国国家密码管理局制定的一系列密码算法标准。这些算法被广泛应用于各种信息安全领域,包括通信、电子商务、金融等。以下是主要的国密算法概述:

1. SM1

  • 类型: 对称加密算法
  • 特性: SM1是一种分组加密算法,具体的算法细节未公开,仅供特定用途。
  • 用途: 主要用于国内敏感信息的加密,通常应用在需要高安全级别的场景。

2. SM2

  • 类型: 公钥密码算法
  • 特性: 基于椭圆曲线的公钥加密算法,支持数据加密和数字签名。相比于RSA,SM2在提供相同安全级别的同时,密钥长度更短,计算效率更高。
  • 用途: 广泛应用于电子商务、电子政务、金融等领域,进行数据加密和数字签名。

3. SM3

  • 类型: 哈希算法
  • 特性: SM3是一种密码散列函数,用于生成数据的固定长度的哈希值。其设计参考了SHA-256,但在结构和安全性上有所改进。
  • 用途: 数据完整性验证、数字签名中的哈希操作、信息摘要生成等。

4. SM4

  • 类型: 对称加密算法
  • 特性: SM4是一种分组密码算法,块大小为128位,密钥长度为128位。SM4的设计类似于AES,但具有独特的结构和算法特点。
  • 用途: 用于无线局域网(WLAN)中的数据加密,以及其他需要对称加密的场景。

5. SM7

  • 类型: 对称加密算法
  • 特性: SM7是一种对称分组加密算法,具体的算法细节未公开,属于非公开标准。
  • 用途: 主要用于特定的高安全需求场景。

6. SM9

  • 类型: 身份基加密算法(IBE)
  • 特性: SM9基于双线性对(pairing-based)的公钥密码算法,允许使用身份信息(如电子邮件地址)作为公钥进行加密和签名操作,简化了公钥基础设施(PKI)的管理。
  • 用途: 适用于需要简化密钥管理的应用场景,如邮件加密、身份验证等。

7. ZUC

  • 类型: 流加密算法
  • 特性: ZUC是3GPP(第三代合作伙伴计划)标准的一部分,被用于LTE(长期演进)中的加密和完整性保护。ZUC算法提供高效的流加密操作,适用于高速数据传输环境。
  • 用途: 主要用于移动通信中的数据加密和完整性保护,如4G和5G网络。

这些算法的共同特点是,设计时充分考虑了安全性、效率和适应性,能够满足现代信息系统中对加密和安全的需求。随着信息技术的发展,这些算法将在越来越多的领域中发挥重要作用。

C#代码实现

框架:.NET 6

依赖库:BouncyCastle.Cryptography 2.4.0

using Org.BouncyCastle.Asn1.GM;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Digests;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Modes;
using Org.BouncyCastle.Crypto.Paddings;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;
using System.Text;

1 SM2

static void SM2Test()
{// 生成SM2密钥对var keyPair = GenerateSm2KeyPair();var privateKey = (ECPrivateKeyParameters)keyPair.Private;var publicKey = (ECPublicKeyParameters)keyPair.Public;Console.WriteLine("Private Key: " + privateKey);Console.WriteLine("Public Key: " + publicKey);// 原文string plainText = "Hello SM2!";Console.WriteLine("Original Text: " + plainText);// 加密byte[] cipherText = Sm2Encrypt(publicKey, Encoding.UTF8.GetBytes(plainText));Console.WriteLine("Encrypted Text: " + BitConverter.ToString(cipherText).Replace("-", ""));// 解密byte[] decryptedText = Sm2Decrypt(privateKey, cipherText);Console.WriteLine("Decrypted Text: " + Encoding.UTF8.GetString(decryptedText));
}public static AsymmetricCipherKeyPair GenerateSm2KeyPair()
{var keyGen = new ECKeyPairGenerator();var secureRandom = new SecureRandom();var domainParams = new ECDomainParameters(GMNamedCurves.GetByName("sm2p256v1"));var keyGenParam = new ECKeyGenerationParameters(domainParams, secureRandom);keyGen.Init(keyGenParam);return keyGen.GenerateKeyPair();
}public static byte[] Sm2Encrypt(ECPublicKeyParameters publicKey, byte[] data)
{var engine = new SM2Engine();engine.Init(true, new ParametersWithRandom(publicKey, new SecureRandom()));return engine.ProcessBlock(data, 0, data.Length);
}public static byte[] Sm2Decrypt(ECPrivateKeyParameters privateKey, byte[] encryptedData)
{var engine = new SM2Engine();engine.Init(false, privateKey);return engine.ProcessBlock(encryptedData, 0, encryptedData.Length);
}

2 SM3

static void SM3Test()
{string plainText = "Hello SM3!";Console.WriteLine("Original Text: " + plainText);byte[] hash = Sm3Hash(Encoding.UTF8.GetBytes(plainText));Console.WriteLine("Hash: " + BitConverter.ToString(hash).Replace("-", ""));
}public static byte[] Sm3Hash(byte[] data)
{SM3Digest digest = new SM3Digest();digest.BlockUpdate(data, 0, data.Length);byte[] result = new byte[digest.GetDigestSize()];digest.DoFinal(result, 0);return result;
}

3 SM4

static void Sm4Test()
{string plainText = "Hello SM4!";string key = "1234567890abcdef"; // 16 bytes key for SM4string iv = "abcdef1234567890"; // 16 bytes IV for CBC modeConsole.WriteLine("Original Text: " + plainText);// CBC Modebyte[] cbcCipherText = Sm4CbcEncrypt(Encoding.UTF8.GetBytes(plainText), Encoding.UTF8.GetBytes(key), Encoding.UTF8.GetBytes(iv));Console.WriteLine("CBC Encrypted Text: " + BitConverter.ToString(cbcCipherText).Replace("-", ""));byte[] cbcDecryptedText = Sm4CbcDecrypt(cbcCipherText, Encoding.UTF8.GetBytes(key), Encoding.UTF8.GetBytes(iv));Console.WriteLine("CBC Decrypted Text: " + Encoding.UTF8.GetString(cbcDecryptedText));// ECB Modebyte[] ecbCipherText = Sm4EcbEncrypt(Encoding.UTF8.GetBytes(plainText), Encoding.UTF8.GetBytes(key));Console.WriteLine("ECB Encrypted Text: " + BitConverter.ToString(ecbCipherText).Replace("-", ""));byte[] ecbDecryptedText = Sm4EcbDecrypt(cbcCipherText, Encoding.UTF8.GetBytes(key));Console.WriteLine("ECB Decrypted Text: " + Encoding.UTF8.GetString(ecbDecryptedText));// CFB Modebyte[] cfbCipherText = Sm4CfbEncrypt(Encoding.UTF8.GetBytes(plainText), Encoding.UTF8.GetBytes(key), Encoding.UTF8.GetBytes(iv));Console.WriteLine("CFB Encrypted Text: " + BitConverter.ToString(cfbCipherText).Replace("-", ""));byte[] cfbDecryptedText = Sm4CfbDecrypt(cfbCipherText, Encoding.UTF8.GetBytes(key), Encoding.UTF8.GetBytes(iv));Console.WriteLine("CFB Decrypted Text: " + Encoding.UTF8.GetString(cfbDecryptedText));// OFB Modebyte[] ofbCipherText = Sm4OfbEncrypt(Encoding.UTF8.GetBytes(plainText), Encoding.UTF8.GetBytes(key), Encoding.UTF8.GetBytes(iv));Console.WriteLine("OFB Encrypted Text: " + BitConverter.ToString(ofbCipherText).Replace("-", ""));byte[] ofbDecryptedText = Sm4OfbDecrypt(ofbCipherText, Encoding.UTF8.GetBytes(key), Encoding.UTF8.GetBytes(iv));Console.WriteLine("OFB Decrypted Text: " + Encoding.UTF8.GetString(ofbDecryptedText));
}public static byte[] Sm4OfbEncrypt(byte[] data, byte[] key, byte[] iv)
{var engine = new PaddedBufferedBlockCipher(new OfbBlockCipher(new SM4Engine(), 128), new Pkcs7Padding());engine.Init(true, new ParametersWithIV(new KeyParameter(key), iv));return engine.DoFinal(data);
}public static byte[] Sm4OfbDecrypt(byte[] cipherData, byte[] key, byte[] iv)
{var engine = new PaddedBufferedBlockCipher(new OfbBlockCipher(new SM4Engine(), 128), new Pkcs7Padding());engine.Init(false, new ParametersWithIV(new KeyParameter(key), iv));return engine.DoFinal(cipherData);
}public static byte[] Sm4CfbEncrypt(byte[] data, byte[] key, byte[] iv)
{var engine = new PaddedBufferedBlockCipher(new CfbBlockCipher(new SM4Engine(), 128), new Pkcs7Padding());engine.Init(true, new ParametersWithIV(new KeyParameter(key), iv));return engine.DoFinal(data);
}public static byte[] Sm4CfbDecrypt(byte[] cipherData, byte[] key, byte[] iv)
{var engine = new PaddedBufferedBlockCipher(new CfbBlockCipher(new SM4Engine(), 128), new Pkcs7Padding());engine.Init(false, new ParametersWithIV(new KeyParameter(key), iv));return engine.DoFinal(cipherData);
}public static byte[] Sm4EcbEncrypt(byte[] data, byte[] key)
{var engine = new PaddedBufferedBlockCipher(new EcbBlockCipher(new SM4Engine()), new Pkcs7Padding());engine.Init(true, new KeyParameter(key));return engine.DoFinal(data);
}public static byte[] Sm4EcbDecrypt(byte[] cipherData, byte[] key)
{var engine = new PaddedBufferedBlockCipher(new EcbBlockCipher(new SM4Engine()), new Pkcs7Padding());engine.Init(false, new KeyParameter(key));return engine.DoFinal(cipherData);
}public static byte[] Sm4CbcEncrypt(byte[] data, byte[] key, byte[] iv)
{var engine = new SM4Engine();var blockCipher = new CbcBlockCipher(engine);var cipher = new PaddedBufferedBlockCipher(blockCipher);cipher.Init(true, new ParametersWithIV(new KeyParameter(key), iv));return cipher.DoFinal(data);
}public static byte[] Sm4CbcDecrypt(byte[] cipherData, byte[] key, byte[] iv)
{var engine = new SM4Engine();var blockCipher = new CbcBlockCipher(engine);var cipher = new PaddedBufferedBlockCipher(blockCipher);cipher.Init(false, new ParametersWithIV(new KeyParameter(key), iv));return cipher.DoFinal(cipherData);
}

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

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

相关文章

护眼灯对眼睛有伤害吗?千万要小心的行业四大弊端内幕

护眼灯,作为现代家居与办公环境中不可或缺的照明伴侣,因其普及性广受青睐。然而,随着大众对视觉健康意识的逐渐增强,一个疑问悄然滋生:护眼灯对眼睛有伤害吗?这一问题不仅触及到了人们对视觉健康的深层担忧…

MLOps模型部署的三种策略:批处理、实时、边缘计算

机器学习运维(MLOps)是一组用于自动化和简化机器学习(ML)工作流程和部署的实践。所选择的部署策略可以显著影响系统的性能和效用。所以需要根据用例和需求,采用不同的部署策略。在这篇文章中,我们将探讨三种…

Java家政预约系统源码 家政上门APP源码 家电安装、维修、清洗、美容系统源码、家政系统各端功能细分

Java家政预约系统源码 家政上门APP源码 家电安装、维修、清洗、美容系统源码、家政系统各端功能细分 家政服务系统是一种提供家政服务的系统,它可以为客户提供上门家庭清洁、钟点工、保姆、月嫂、育婴师、护理员等家政服务。节省时间和成本,提高效率&…

网络层只懂路由?这9个知识点被严重低估了

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 下午好,我的网工朋友。 网络层想必你已经耳熟能详,它的作用自然是不容小觑。 它负责将数据从源头准确地投递到目的地&am…

9.2JavaEE——JDBCTemplate的常用方法(一)excute()方法

execute()方法用于执行SQL语句,其语法格式如下: jdTemplate.execute("SQL 语句");下面以创建数据表的SQL语句为例,来演示excute()方法的使用,具体步骤如下。 1、创建数据库 在MySQL中,创建一个名为spring的…

QT pro包含库文件目录符号含义

直接调用DLL需要三个文件,头文件(.h)、导入库文件(.lib)、动态链接库(.dll), 注意:在qtCreaor中生成的动态库库文件文件为.a结尾,vs生成的动态链接库是.lib结尾 1、首先我们把 .h与.lib/.a 文件复制到程序当前目录下&#xff0c…

软设之白盒测试

白盒测试分为语句覆盖,判定覆盖,条件覆盖,判断/条件覆盖,条件组合覆盖,路径覆盖 语句覆盖 定义:被测试程序中的每条语句至少执行一次 特点:对执行逻辑覆盖很低,一般认为是很弱的逻辑组合。 判定覆盖: …

onnx基本概念

onnx基本概念 参考 文章目录 onnx基本概念Input, Output, Node, Initializer, AttributesSerialization with protobuf元数据List of available operators and domains支持的类型Opset版本Subgraphs, tests and loopsExtensibilityFunctionsShape (and Type) Inferencetools O…

编码在网络安全中的应用和原理

前言:现在的网站架构复杂,大多都有多个应用互相配合,不同应用之间往往需要数据交互,应用之间的编码不统一,编码自身的特性等都很有可能会被利用来绕过或配合一些策略,造成一些重大的漏洞。 什么是编码,为什…

UniVue更新日志:使用Carousel组件实现轮播图效果

github仓库 稳定版本仓库:https://github.com/Avalon712/UniVue 开发版本仓库:https://github.com/Avalon712/UniVue-Develop UniVue扩展框架-UniVue源生成器仓库:https://github.com/Avalon712/UniVue-SourceGenerator 更新说明 今天的更…

YOLOv8改进 | 注意力机制 | 添加混合局部通道注意力——MLCA【原理讲解】

💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 注意力机制是计算机视觉中最广泛使用的组件之一,它可以帮助神经网络强调重要元素并抑制不相关的元素。然而,绝大多数的通道注意力机制只包含通道特征信息而忽略了空间特征信息,这导致了模型表征效果或对象检测…

吴恩达深度学习笔记:机器学习(ML)策略(1)(ML strategy(1))1.11-1.12

目录 第三门课 结构化机器学习项目(Structuring Machine Learning Projects)第一周 机器学习(ML)策略(1)(ML strategy(1))1.11 超过人的表现(Surp…

报错:C1189#error: The <experimental/filesystem> header providing 解决方案

今天开发过程中,需要使用文件系统experimental/filesystem,报错C1189#error: The <experimental/filesystem> header providing ,通过以下解决方案,成功运行程序。 目录 一、打开项目下的属性 二、选择C/…

算法02 递归算法及其相关问题【C++实现】

递归 在编程中,我们把函数直接或者间接调用自身的过程叫做递归。 递归处理问题的过程是:通常把一个大型的复杂问题,转变成一个与原问题类似的,规模更小的问题来进行求解。 递归的三大要素 函数的参数。在用递归解决问题时&…

sci发表技巧指导

sci发表技巧指导 发表Sci期刊,很多作者都认为难度很大。其实,掌握以前发表技巧就没有那么难。投稿Sci期刊首先要确定自己属于哪个领域,例如医学类、经济类、理工类。然后根据sci期刊的投稿要求撰写sci论文,以下是sci发表技巧指导…

RabbitMQ消息的可靠传输和防止消息丢失

在Spring Cloud项目中,为了确保RabbitMQ消息的可靠传输和防止消息丢失,需要考虑以下几个方面: 消息持久化:确保消息在RabbitMQ中持久化。队列持久化:确保队列是持久化的。发布确认:使用发布确认机制确保消…

VMware挂载NAS存储异常处理

问题概述 由于非法关机或恢复,NFS存储可能会出现以下问题: 数据存储处于挂起状态或无法正常识别。虚拟机的配置文件或虚拟磁盘仍然注册在异常数据存储上。系统误认为有虚拟机在使用该数据存储。 问题对策 下面是详细的排查步骤和解决对策&#xff1a…

PFA烧杯带把手带刻度1000ml3000mlPFA氟树脂温度范围-270~250℃

随着越来越多的痕量分析实验需要对ppb和ppt级的浓度进行测定。目前所使用的一般材料由于无特别处理,不可避免会与所储存的样品,试剂或标准液反应,导致痕量分析实验得到不正确的结果。但我厂的PFA产品刚好能弥补其不足。PFA金属元素空白值低&a…

前端锚点 点击 滑动双向绑定

一. 页面样式 二. 代码 <div class"flexBox"><div class"mdDiv" v-for"(item,index) in tabList" :key"index" :class"nowChooseindex?choosed:" click"jumpMD(index, item.id)">{{item.name}}&l…

风光储一体化园区 | 图扑新能源可视化

随着全球能源结构转型加速&#xff0c;可再生能源成为能源发展的重要方向。风能、太阳能作为清洁、绿色的能源&#xff0c;得到了广泛的开发和应用。与此同时&#xff0c;储能技术的发展为解决风能和太阳能发电的间歇性和波动性问题提供了有效途径。 风光储园区作为整合风电、…