当前位置: 代码网 > it编程>编程语言>Asp.net > 基于C#实现SM2加签验签工具

基于C#实现SM2加签验签工具

2024年10月21日 Asp.net 我要评论
效果项目代码using org.bouncycastle.crypto.parameters;using org.bouncycastle.crypto.signers;using org.bounc

效果

项目

代码

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字符串转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字符串转换为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;
            }
        }
    }
}

到此这篇关于基于c#实现sm2加签验签工具的文章就介绍到这了,更多相关c#sm2加签验签内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com