当前位置: 首页 > news >正文

C# SM2 SM3 SM4 使用

目录

效果

SM2

SM3

SM4

项目

代码

SM2Utils.cs

Sm3Utils.cs

Sm4Utils.cs

下载


效果

SM2

公钥:04ca3e272e11b5633681cb0fbbfd8c162be08918ce5b644cd33d49c17be8674caf6c20a11de8b65333924dfe7d42246abb4a4c36b663bef1aafc624a35acf4d2b1
私钥:27e9d8598679a6066f4dfebb2b5d5fe830ce6c6b8b9cf4a4e515e55678ba44a9
原文:测试信息lxw123456!@#$%^&*()abcDEFG
结果:043267543680002a384bdcc8e2db3648f1d5d1a5956ca4798bdfe3ca4a667a620d4df25683e260147ab846a049505ae88ff572f983078f3b1c7d4692c384e6c045292023ff0d69ae3c4f4139b19843a3a5ffa130a1e6758659f4d11a51d32d17a617dda0612319a091a4dcac7e6a67d55f4145c882ca9bbb687641182468a2962d5a0c6bf25ddc

在线校验
地址:https://the-x.cn/cryptography/Sm2.aspx

SM3

SM4

项目

代码

SM2Utils.cs

using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Math.EC;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Utilities.Encoders;
using System;
using System.Text;

namespace SMDemo
{
    public class SM2KeyPair
    {
        public string PrivateKey { get; set; } //私钥
        public string PublicKey { get; set; } //公钥

    }
    public class SM2Utils
    {
        //国密标准256位曲线参数
        BigInteger SM2_ECC_P = new BigInteger("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF", 16);
        BigInteger SM2_ECC_A = new BigInteger("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC", 16);
        BigInteger SM2_ECC_B = new BigInteger("28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93", 16);
        BigInteger SM2_ECC_N = new BigInteger("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123", 16);
        BigInteger SM2_ECC_H = BigInteger.One;
        BigInteger SM2_ECC_GX = new BigInteger("32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7", 16);
        BigInteger SM2_ECC_GY = new BigInteger("BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0", 16);

        public SM2KeyPair GenerateKey()
        {
            ECCurve curve = new FpCurve(SM2_ECC_P, SM2_ECC_A, SM2_ECC_B, SM2_ECC_N, SM2_ECC_H);
            ECPoint g = curve.CreatePoint(SM2_ECC_GX, SM2_ECC_GY);
            ECDomainParameters domainParams = new ECDomainParameters(curve, g, SM2_ECC_N);
            ECKeyPairGenerator keyPairGenerator = new ECKeyPairGenerator();
            ECKeyGenerationParameters aKeyGenParams = new ECKeyGenerationParameters(domainParams, new SecureRandom());
            keyPairGenerator.Init(aKeyGenParams);
            AsymmetricCipherKeyPair aKp = keyPairGenerator.GenerateKeyPair();
            ECPublicKeyParameters aPub = (ECPublicKeyParameters)aKp.Public;
            ECPrivateKeyParameters aPriv = (ECPrivateKeyParameters)aKp.Private;

            BigInteger privateKey = aPriv.D;
            ECPoint publicKey = aPub.Q;

            byte[] pubkey = Hex.Encode(publicKey.GetEncoded());
            string temp_pubkey = Encoding.UTF8.GetString(pubkey);

            string temp_prikey = Encoding.UTF8.GetString(Hex.Encode(privateKey.ToByteArray()));

            return new SM2KeyPair() { PrivateKey = temp_prikey, PublicKey = temp_pubkey };
        }

        /// <summary>
        /// 加密函数
        /// </summary>
        /// <param name="publicKeyStr"></param>
        /// <param name="plainText"></param>
        /// <returns></returns>
        public string Encrypt(string publicKeyStr, string plainText)
        {
            byte[] publicKey = Hex.Decode(publicKeyStr);
            byte[] data = Encoding.UTF8.GetBytes(plainText);

            if (null == publicKey || publicKey.Length == 0)
            {
                return null;
            }
            if (data == null || data.Length == 0)
            {
                return null;
            }
            byte[] source = new byte[data.Length];
            Array.Copy(data, 0, source, 0, data.Length);
            ECCurve curve = new FpCurve(SM2_ECC_P, SM2_ECC_A, SM2_ECC_B, SM2_ECC_N, SM2_ECC_H);
            ECPoint g = curve.CreatePoint(SM2_ECC_GX, SM2_ECC_GY);
            ECDomainParameters domainParams = new ECDomainParameters(curve, g, SM2_ECC_N);
            ECPoint userkey = curve.DecodePoint(publicKey);
            ECPublicKeyParameters aPub = new ECPublicKeyParameters(userkey, domainParams);

            SM2Engine sm2Engine = new SM2Engine();
            sm2Engine.Init(true, new ParametersWithRandom(aPub));
            byte[] enc = sm2Engine.ProcessBlock(source, 0, source.Length);
            return Encoding.UTF8.GetString(Hex.Encode(enc));

        }


        /// <summary>
        /// 解密函数
        /// </summary>
        /// <param name="privateKey"></param>
        /// <param name="encryptedData"></param>
        /// <returns></returns>
        public string Decrypt(string privateKeyStr, string chiperText)
        {
            byte[] privateKey = Hex.Decode(privateKeyStr);
            byte[] encryptedData = Hex.Decode(chiperText);

            if (null == privateKey || privateKey.Length == 0)
            {
                return null;
            }
            if (encryptedData == null || encryptedData.Length == 0)
            {
                return null;
            }

            byte[] enc = new byte[encryptedData.Length];
            Array.Copy(encryptedData, 0, enc, 0, encryptedData.Length);
            BigInteger userD = new BigInteger(1, privateKey);
            ECCurve curve = new FpCurve(SM2_ECC_P, SM2_ECC_A, SM2_ECC_B, SM2_ECC_N, SM2_ECC_H);
            ECPoint g = curve.CreatePoint(SM2_ECC_GX, SM2_ECC_GY);
            ECDomainParameters domainParams = new ECDomainParameters(curve, g, SM2_ECC_N);
            ECPrivateKeyParameters aPriv = new ECPrivateKeyParameters(userD, domainParams);

            SM2Engine sm2Engine = new SM2Engine();
            sm2Engine.Init(false, aPriv);
            byte[] dec = sm2Engine.ProcessBlock(enc, 0, enc.Length);
            return Encoding.UTF8.GetString(dec);
        }
    }
}
 

using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Math.EC;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Utilities.Encoders;
using System;
using System.Text;namespace SMDemo
{public class SM2KeyPair{public string PrivateKey { get; set; } //私钥public string PublicKey { get; set; } //公钥}public class SM2Utils{//国密标准256位曲线参数BigInteger SM2_ECC_P = new BigInteger("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF", 16);BigInteger SM2_ECC_A = new BigInteger("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC", 16);BigInteger SM2_ECC_B = new BigInteger("28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93", 16);BigInteger SM2_ECC_N = new BigInteger("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123", 16);BigInteger SM2_ECC_H = BigInteger.One;BigInteger SM2_ECC_GX = new BigInteger("32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7", 16);BigInteger SM2_ECC_GY = new BigInteger("BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0", 16);public SM2KeyPair GenerateKey(){ECCurve curve = new FpCurve(SM2_ECC_P, SM2_ECC_A, SM2_ECC_B, SM2_ECC_N, SM2_ECC_H);ECPoint g = curve.CreatePoint(SM2_ECC_GX, SM2_ECC_GY);ECDomainParameters domainParams = new ECDomainParameters(curve, g, SM2_ECC_N);ECKeyPairGenerator keyPairGenerator = new ECKeyPairGenerator();ECKeyGenerationParameters aKeyGenParams = new ECKeyGenerationParameters(domainParams, new SecureRandom());keyPairGenerator.Init(aKeyGenParams);AsymmetricCipherKeyPair aKp = keyPairGenerator.GenerateKeyPair();ECPublicKeyParameters aPub = (ECPublicKeyParameters)aKp.Public;ECPrivateKeyParameters aPriv = (ECPrivateKeyParameters)aKp.Private;BigInteger privateKey = aPriv.D;ECPoint publicKey = aPub.Q;byte[] pubkey = Hex.Encode(publicKey.GetEncoded());string temp_pubkey = Encoding.UTF8.GetString(pubkey);string temp_prikey = Encoding.UTF8.GetString(Hex.Encode(privateKey.ToByteArray()));return new SM2KeyPair() { PrivateKey = temp_prikey, PublicKey = temp_pubkey };}/// <summary>/// 加密函数/// </summary>/// <param name="publicKeyStr"></param>/// <param name="plainText"></param>/// <returns></returns>public string Encrypt(string publicKeyStr, string plainText){byte[] publicKey = Hex.Decode(publicKeyStr);byte[] data = Encoding.UTF8.GetBytes(plainText);if (null == publicKey || publicKey.Length == 0){return null;}if (data == null || data.Length == 0){return null;}byte[] source = new byte[data.Length];Array.Copy(data, 0, source, 0, data.Length);ECCurve curve = new FpCurve(SM2_ECC_P, SM2_ECC_A, SM2_ECC_B, SM2_ECC_N, SM2_ECC_H);ECPoint g = curve.CreatePoint(SM2_ECC_GX, SM2_ECC_GY);ECDomainParameters domainParams = new ECDomainParameters(curve, g, SM2_ECC_N);ECPoint userkey = curve.DecodePoint(publicKey);ECPublicKeyParameters aPub = new ECPublicKeyParameters(userkey, domainParams);SM2Engine sm2Engine = new SM2Engine();sm2Engine.Init(true, new ParametersWithRandom(aPub));byte[] enc = sm2Engine.ProcessBlock(source, 0, source.Length);return Encoding.UTF8.GetString(Hex.Encode(enc));}/// <summary>/// 解密函数/// </summary>/// <param name="privateKey"></param>/// <param name="encryptedData"></param>/// <returns></returns>public string Decrypt(string privateKeyStr, string chiperText){byte[] privateKey = Hex.Decode(privateKeyStr);byte[] encryptedData = Hex.Decode(chiperText);if (null == privateKey || privateKey.Length == 0){return null;}if (encryptedData == null || encryptedData.Length == 0){return null;}byte[] enc = new byte[encryptedData.Length];Array.Copy(encryptedData, 0, enc, 0, encryptedData.Length);BigInteger userD = new BigInteger(1, privateKey);ECCurve curve = new FpCurve(SM2_ECC_P, SM2_ECC_A, SM2_ECC_B, SM2_ECC_N, SM2_ECC_H);ECPoint g = curve.CreatePoint(SM2_ECC_GX, SM2_ECC_GY);ECDomainParameters domainParams = new ECDomainParameters(curve, g, SM2_ECC_N);ECPrivateKeyParameters aPriv = new ECPrivateKeyParameters(userD, domainParams);SM2Engine sm2Engine = new SM2Engine();sm2Engine.Init(false, aPriv);byte[] dec = sm2Engine.ProcessBlock(enc, 0, enc.Length);return Encoding.UTF8.GetString(dec);}}
}

Sm3Utils.cs

using Org.BouncyCastle.Crypto.Digests;
using Org.BouncyCastle.Utilities.Encoders;
using System;
using System.Text;namespace SMDemo
{public class Sm3Utils{public static string GetHash(string plainText){String resultHexString = "";// 将字符串转换成byte数组byte[] srcData = Encoding.UTF8.GetBytes(plainText);SM3Digest digest = new SM3Digest();digest.BlockUpdate(srcData, 0, srcData.Length);byte[] hash = new byte[digest.GetDigestSize()];digest.DoFinal(hash, 0);// 将返回的hash值转换成16进制字符串resultHexString = new UTF8Encoding().GetString(Hex.Encode(hash));return resultHexString;}}
}

Sm4Utils.cs

using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Utilities.Encoders;
using System.Text;namespace SMDemo
{public class Sm4Utils{public static string EncryptEBC(string plaintext, string key){var dataBytes = Encoding.UTF8.GetBytes(plaintext);var keyBytes = Encoding.UTF8.GetBytes(key);KeyParameter keyParam = ParameterUtilities.CreateKeyParameter("SM4", keyBytes);IBufferedCipher inCipher = CipherUtilities.GetCipher("SM4/ECB/PKCS7Padding");inCipher.Init(true, keyParam);byte[] cipher = inCipher.DoFinal(dataBytes);return Hex.ToHexString(cipher, 0, cipher.Length);}public static string DecryptEBC(string chipherText, string key){var dataBytes = Hex.Decode(chipherText);var keyBytes = Encoding.UTF8.GetBytes(key);KeyParameter keyParam = ParameterUtilities.CreateKeyParameter("SM4", keyBytes);IBufferedCipher inCipher = CipherUtilities.GetCipher("SM4/ECB/PKCS7Padding");inCipher.Init(false, keyParam);byte[] plain = inCipher.DoFinal(dataBytes);return Encoding.UTF8.GetString(plain);}/// <summary>/// CBC模式加密/// </summary>/// <param name="data"></param>/// <param name="key"></param>/// <returns></returns>public static string EncryptCBC(string plaintext, string key){var dataBytes = Encoding.UTF8.GetBytes(plaintext);var keyBytes = Encoding.UTF8.GetBytes(key);KeyParameter keyParam = ParameterUtilities.CreateKeyParameter("SM4", keyBytes);ParametersWithIV keyParamWithIv = new ParametersWithIV(keyParam, keyBytes);IBufferedCipher inCipher = CipherUtilities.GetCipher("SM4/CBC/PKCS7Padding");inCipher.Init(true, keyParamWithIv);byte[] cipher = inCipher.DoFinal(dataBytes);return Hex.ToHexString(cipher, 0, cipher.Length);}/// <summary>/// CBC模式解密/// </summary>/// <param name="data"></param>/// <param name="key"></param>/// <returns></returns>public static string DecryptCBC(string chipherText, string key){var dataBytes = Hex.Decode(chipherText);var keyBytes = Encoding.UTF8.GetBytes(key);KeyParameter keyParam = ParameterUtilities.CreateKeyParameter("SM4", keyBytes);ParametersWithIV keyParamWithIv = new ParametersWithIV(keyParam, keyBytes);IBufferedCipher inCipher = CipherUtilities.GetCipher("SM4/CBC/PKCS7Padding");inCipher.Init(false, keyParamWithIv);byte[] plain = inCipher.DoFinal(dataBytes);return Encoding.UTF8.GetString(plain);}}
}

下载

下载地址

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 创意微型学生机床工具——金属车床
  • 58、Python之函数高级:不定参数的函数,写出更加通用的装饰器
  • 超声波的应用
  • AOP和注解的配合使用(封装通用日志处理类)
  • 2 html5 浏览器已经支持的新API
  • 腾讯云技术深度解析:AI代码助手与微服务架构的实践应用
  • 服务器数据恢复—如何应对双循环RAID5阵列的数据丢失问题?
  • 【初出江湖】分布式之什么是分布式存储?
  • P-Tuning v2:一种普遍有效的提示调整方法
  • 三分钟搭建线上RAG应用,实现定制化的知识库问答
  • 解锁企业微信营销新纪元:智驭未来,让每一次触达都精准高效!
  • Tensorflow实现深度学习8:猫狗识别
  • Qt Dialog退出事件
  • AIGC时代从新手到高手:B端竞品分析实战案例与技巧分享
  • 华为Huawei路由器交换机SSH配置
  • Go 语言编译器的 //go: 详解
  • input实现文字超出省略号功能
  • Java 23种设计模式 之单例模式 7种实现方式
  • js 实现textarea输入字数提示
  • k个最大的数及变种小结
  • nodejs:开发并发布一个nodejs包
  • PaddlePaddle-GitHub的正确打开姿势
  • PHP那些事儿
  • React系列之 Redux 架构模式
  • springboot_database项目介绍
  • text-decoration与color属性
  • Vue小说阅读器(仿追书神器)
  • 安卓应用性能调试和优化经验分享
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 机器学习 vs. 深度学习
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 区块链共识机制优缺点对比都是什么
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 一个JAVA程序员成长之路分享
  • 2017年360最后一道编程题
  • Mac 上flink的安装与启动
  • ​LeetCode解法汇总518. 零钱兑换 II
  • # .NET Framework中使用命名管道进行进程间通信
  • #QT(一种朴素的计算器实现方法)
  • $jQuery 重写Alert样式方法
  • (C语言)二分查找 超详细
  • (javascript)再说document.body.scrollTop的使用问题
  • (TOJ2804)Even? Odd?
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (黑马C++)L06 重载与继承
  • (六)Flink 窗口计算
  • (论文阅读40-45)图像描述1
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (三)docker:Dockerfile构建容器运行jar包
  • (三)终结任务
  • (四)图像的%2线性拉伸
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • ***测试-HTTP方法
  • ***利用Ms05002溢出找“肉鸡
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)