zoukankan      html  css  js  c++  java
  • 众签demo

    众签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() + "
    -----------");
                    /* 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+"
    ");
                       }*/
                }
                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; //总是接受  
            }
        }
    }
  • 相关阅读:
    ESP8266型号对比
    Arduino安装ESP8266开发库
    ESP8266驱动I2C OLED显示屏
    爬虫与反爬技术汇总
    爬虫之爬取某道技术分析
    爬虫之12306模拟登陆和购票
    web开发之用户单点登陆和多用户登陆实现
    爬虫中如何获取图片验证码
    web开发中图片保存问题
    python的缓存机制
  • 原文地址:https://www.cnblogs.com/yechangzhong-826217795/p/9240956.html
Copyright © 2011-2022 走看看