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

server/2024/9/19 18:40:04/ 标签: .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.ppmy.cn/server/48771.html

相关文章

yocto根文件系统如何配置静态IP地址

在Yocto根文件系统中配置静态IP地址,你可以参考以下步骤。请注意,这些步骤可能会因Yocto版本和具体硬件平台的不同而略有差异。 1. 获取网络配置信息 首先,你需要从网络运维方获取分配的IP地址、子网掩码、默认网关和DNS信息。 2. 确定配置文…

华为手机USB调试调过登录

【抓包工具】配置:绕过华为手机打开 USB 调试需要先登录华为账号问题 参考上面的文章。但是可能因为没有登录账号,没法切到生产模式。 登录荣耀账号,再试就可以了,记得默认允许电脑调试,然后退出荣耀账号

使用ZIP包安装MySQL及配置教程

在本教程中,我们将指导您完成使用ZIP包安装MySQL的过程,并对配置文件进行必要的修改,以及解决可能遇到的问题。本示例以MySQL 5.7.44为例,但步骤同样适用于其他版本如MySQL 8.3.0等。请根据实际需要选择适合的版本下载&#xff1a…

【最新鸿蒙应开发】——HarmonyOS沙箱目录

鸿蒙应用沙箱目录 1. 应用沙箱概念 应用沙箱是一种以安全防护为目的的隔离机制,避免数据受到恶意路径穿越访问。在这种沙箱的保护机制下,应用可见的目录范围即为应用沙箱目录。 对于每个应用,系统会在内部存储空间映射出一个专属的应用沙箱…

【DrissionPage】Linux上如何将https改为http

最近有个老板找我做一个自动化的程序,要求部署到Linux上 这是一个http协议的网站,chrome在默认设置下,会将http的网站识别成不安全的内容,然后自动将http转化成https访问 但是,这个http的网站它的加载项里既有http的…

在Dataworks调度里检查上游表的分区是否已经产出

在Dataworks调度里检查上游表的分区是否已经产出 新建PyOdps3节点,贴如如下代码: import sys import time from datetime import datetimebizdate args[bizdate] if not o.exist_table(args[table]):sys.exit(1)# 设置结束时间为今天的20:00 end_time …

94. 二叉树的中序遍历(Swift实现, 迭代)

题目描述 使用迭代方法解题 class TreeNode {var val: Intvar left: TreeNode?var right: TreeNode?init(_ val: Int) {self.val valself.left nilself.right nil} }func inorderTraversal(_ root: TreeNode?) -> [Int] {var result [Int]() // 用于存储中序遍历…

Selenium入门之环境搭建

搭建 Selenium 环境主要包括以下几个步骤: 安装 Python 和相关包安装 WebDriver编写和运行 Selenium 脚本 1. 安装 Python 和相关包 首先确保你已经安装了 Python。如果没有安装,可以从 Python 官方网站下载并安装。 然后,使用 pip 安装 …

windows安装SQLyog

windows安装SQLyog 1. 下载 SQLyog 安装包 访问 SQLyog 的官方网站。在网站上找到下载链接,通常会有一个“Download”或“Try Now”按钮。如果需要注册或填写信息以获取下载链接,请按提示操作。 2. 运行安装程序 下载完成后,双击运行下载…

2024蓝桥杯初赛决赛pwn题全解

蓝桥杯初赛决赛pwn题解 初赛第一题第二题 决赛getting_startedbabyheap 初赛 第一题 有system函数,并且能在bss上读入字符 而且存在栈溢出,只要过掉check函数即可 check函数中,主要是对system常规获取权限的参数,进行了过滤&…

C语言 | Leetcode C语言题解之第150题逆波兰表达式求值

题目&#xff1a; 题解&#xff1a; int evalRPN(char** tokens, int tokensSize) {int n tokensSize;int stk[(n 1) / 2];memset(stk, 0, sizeof(stk));int index -1;for (int i 0; i < n; i) {char* token tokens[i];if (strlen(token) > 1 || isdigit(token[0])…

Ubuntu server 24 (Linux) 安装客户端(windows/linux) Zabbix 7.0 LTS Zabbix agent2

一 Ubuntu(linux)安装客户端 1 Ubuntu 24 安装Zabbix agent2 #安装agent库 sudo wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_7.0-1ubuntu24.04_all.deb sudo dpkg -i zabbix-release_7.0-1ubuntu24.04_all.deb sudo apt u…

Java从放弃到继续放弃

并发编程 为什么需要多线程&#xff1f; 由于硬件的发展&#xff0c;CPU的核数增多&#xff0c;如果仍然使用单线程对CPU资源会造成浪费。同时&#xff0c;单线程也会出现阻塞的问题。所以&#xff0c;选择向多线程转变。 多线程的使用使得程序能够并行计算&#xff0c;提高计…

4. Revit API UI 之 Ribbon(界面)

4. Revit API UI 之 Ribbon&#xff08;界面&#xff09; 第二篇中&#xff0c;我们提到了IExternalApplication&#xff0c;该接口需要实现两个方法&#xff1a;Revit启动时调用的OnStartup 方法&#xff0c;和Revit关闭时调研的OnShutdown 方法。文中还给了个例子&#xff0…

从源码编译安装python

python source code&#xff1a;Python Source Releases | Python.org //下载源代码 wget https://www.python.org/ftp/python/3.8.4/Python-3.8.4.tar.xz //创建安装文件夹 mkdir python384-install //指定CXX环境变量&#xff0c;否则无法正确configure export CXX/bin/g …

Spark参数配置不合理的情况

1.1 内存设置 &#x1f4be; 常见的内存设置有两类&#xff1a;堆内和堆外 &#x1f4a1; 我们作业中大量的设置 driver 和 executor 的堆外内存为 4g&#xff0c;造成资源浪费 &#x1f4c9;。 通常 executor 堆外内存在 executor.cores1 的时候&#xff0c;1g 足够了&…

lxml库在爬虫领域的贡献及应用

重头戏lxml库里面的xpath 一段代码给各位开开胃 这段代码首先导入了lxml库中的etree模块&#xff0c;然后定义了一个包含HTML内容的字符串html。接着&#xff0c;我们使用etree.HTML()函数解析这个HTML字符串&#xff0c;得到一个表示整个HTML文档的树形结构。最后&#xff0c;…

idea在空工程中添加新模块并测试的步骤

ServicesTest是空的工程&#xff0c;没有pom文件。现在需要在ServicesTest目录下添加新模块作为新的工程&#xff0c;目的是写一下别的技术功能。 原先目录结构&#xff0c;ServicesTest是空的工程&#xff0c;没有pom文件。下面的几个模块是新的工程&#xff0c;相互独立。 1.…

讯飞有一个可以根据描述文本自动生成PPT的AI接口,有趣

文档&#xff1a;https://www.xfyun.cn/doc/spark/PPTGeneration.html 价格方面提供了免费1000点的额度&#xff0c;生成一次是10点&#xff0c;正好100次&#xff0c;如果要购买的话最低要购买1344元的&#xff0c;没有按量付费的模式&#xff0c;个人小开发者可买不起。 让我…

美创科技入选“2024网络安全提供商创新排行榜”

近日&#xff0c;DBC德本咨询公布了“2024网络安全提供商创新排行榜”&#xff0c;美创科技凭借近20年的数据安全创新耕耘&#xff0c;荣誉上榜。 此次&#xff0c;与360、华为、腾讯等互联网、网络安全头部厂商并肩上榜&#xff0c;是行业对美创的再次认可。 数据安全的发展离…