码迷,mamicode.com
首页 > 其他好文 > 详细

众签demo

时间:2018-06-28 22:52:39      阅读:438      评论:0      收藏:0      [点我收藏+]

标签:stat   anr   component   sequence   false   bytes   while   build   url   

众签demo

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography;
using System.IO;
using System.Net.NetworkInformation;
using System.Xml;
using System.Net;
using System.Text.RegularExpressions;
using System.Net.Security;
using System.IO.Compression;

namespace ConsoleApp1
{
    class Program
    {
        static string private_key = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANIwqMKRiZMTMerWYJsp54AoMUcIbgZsdB4FjtGAzabh/NYH9ptNgNBfBo78yShPCP5c0wB0MVqg3wv5ExQRcCA5uj1ajO+FuHy5ESxmDDftxOzQlpHlMdvxCLZwJjy0+Il2AsZcbcSy3HMDN8HGhOG01A9rllbx6JnyC8hFdd+7AgMBAAECgYBztZHRuqjPrGt4ahe4k3L73CR0hDF9m8q4lDqxHoUX76RudufNSvc0vnsvz/01EX1T+em2gECDMbhYMP/NtmPQegoVIsojSGSSF8Q+q7JOCQlDi9JXiRMkoj+uSMeSqa4EbqOdoFAj+F8BlzYJCUCdfdcJRR4Zb8seFNlpUfDToQJBAPMGQt8dWfFGDGlo9Tnif5GIlz09Of7odn/NOyFb6c+fca0ufrg816GWGgLBl0qnj8bO/93P+EY0MWsVF8RytRkCQQDdaZtWGm9YImGT+PKdKapQvt0C5RAfi2OAnRndqCs8bA1K1kPII8hg/t2QFPshx48pqayJ7ve5/dmeig1y0eHzAkAKWnHu32k9hiZxNy97T9LveEo5KaqW2YBy4WNrgGbtmXVWU2zCnJTzJVnmVCkF3S2a4qaz5HBHTWHtlfB1Rg3BAkEA0cpr3fTkRX0mOf/rWhENiL6gSUrjsQ/w8v9ob8cVWIYFPkCxLuUAyy8Snp/SqFofA1n62yMrZPbriTXDsmS+EwJBAOFhYJS/x04TKX3H4iGDXLKLTSaQWoDyHBIZG61HSLVI8UTTre/Efc8jrs6GnYXkXAA0KeAcUQDxdeF0YRFhc2g=";
        static string zqid = "2FB987B8DCCBA679549";
        private static readonly string DefaultUserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
        static void Main(string[] args)
        {
            IDictionary<string, string> paramsMap = new Dictionary<string, string>();
            paramsMap.Add("zqid", zqid);//唯一标示
            paramsMap.Add("signer", "2016112301");//用户唯一标示
            paramsMap.Add("contract_num", "NET-C003"); //合同编号
            paramsMap.Add("return_url", "test");//回调函地址
            paramsMap.Add("notify_url", "test");//回调函地址
            String context = GetSignContent(paramsMap);
            Console.WriteLine("context:{0}", context);
            string ws_sign_val = sign(context, private_key);
            Console.WriteLine("ws_sign_val:{0}", ws_sign_val);
            string url = "http://117.78.52.103/signAutomatic";
            HttpWebResponse res = (HttpWebResponse)CreatePostHttpResponse(url, paramsMap, 3000000, null, Encoding.UTF8, new CookieCollection());

            string result = string.Empty;
 
            using (System.IO.StreamReader reader = new System.IO.StreamReader(res.GetResponseStream()))
            {
                result = reader.ReadToEnd();
                reader.Close();

            }

            Console.WriteLine("result:{0}", result);
            Console.ReadKey();
        }

        public static string GetSignContent(IDictionary<string, string> parameters)
        {
            IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(parameters);
            IEnumerator<KeyValuePair<string, string>> dem = sortedParams.GetEnumerator();

            // 第二步:把所有参数名和参数值串在一起
            StringBuilder query = new StringBuilder("");
            while (dem.MoveNext())
            {
                string key = dem.Current.Key;
                string value = dem.Current.Value;
                if (!string.IsNullOrEmpty(key))
                {
                    query.Append(key).Append("=").Append(value).Append("&");
                }
            }
            string content = query.ToString().Substring(0, query.Length - 1);

            return content;
        }

        public static string sign(string content, string privateKey)
        {

            byte[] Data = Encoding.UTF8.GetBytes(content);

            RSACryptoServiceProvider rsa = DecodePemPrivateKey(privateKey);

            SHA1 sh = new SHA1CryptoServiceProvider();

            byte[] signData = rsa.SignData(Data, sh);

            return Convert.ToBase64String(signData);

        }

        private static RSACryptoServiceProvider DecodePemPrivateKey(String pemstr)
        {

            byte[] pkcs8privatekey;

            pkcs8privatekey = Convert.FromBase64String(pemstr);

            if (pkcs8privatekey != null)
            {

                RSACryptoServiceProvider rsa = DecodePrivateKeyInfo(pkcs8privatekey);

                return rsa;

            }

            else

                return null;

        }

        private static RSACryptoServiceProvider DecodePrivateKeyInfo(byte[] pkcs8)
        {

            byte[] SeqOID = { 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00 };

            byte[] seq = new byte[15];

            MemoryStream mem = new MemoryStream(pkcs8);

            int lenstream = (int)mem.Length;

            BinaryReader binr = new BinaryReader(mem); //wrap Memory Stream with BinaryReader for easy reading

            byte bt = 0;

            ushort twobytes = 0;

            try
            {

                twobytes = binr.ReadUInt16();

                if (twobytes == 0x8130) //data read as little endian order (actual data order for Sequence is 30 81)

                    binr.ReadByte(); //advance 1 byte

                else if (twobytes == 0x8230)

                    binr.ReadInt16(); //advance 2 bytes

                else

                    return null;

                bt = binr.ReadByte();

                if (bt != 0x02)

                    return null;

                twobytes = binr.ReadUInt16();

                if (twobytes != 0x0001)

                    return null;

                seq = binr.ReadBytes(15); //read the Sequence OID

                if (!CompareBytearrays(seq, SeqOID)) //make sure Sequence for OID is correct

                    return null;

                bt = binr.ReadByte();

                if (bt != 0x04) //expect an Octet string

                    return null;

                bt = binr.ReadByte(); //read next byte, or next 2 bytes is 0x81 or 0x82; otherwise bt is the byte count

                if (bt == 0x81)

                    binr.ReadByte();

                else

                    if (bt == 0x82)

                    binr.ReadUInt16();

                //------ at this stage, the remaining sequence should be the RSA private key

                byte[] rsaprivkey = binr.ReadBytes((int)(lenstream - mem.Position));

                RSACryptoServiceProvider rsacsp = DecodeRSAPrivateKey(rsaprivkey);

                return rsacsp;

            }

            catch (Exception)
            {

                return null;

            }

            finally { binr.Close(); }

        }


        private static bool CompareBytearrays(byte[] a, byte[] b)
        {

            if (a.Length != b.Length)

                return false;

            int i = 0;

            foreach (byte c in a)
            {

                if (c != b[i])

                    return false;

                i++;

            }

            return true;

        }


        public static WebResponse CreatePostHttpResponse(string url, IDictionary<string, string> parameters, int? timeout, string userAgent, Encoding requestEncoding, CookieCollection cookies)
        {
            if (string.IsNullOrEmpty(url))
            {
                throw new ArgumentNullException("url");
            }
            if (requestEncoding == null)
            {
                throw new ArgumentNullException("requestEncoding");
            }
            HttpWebRequest request = null;
            //如果是发送HTTPS请求  
            if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
            {
                ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
                request = WebRequest.Create(url) as HttpWebRequest;
                request.ProtocolVersion = HttpVersion.Version10;
            }
            else
            {
                request = WebRequest.Create(url) as HttpWebRequest;
            }
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";

            if (!string.IsNullOrEmpty(userAgent))
            {
                request.UserAgent = userAgent;
            }
            else
            {
                request.UserAgent = DefaultUserAgent;
            }

            if (timeout.HasValue)
            {
                request.Timeout = timeout.Value;
            }
            if (cookies != null)
            {
                request.CookieContainer = new CookieContainer();
                request.CookieContainer.Add(cookies);
            }
            //如果需要POST数据  
            if (!(parameters == null || parameters.Count == 0))
            {
                StringBuilder buffer = new StringBuilder();
                int i = 0;
                foreach (string key in parameters.Keys)
                {
                    if (i > 0)
                    {
                        buffer.AppendFormat("&{0}={1}", key, parameters[key]);
                    }
                    else
                    {
                        buffer.AppendFormat("{0}={1}", key, parameters[key]);
                    }
                    i++;
                }

                byte[] data = requestEncoding.GetBytes(buffer.ToString());
                using (Stream stream = request.GetRequestStream())
                {
                    stream.Write(data, 0, data.Length);
                    stream.Close();
                }
                ;
                System.Console.Write(data.ToString() + "\n-----------");
                /* Stream myResponseStream = request.GetResponse().GetResponseStream();
                 StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
                 string retString = myStreamReader.ReadToEnd();
                 System.Console.Write(retString);*/
                //HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                /*   string result = string.Empty;

                   using (System.IO.StreamReader reader = new System.IO.StreamReader(response.GetResponseStream()))
                   {
                       result = reader.ReadToEnd();

                   System.Console.Write(result+"\n");
                   }*/
            }
            return (HttpWebResponse)request.GetResponse();
        }


        private static RSACryptoServiceProvider DecodeRSAPrivateKey(byte[] privkey)
        {

            byte[] MODULUS, E, D, P, Q, DP, DQ, IQ;

            // --------- Set up stream to decode the asn.1 encoded RSA private key ------

            MemoryStream mem = new MemoryStream(privkey);

            BinaryReader binr = new BinaryReader(mem); //wrap Memory Stream with BinaryReader for easy reading

            byte bt = 0;

            ushort twobytes = 0;

            int elems = 0;

            try
            {

                twobytes = binr.ReadUInt16();

                if (twobytes == 0x8130) //data read as little endian order (actual data order for Sequence is 30 81)

                    binr.ReadByte(); //advance 1 byte

                else if (twobytes == 0x8230)

                    binr.ReadInt16(); //advance 2 bytes

                else

                    return null;

                twobytes = binr.ReadUInt16();

                if (twobytes != 0x0102) //version number

                    return null;

                bt = binr.ReadByte();

                if (bt != 0x00)

                    return null;

                //------ all private key components are Integer sequences ----

                elems = GetIntegerSize(binr);

                MODULUS = binr.ReadBytes(elems);

                elems = GetIntegerSize(binr);

                E = binr.ReadBytes(elems);

                elems = GetIntegerSize(binr);

                D = binr.ReadBytes(elems);

                elems = GetIntegerSize(binr);

                P = binr.ReadBytes(elems);

                elems = GetIntegerSize(binr);

                Q = binr.ReadBytes(elems);

                elems = GetIntegerSize(binr);

                DP = binr.ReadBytes(elems);

                elems = GetIntegerSize(binr);

                DQ = binr.ReadBytes(elems);

                elems = GetIntegerSize(binr);

                IQ = binr.ReadBytes(elems);

                // ------- create RSACryptoServiceProvider instance and initialize with public key -----

                RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

                RSAParameters RSAparams = new RSAParameters();

                RSAparams.Modulus = MODULUS;

                RSAparams.Exponent = E;

                RSAparams.D = D;

                RSAparams.P = P;

                RSAparams.Q = Q;

                RSAparams.DP = DP;

                RSAparams.DQ = DQ;

                RSAparams.InverseQ = IQ;

                RSA.ImportParameters(RSAparams);

                return RSA;

            }

            catch (Exception)
            {

                return null;

            }

            finally { binr.Close(); }

        }


        private static int GetIntegerSize(BinaryReader binr)
        {
            byte bt = 0;
            byte lowbyte = 0x00;
            byte highbyte = 0x00;
            int count = 0;
            bt = binr.ReadByte();
            if (bt != 0x02)        //expect integer
                return 0;
            bt = binr.ReadByte();

            if (bt == 0x81)
                count = binr.ReadByte();    // data size in next byte
            else
                if (bt == 0x82)
            {
                highbyte = binr.ReadByte(); // data size in next 2 bytes
                lowbyte = binr.ReadByte();
                byte[] modint = { lowbyte, highbyte, 0x00, 0x00 };
                count = BitConverter.ToInt32(modint, 0);
            }
            else
            {
                count = bt;     // we already have the data size
            }

            while (binr.ReadByte() == 0x00)
            {    //remove high order zeros in data
                count -= 1;
            }
            binr.BaseStream.Seek(-1, SeekOrigin.Current);        //last ReadByte wasn‘t a removed zero, so back up a byte
            return count;
        }

        private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            return true; //总是接受  
        }
    }
}

 

众签demo

标签:stat   anr   component   sequence   false   bytes   while   build   url   

原文地址:https://www.cnblogs.com/yechangzhong-826217795/p/9240956.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!