首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

C# SM2 加签、验签工具

  • 25-02-19 03:41
  • 2197
  • 7488
blog.csdn.net

目录

效果

项目

代码

下载


效果

项目

代码

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;
            }
        }

        ///


        /// Base64字符串转Hex字符串↓
        ///

        ///
        ///
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                byte[] bytes = Convert.FromBase64String(txtBase64.Text); // 将base64字符串转换为byte数组
                string hexString = BitConverter.ToString(bytes).Replace("-", ""); // 将byte数组转换为Hex字符串
                txtHex.Text = hexString;
            }
            catch (Exception ex)
            {
                txtHex.Text = "转换异常:" + 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 = "转换异常:" + 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;
            }
        }
    }
}
 

  1. using Org.BouncyCastle.Crypto.Parameters;
  2. using Org.BouncyCastle.Crypto.Signers;
  3. using Org.BouncyCastle.Asn1.GM;
  4. using System;
  5. using System.Text;
  6. using System.Windows.Forms;
  7. using Org.BouncyCastle.Asn1.X9;
  8. using Org.BouncyCastle.Utilities.Encoders;
  9. using Org.BouncyCastle.Math;
  10. using Org.BouncyCastle.Crypto.Generators;
  11. using Org.BouncyCastle.Security;
  12. using System.Linq;
  13. namespace SM2VerifySignTool
  14. {
  15. public partial class Form1 : Form
  16. {
  17. public Form1()
  18. {
  19. InitializeComponent();
  20. }
  21. int toDigit(char ch, int index)
  22. {
  23. int digit = Convert.ToInt32(ch.ToString(), 16);
  24. if (digit == -1)
  25. {
  26. throw new SystemException("Illegal hexadecimal character " + ch + " at index " + index);
  27. }
  28. return digit;
  29. }
  30. string HexToBase64(string hexString)
  31. {
  32. byte[] bytes = Enumerable.Range(0, hexString.Length)
  33. .Where(x => x % 2 == 0)
  34. .Select(x => Convert.ToByte(hexString.Substring(x, 2), 16))
  35. .ToArray();
  36. return Convert.ToBase64String(bytes);
  37. }
  38. byte[] hexStrToByte(String hexStr)
  39. {
  40. if ((null == hexStr) || (hexStr.Length == 0))
  41. {
  42. return null;
  43. }
  44. char[] hexData = hexStr.ToCharArray();
  45. int len = hexData.Length;
  46. if ((len & 0x1) != 0)
  47. {
  48. throw new SystemException("Odd number of characters.");
  49. }
  50. byte[] out1 = new byte[len >> 1];
  51. int i = 0;
  52. for (int j = 0; j < len; i++)
  53. {
  54. int f = toDigit(hexData[j], j) << 4;
  55. j++;
  56. f |= toDigit(hexData[j], j);
  57. j++;
  58. out1[i] = ((byte)(f & 0xFF));
  59. }
  60. return out1;
  61. }
  62. X9ECParameters x9ec = GMNamedCurves.GetByName("SM2P256V1");
  63. /**
  64. *生成
  65. */
  66. void GenerateKey(out string pubkeyStr, out string prikeyStr)
  67. {
  68. var g = new ECKeyPairGenerator();
  69. g.Init(new ECKeyGenerationParameters(new ECDomainParameters(x9ec), new SecureRandom()));
  70. var k = g.GenerateKeyPair();
  71. byte[] pubkey = ((ECPublicKeyParameters)k.Public).Q.GetEncoded(false);
  72. byte[] privkey = ((ECPrivateKeyParameters)k.Private).D.ToByteArray();
  73. prikeyStr = BitConverter.ToString(privkey).Replace("-", "");
  74. pubkeyStr = BitConverter.ToString(pubkey).Replace("-", "");
  75. }
  76. /**
  77. *加签
  78. */
  79. string Sign(string prikeyStr, string data)
  80. {
  81. byte[] msg = Encoding.UTF8.GetBytes(data);
  82. byte[] priKey = hexStrToByte(prikeyStr);
  83. SM2Signer sm2Signer = new SM2Signer();
  84. ECPrivateKeyParameters privateKeyParameters = new ECPrivateKeyParameters(new BigInteger(1, priKey), new ECDomainParameters(x9ec));
  85. sm2Signer.Init(true, privateKeyParameters);
  86. sm2Signer.BlockUpdate(msg, 0, msg.Length);
  87. return Hex.ToHexString(sm2Signer.GenerateSignature());
  88. }
  89. /*
  90. * 验签
  91. */
  92. bool verifySign(string pubkeyStr, string data, string sign)
  93. {
  94. byte[] signHex = hexStrToByte(sign);
  95. byte[] pubkey = hexStrToByte(pubkeyStr);
  96. byte[] msgByte = Encoding.UTF8.GetBytes(data);
  97. SM2Signer sm2Signer = new SM2Signer();
  98. ECPublicKeyParameters publicKeyParameters = new ECPublicKeyParameters(x9ec.Curve.DecodePoint(pubkey), new ECDomainParameters(x9ec));
  99. sm2Signer.Init(false, publicKeyParameters);
  100. sm2Signer.BlockUpdate(msgByte, 0, msgByte.Length);
  101. return sm2Signer.VerifySignature(signHex);
  102. }
  103. private void btnVerify_Click(object sender, EventArgs e)
  104. {
  105. txtResult.Text = "";
  106. try
  107. {
  108. string pubk = txtPubkey.Text;
  109. string data = txtData.Text;
  110. string sign = txtSign.Text;
  111. bool b = verifySign(pubk, data, sign);
  112. if (b)
  113. {
  114. txtResult.Text = "验证成功";
  115. }
  116. else
  117. {
  118. txtResult.Text = "验证失败";
  119. }
  120. }
  121. catch (Exception ex)
  122. {
  123. txtResult.Text = "验证异常:" + ex.Message;
  124. }
  125. }
  126. /// <summary>
  127. /// Base64字符串转Hex字符串↓
  128. /// </summary>
  129. /// <param name="sender"></param>
  130. /// <param name="e"></param>
  131. private void button1_Click(object sender, EventArgs e)
  132. {
  133. try
  134. {
  135. byte[] bytes = Convert.FromBase64String(txtBase64.Text); // 将base64字符串转换为byte数组
  136. string hexString = BitConverter.ToString(bytes).Replace("-", ""); // 将byte数组转换为Hex字符串
  137. txtHex.Text = hexString;
  138. }
  139. catch (Exception ex)
  140. {
  141. txtHex.Text = "转换异常:" + ex.Message;
  142. }
  143. }
  144. private void Form1_Load(object sender, EventArgs e)
  145. {
  146. //string pubkeyStr = "";
  147. //string prikeyStr = "";
  148. //GenerateKey(out pubkeyStr, out prikeyStr);
  149. //txtPriKey.Text = prikeyStr;
  150. //txtPubkey.Text = pubkeyStr;
  151. }
  152. private void button2_Click(object sender, EventArgs e)
  153. {
  154. try
  155. {
  156. string prik = txtPriKey.Text;
  157. string data = txtData.Text;
  158. txtSign.Text = Sign(prik, data);
  159. }
  160. catch (Exception ex)
  161. {
  162. txtSign.Text = "加签识别:" + ex.Message;
  163. }
  164. }
  165. private void button3_Click(object sender, EventArgs e)
  166. {
  167. string pubkeyStr = "";
  168. string prikeyStr = "";
  169. GenerateKey(out pubkeyStr, out prikeyStr);
  170. txtPriKey.Text = prikeyStr;
  171. txtPubkey.Text = pubkeyStr;
  172. }
  173. private void button4_Click(object sender, EventArgs e)
  174. {
  175. try
  176. {
  177. string hexString = txtHex.Text;
  178. string base64String = HexToBase64(hexString);
  179. txtBase64.Text = base64String;
  180. }
  181. catch (Exception ex)
  182. {
  183. txtBase64.Text = "转换异常:" + ex.Message;
  184. }
  185. }
  186. private void button5_Click(object sender, EventArgs e)
  187. {
  188. try
  189. {
  190. string originalString = txtStr.Text;
  191. byte[] bytes = System.Text.Encoding.UTF8.GetBytes(originalString);
  192. string base64String = Convert.ToBase64String(bytes);
  193. txtBase64.Text = base64String;
  194. }
  195. catch (Exception ex)
  196. {
  197. txtBase64.Text = "编码异常:" + ex.Message;
  198. }
  199. }
  200. private void button6_Click(object sender, EventArgs e)
  201. {
  202. try
  203. {
  204. string base64String = txtBase64.Text;
  205. byte[] bytes = Convert.FromBase64String(base64String);
  206. string decodedString = Encoding.UTF8.GetString(bytes);
  207. txtStr.Text = decodedString;
  208. }
  209. catch (Exception ex)
  210. {
  211. txtStr.Text = "解码异常:" + ex.Message;
  212. }
  213. }
  214. }
  215. }

下载

源码下载

天天代码码天天
微信公众号
.NET 人工智能实践
注:本文转载自blog.csdn.net的天天代码码天天的文章"https://lw112190.blog.csdn.net/article/details/143057089"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top