最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于C#實現(xiàn)SM2加簽驗簽工具

 更新時間:2024年10月21日 10:21:02   作者:天天代碼碼天天  
這篇文章主要為大家詳細介紹了如何基于C#實現(xiàn)一個SM2加簽驗簽工具,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

效果

項目

代碼

using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Crypto.Signers;
using Org.BouncyCastle.Asn1.GM;
using System;
using System.Text;
using System.Windows.Forms;
using Org.BouncyCastle.Asn1.X9;
using Org.BouncyCastle.Utilities.Encoders;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Security;
using System.Linq;
 
namespace SM2VerifySignTool
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        int toDigit(char ch, int index)
        {
            int digit = Convert.ToInt32(ch.ToString(), 16);
            if (digit == -1)
            {
                throw new SystemException("Illegal hexadecimal character " + ch + " at index " + index);
            }
            return digit;
        }
 
        string HexToBase64(string hexString)
        {
            byte[] bytes = Enumerable.Range(0, hexString.Length)
                                     .Where(x => x % 2 == 0)
                                     .Select(x => Convert.ToByte(hexString.Substring(x, 2), 16))
                                     .ToArray();
            return Convert.ToBase64String(bytes);
        }
 
        byte[] hexStrToByte(String hexStr)
        {
            if ((null == hexStr) || (hexStr.Length == 0))
            {
                return null;
            }
            char[] hexData = hexStr.ToCharArray();
            int len = hexData.Length;
            if ((len & 0x1) != 0)
            {
                throw new SystemException("Odd number of characters.");
            }
            byte[] out1 = new byte[len >> 1];
            int i = 0;
            for (int j = 0; j < len; i++)
            {
                int f = toDigit(hexData[j], j) << 4;
                j++;
                f |= toDigit(hexData[j], j);
                j++;
                out1[i] = ((byte)(f & 0xFF));
            }
            return out1;
        }
 
        X9ECParameters x9ec = GMNamedCurves.GetByName("SM2P256V1");
 
 
        /**
        *生成
        */
        void GenerateKey(out string pubkeyStr, out string prikeyStr)
        {
            var g = new ECKeyPairGenerator();
            g.Init(new ECKeyGenerationParameters(new ECDomainParameters(x9ec), new SecureRandom()));
            var k = g.GenerateKeyPair();
            byte[] pubkey = ((ECPublicKeyParameters)k.Public).Q.GetEncoded(false);
            byte[] privkey = ((ECPrivateKeyParameters)k.Private).D.ToByteArray();
            prikeyStr = BitConverter.ToString(privkey).Replace("-", "");
            pubkeyStr = BitConverter.ToString(pubkey).Replace("-", "");
        }
 
        /**
        *加簽
        */
        string Sign(string prikeyStr, string data)
        {
            byte[] msg = Encoding.UTF8.GetBytes(data);
            byte[] priKey = hexStrToByte(prikeyStr);
            SM2Signer sm2Signer = new SM2Signer();
            ECPrivateKeyParameters privateKeyParameters = new ECPrivateKeyParameters(new BigInteger(1, priKey), new ECDomainParameters(x9ec));
 
            sm2Signer.Init(true, privateKeyParameters);
            sm2Signer.BlockUpdate(msg, 0, msg.Length);
            return Hex.ToHexString(sm2Signer.GenerateSignature());
        }
 
 
        /*
        * 驗簽
        */
        bool verifySign(string pubkeyStr, string data, string sign)
        {
            byte[] signHex = hexStrToByte(sign);
            byte[] pubkey = hexStrToByte(pubkeyStr);
            byte[] msgByte = Encoding.UTF8.GetBytes(data);
            SM2Signer sm2Signer = new SM2Signer();
            ECPublicKeyParameters publicKeyParameters = new ECPublicKeyParameters(x9ec.Curve.DecodePoint(pubkey), new ECDomainParameters(x9ec));
            sm2Signer.Init(false, publicKeyParameters);
            sm2Signer.BlockUpdate(msgByte, 0, msgByte.Length);
            return sm2Signer.VerifySignature(signHex);
        }
 
        private void btnVerify_Click(object sender, EventArgs e)
        {
            txtResult.Text = "";
            try
            {
                string pubk = txtPubkey.Text;
                string data = txtData.Text;
                string sign = txtSign.Text;
                bool b = verifySign(pubk, data, sign);
                if (b)
                {
                    txtResult.Text = "驗證成功";
                }
                else
                {
                    txtResult.Text = "驗證失敗";
                }
            }
            catch (Exception ex)
            {
                txtResult.Text = "驗證異常:" + ex.Message;
            }
        }
 
        /// <summary>
        /// Base64字符串轉(zhuǎn)Hex字符串↓
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                byte[] bytes = Convert.FromBase64String(txtBase64.Text); // 將base64字符串轉(zhuǎn)換為byte數(shù)組
                string hexString = BitConverter.ToString(bytes).Replace("-", ""); // 將byte數(shù)組轉(zhuǎn)換為Hex字符串
                txtHex.Text = hexString;
            }
            catch (Exception ex)
            {
                txtHex.Text = "轉(zhuǎn)換異常:" + ex.Message;
            }
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            //string pubkeyStr = "";
            //string prikeyStr = "";
            //GenerateKey(out pubkeyStr, out prikeyStr);
            //txtPriKey.Text = prikeyStr;
            //txtPubkey.Text = pubkeyStr;
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                string prik = txtPriKey.Text;
                string data = txtData.Text;
                txtSign.Text = Sign(prik, data);
            }
            catch (Exception ex)
            {
                txtSign.Text = "加簽識別:" + ex.Message;
            }
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            string pubkeyStr = "";
            string prikeyStr = "";
            GenerateKey(out pubkeyStr, out prikeyStr);
            txtPriKey.Text = prikeyStr;
            txtPubkey.Text = pubkeyStr;
        }
 
        private void button4_Click(object sender, EventArgs e)
        {
            try
            {
                string hexString = txtHex.Text;
                string base64String = HexToBase64(hexString);
                txtBase64.Text = base64String;
            }
            catch (Exception ex)
            {
                txtBase64.Text = "轉(zhuǎn)換異常:" + ex.Message;
            }
        }
 
        private void button5_Click(object sender, EventArgs e)
        {
            try
            {
                string originalString = txtStr.Text;
                byte[] bytes = System.Text.Encoding.UTF8.GetBytes(originalString);
                string base64String = Convert.ToBase64String(bytes);
                txtBase64.Text = base64String;
            }
            catch (Exception ex)
            {
                txtBase64.Text = "編碼異常:" + ex.Message;
            }
        }
 
        private void button6_Click(object sender, EventArgs e)
        {
            try
            {
                string base64String = txtBase64.Text;
                byte[] bytes = Convert.FromBase64String(base64String);
                string decodedString = Encoding.UTF8.GetString(bytes);
                txtStr.Text = decodedString;
            }
            catch (Exception ex)
            {
                txtStr.Text = "解碼異常:" + ex.Message;
            }
        }
    }
}

到此這篇關于基于C#實現(xiàn)SM2加簽驗簽工具的文章就介紹到這了,更多相關C#SM2加簽驗簽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • c#中oracle的to_date函數(shù)使用方法

    c#中oracle的to_date函數(shù)使用方法

    C#使用參數(shù)傳值方式操作oracle的date字段,主要介紹了oracle的to_date使用方法,大家參考使用吧
    2014-01-01
  • C#設計模式之ChainOfResponsibility職責鏈模式解決真假美猴王問題實例

    C#設計模式之ChainOfResponsibility職責鏈模式解決真假美猴王問題實例

    這篇文章主要介紹了C#設計模式之ChainOfResponsibility職責鏈模式解決真假美猴王問題,簡單說明了責任鏈模式的概念,并結合《西游記》中真假美猴王故事背景為實例分析了責任鏈模式的具體使用技巧,需要的朋友可以參考下
    2017-09-09
  • C#姓名脫敏的幾種實現(xiàn)方法

    C#姓名脫敏的幾種實現(xiàn)方法

    在C#中實現(xiàn)姓名脫敏,主要通過字符串處理來隱藏部分信息,保護用戶隱私,下面就來詳細的介紹一下幾種實現(xiàn)方法,感興趣的可以了解一下
    2025-11-11
  • C#中設置textbox限制條件的方法

    C#中設置textbox限制條件的方法

    這篇文章主要介紹了C#中設置textbox限制條件的方法,可實現(xiàn)設置像數(shù)量、價格、金額等的textbox的限制條件,用戶只能輸入數(shù)字或小數(shù),是非常實用的技巧,需要的朋友可以參考下
    2014-12-12
  • c#委托學習示例分享

    c#委托學習示例分享

    委托是一個類,它定義了方法的類型,使得可以將方法當作另一個方法的參數(shù)來進行傳遞,這種將方法動態(tài)地賦給參數(shù)的做法,可以避免在程序中大量使用If-Else(Switch)語句,同時使得程序具有更好的可擴展性,下面是c#委托示例
    2014-03-03
  • C# Hook鉤子實例代碼 截取鍵盤輸入

    C# Hook鉤子實例代碼 截取鍵盤輸入

    C# Hook鉤子實例代碼之截取鍵盤輸入,需要的朋友可以參考下
    2013-05-05
  • ListView Adapter優(yōu)化 實例

    ListView Adapter優(yōu)化 實例

    ListView Adapter優(yōu)化 實例,需要的朋友可以參考一下
    2013-04-04
  • C# Memcached緩存用法實例詳解

    C# Memcached緩存用法實例詳解

    這篇文章主要介紹了C#中Memcached緩存用法,以實例形式詳細講述了在C#中針對Memcached緩存的各種操作,非常具有實用價值,需要的朋友可以參考下
    2014-10-10
  • C#中Task異步的常用方法

    C#中Task異步的常用方法

    Task是微軟極力推薦的一種多線程處理方式,在線程的延續(xù)、取消,以及多個線程的等待處理等方面要優(yōu)于Thread,ThreadPool,以下介紹的是Task的常用方法,需要的朋友可以參考下
    2025-07-07
  • C#操作Clipboard讀取剪切板中數(shù)據(jù)實例詳解

    C#操作Clipboard讀取剪切板中數(shù)據(jù)實例詳解

    這篇文章主要介紹了C#操作Clipboard讀取剪切板中數(shù)據(jù)的方法,實例分析了C#讀取剪貼板數(shù)據(jù)的具體步驟與實現(xiàn)技巧,需要的朋友可以參考下
    2015-05-05

最新評論

喜德县| 禹城市| 岫岩| 南江县| 乌鲁木齐市| 武鸣县| 乐平市| 沈丘县| 九江县| 凤台县| 文登市| 渝北区| 镇雄县| 辽中县| 彰武县| 鲜城| 湖南省| 宁河县| 万源市| 辉县市| 彭泽县| 扶余县| 尼勒克县| 洛隆县| 宁陕县| 开远市| 全南县| 康保县| 黄龙县| 吴川市| 绍兴县| 桦南县| 徐州市| 雅江县| 大安市| 名山县| 金湖县| 县级市| 淄博市| 江川县| 柳林县|