首页 > 编程语言 >NET/C#中SM2/SM3国密加密算法

NET/C#中SM2/SM3国密加密算法

时间:2023-07-31 18:13:33浏览次数:31  
标签:BouncyCastle rs C# SM3 new Org using byte 加密算法

using Org.BouncyCastle.Asn1;
using Org.BouncyCastle.Asn1.GM;
using Org.BouncyCastle.Asn1.X9;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Utilities;
using Org.BouncyCastle.Utilities.Encoders;
using System;


namespace JuCheap.Core
{
    /// <summary>
    /// SM2/SM3加密帮助类
    /// </summary>
    internal class GmUtil
    {
        private static readonly X9ECParameters _x9ECParameters = GMNamedCurves.GetByName("sm2p256v1");
        private static readonly ECDomainParameters _ecDomainParameters = new ECDomainParameters(_x9ECParameters.Curve, _x9ECParameters.G, _x9ECParameters.N, _x9ECParameters.H, _x9ECParameters.GetSeed());
        private const int _rsLength = 32;

        public byte[] SignSm3WithSm2(byte[] msg, byte[] userId, AsymmetricKeyParameter privateKey)
        {
            return RsAsn1ToPlainByteArray(SignSm3WithSm2Asn1Rs(msg, userId, privateKey));
        }

        public byte[] SignSm3WithSm2Asn1Rs(byte[] msg, byte[] userId, AsymmetricKeyParameter privateKey)
        {
            ISigner signer = SignerUtilities.GetSigner("SM3withSM2");
            signer.Init(true, new ParametersWithID(privateKey, userId));
            signer.BlockUpdate(msg, 0, msg.Length);
            byte[] sig = signer.GenerateSignature();
            return sig;
        }

        public string Sm3WithSm2Signature(string privateKeyStr, string data)
        {
            byte[] msg = System.Text.Encoding.UTF8.GetBytes(data);
            byte[] userId = System.Text.Encoding.UTF8.GetBytes("1234567812345678");
            ECPrivateKeyParameters privateKey = new ECPrivateKeyParameters(new BigInteger(1, Hex.Decode(privateKeyStr)), _ecDomainParameters);
            byte[] sig = SignSm3WithSm2(msg, userId, privateKey);
            return Hex.ToHexString(sig);
        }

        private static byte[] BigIntToFixexLengthBytes(BigInteger rOrS)
        {
            byte[] rs = rOrS.ToByteArray();
            if (rs.Length == _rsLength)
            {
                return rs;
            }
            else if (rs.Length == _rsLength + 1 && rs[0] == 0)
            {
                return Arrays.CopyOfRange(rs, 1, _rsLength + 1);
            }
            else if (rs.Length < _rsLength)
            {
                byte[] result = new byte[_rsLength];
                Arrays.Fill(result, 0);
                Buffer.BlockCopy(rs, 0, result, _rsLength - rs.Length, rs.Length);
                return result;
            }
            throw new ArgumentException("err rs: " + Hex.ToHexString(rs));
        }

        private static byte[] RsAsn1ToPlainByteArray(byte[] rsDer)
        {
            Asn1Sequence seq = Asn1Sequence.GetInstance(rsDer);
            byte[] r = BigIntToFixexLengthBytes(DerInteger.GetInstance(seq[0]).Value);
            byte[] s = BigIntToFixexLengthBytes(DerInteger.GetInstance(seq[1]).Value);
            byte[] result = new byte[_rsLength * 2];
            Buffer.BlockCopy(r, 0, result, 0, r.Length);
            Buffer.BlockCopy(s, 0, result, _rsLength, s.Length);
            return result;
        }
    }
}

使用方法:

using Org.BouncyCastle.Crypto.Digests;
using Org.BouncyCastle.Utilities.Encoders;
using System.Text;

namespace JuCheap.Core
{
    /// <summary>
    /// sm2/sm3加密算法
    /// </summary>
    internal class EncryptionTools
    {
        private EncryptionTools() { }
        /// <summary>
        /// SM3加密
        /// </summary>
        /// <param name="data">加密的数据</param>
        /// <returns></returns>
        public static string Sm3Signature2(string data)
        {
            byte[] dataBytes = Encoding.GetEncoding("UTF-8").GetBytes(data);
            SM3Digest sm3Digest = new SM3Digest();
            sm3Digest.BlockUpdate(dataBytes, 0, dataBytes.Length);
            byte[] ret = new byte[sm3Digest.GetDigestSize()];
            sm3Digest.DoFinal(ret, 0);
            return Hex.ToHexString(ret);
        }

        /// <summary>
        /// SM2加密
        /// </summary>
        /// <param name="authoritySecret">密钥</param>
        /// <param name="signString">加签的字符串</param>
        /// <returns></returns>
        public static string Sm3WithSm2Signature(string authoritySecret, string signString)
        {
            return new GmUtil().Sm3WithSm2Signature(authoritySecret, signString);
        }
    }
}

 

标签:BouncyCastle,rs,C#,SM3,new,Org,using,byte,加密算法
From: https://www.cnblogs.com/jucheap/p/17594111.html

相关文章

  • python openqyxl 操作excel
    importosimportsysfromopenpyxlimportload_workbookclassExcel:#读取数据def__init__(self,excel_path,sheet_name):""":paramexcel_path:excel文件路径:xx/xxx.xlsx:paramsheet_name:需要打开表格名字:sheet1......
  • jumpserver 基于docker ins
    jumpeserver的安装部署1.随机生成加密密钥if["$SECRET_KEY"=""];thenSECRET_KEY=`cat/dev/urandom|tr-dcA-Za-z0-9|head-c50`;echo"SECRET_KEY=$SECRET_KEY">>~/.bashrc;echo$SECRET_KEY;elseecho$SECRET_KEY;fiif[&q......
  • linux 3网络基础 tcp状态和多路IO
    1.tcp状态概念图![tcp状态](I:\网络基础3day\tcp状态.png)简化图![tcp状态简化图](I:\网络基础3day\tcp状态简化图.png)简化图未考虑特殊情况netstat命令(了解)2.半关闭状态半关闭主动方不可以在应用层发送数据,但是可以读数据FINWAIT2阶段![半关闭](I:\网络基础3......
  • centos7下安装docker
    来源:https://www.cnblogs.com/qtzd/p/14679120.htmlDocker安装CentOS7使用Xshell连接远程进行服务器操作环境查看系统内核是3.10以上的[root@localhost~]#uname-r3.10.0-229.el7.x86_64系统版本[root@localhost~]#cat/etc/os-releaseNAME="CentOSLinux"VERSI......
  • 使用powershell找回丢失的RDCManager密码
    内网的一台服务器上的装机默认用户密码忘记了,但是好在别的电脑上使用RDCMan(RemoteDesktopConnectionManager)连接过这台服务器,并且保存了密码。于是经过一番折腾,最后把密码找回来了:  最后成功的powershell脚本来自于这个地址:https://www.undocumented-features.com/2019/......
  • android隐式启动Activity的例子
    android隐式启动Activity的例子【原创】android2.2测试通过android隐匿启动Activity的例子,同样适用于Service,BroadcastReceiver<activityandroid:name=".MyActivityTwo"android:label="ThisMyActivityTwo"><!--这样进行匹配:Intentintent=newIntent(Intent.ACT......
  • 7.kubernetes存储卷、持久卷、pv和pvc、NFS CSI部署示例
    pod资源规范总结资源类型获取:kubectlaip-resources资源群组获取:kubectlaip-versions特定资源的规范获取:kubectlexplain<Kind>.pod运行自主式pod,非受控于工作负载型控制器直接由kubelet管理apiVersion:v1kind:Po......
  • JavaScript 浅拷贝和深拷贝详解
    一、基本数据类型和引用数据类型基本数据类型:1.Number(数字类型)2.String(字符串类型)3.Boolean(布尔类型)4.Null(空类型)5.Undefined(未定义类型)6.Symbol(符号类型)引用数据类型:Object(对象类型):表示一组无序的键值对,例如{name:'张三',age:18}。基本数据类型是简单的数据类型,它......
  • 优维低代码实践:Context / State
    优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。优维低代码实践连载第12期《Context/State》▽在开发中有一项重要的工作......
  • IDEA中连接虚拟机 管理Docker
    IDEA中连接虚拟机管理Docker......