java和C#使用证书对参数签名、加密

1 篇文章 0 订阅

    基于C#平台发起支付请求,提交到java平台进行支付的过程,涉及到双方平台使用的签名、加密方式和数据请求方式做了一个小结。主要提供MD5加密、SHA256withRSA签名,以下代码包含了java和C#使用证书对参数签名、加密。

一、证书签名(C#)
    1、请求接口参数       
            Dictionary<string, string> dic = new Dictionary<string, string>();
            dic.Add("param1", "param1");
            dic.Add("param2", "param2");
            dic.Add("param3", "param3");
            string dicStr="************";//按照接口加密方式拼接参数得到要签名的支付串
    2、对参数签名(对应java的SHA256withRSA签名方式有效)                   
            string sign = CaRsaEncrypt(dicStr);//证书加密
            dic.Add("sign", sign);
            //将字典转为json格式字符串            
            string jsonData = js.Serialize(dic);
            //通过post请求提交
            string url="请求接口url";       
            var result= PostGetJson<T>(url, jsonData);
    3、函数         
        /// <summary>
        /// 1、CA对字符串加密
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public string CaRsaEncrypt(string str)
        {
            //获取商户数字证书编号
            string path = HttpContext.Current.Server.MapPath("~/");
            //证书路径
            string cert = path + "cert\\证书.p12";
            //调用证书           
            //SHA256WithRSA  
            X509Certificate2 privateCert = new X509Certificate2(cert, "证书密码", X509KeyStorageFlags.Exportable);
            RSACryptoServiceProvider privateKey = (RSACryptoServiceProvider)privateCert.PrivateKey;
            // 获取私钥 
            RSACryptoServiceProvider privateKey1 = new RSACryptoServiceProvider();
            privateKey1.ImportParameters(privateKey.ExportParameters(true));
            byte[] data = Encoding.UTF8.GetBytes(str);
            byte[] signature = privateKey1.SignData(data, "SHA256");
            //对签名密文进行Base64编码 
            return Convert.ToBase64String(signature);
        }  
        /// <summary>
        /// 2、发起Post请求
        /// </summary>
        /// <typeparam name="T">返回数据类型(Json对应的实体)</typeparam>
        /// <param name="url">请求Url</param>
        /// <param name="cookieContainer">CookieContainer,如果不需要则设为null</param>
        /// <param name="fileStream">文件流</param>
        /// <param name="encoding"></param>
        /// <param name="cer">证书,如果不需要则保留null</param>
        /// <param name="timeOut">代理请求超时时间(毫秒)</param>
        /// <param name="checkValidationResult">验证服务器证书回调自动验证</param>
        /// <returns></returns>
        public  T PostGetJson<T>(string url, string data)
        {
            string response = PostJsonSend(url, data);
            var result = GetResult<T>(response);
            return result;
        }
        /// <summary>
        /// 3、获取Post结果
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="returnText"></param>
        /// <returns></returns>
        public T GetResult<T>(string returnText)
        {
            if(string.IsNullOrEmpty(returnText))
            {
                return default(T);
            }
            T result = JsonConvert.DeserializeObject<T>(returnText); 
            return result;
        }
        /// <summary>
        /// 4、通过POST方式发送数据
        /// </summary>
        /// <param name="url">目标URL</param>
        /// <param name="strData">Post数据</param>
        /// <returns></returns>
        public string PostJsonSend(string url, string strData)
        {
            string retString = string.Empty;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "POST";
            //request.ContentType = "application/x-www-form-urlencoded";
            request.ContentType = "application/json; charset=UTF-8";
            byte[] bytes = Encoding.UTF8.GetBytes(strData);
            request.ContentLength = bytes.Length;
            request.AllowAutoRedirect = true;
            request.MaximumAutomaticRedirections = 5;
            request.Timeout = 20000;
            request.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)";
            request.Proxy = null;
            bool IsIn = true;
            try
            {
                Stream myRequestStream = request.GetRequestStream();
                myRequestStream.Write(bytes, 0, bytes.Length);
                myRequestStream.Close();
            }
            catch (WebException wex)
            {
                retString = wex.Status.ToString();
                IsIn = false;
            }
            if (IsIn == false)
            {
                return "访问超时.";
            }
            StreamReader myStreamReader = null;
            Stream myResponseStream = null;
            WebResponse wr = null;
            try
            {
                wr = request.GetResponse();
            }
            catch (WebException wex)
            {
                retString = wex.Message.ToString();
            }

            if (wr != null)
            {
                try
                {
                    HttpWebResponse response = (HttpWebResponse)wr;
                    myResponseStream = response.GetResponseStream();
                    if (myResponseStream != null)
                    {
                        myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
                        retString = myStreamReader.ReadToEnd();
                        if (retString == null)
                        {
                            retString = string.Empty;
                        }
                    }
                }
                catch (Exception ex)
                {
                    retString = ex.Message;
                }
                finally
                {
                    myStreamReader.Close();
                    myResponseStream.Close();
                }
            }
            return retString;
        }

二、MD5加密(C#)
    1、请求参数 
            Dictionary<string, string> dic = new Dictionary<string, string>();
            dic.Add("param1", "value1");
            dic.Add("param2", "value2");
            dic.Add("param3", "value3");
            //拼接参数
            string str = YouClass.DicToString(dic);//自定义方法对字典进行处理
            string encryptStr=EncryptByMD5(str);//加密

    2、加密方法
        /// <summary>
        /// MD5加密为32字符长度的16进制字符串
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public string EncryptByMD5(string input)
        {
            MD5 md5Hasher = MD5.Create();
            byte[] data = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(input));
            StringBuilder sBuilder = new StringBuilder();
            //将每个字节转为16进制
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }
            return sBuilder.ToString().ToUpper();
        }


三、对应的java证书签名代码(java)

        InputStream resourceAsStream = Program.class.getClassLoader().getResourceAsStream("用户证书.p12");
        String passwd = "证书密码";
        String alias = "conname";
        String keyStoreType = "PKCS12";

        KeyCertInfo keyCertInfo = CryptoUtil.fileStreamToKeyCertInfo(resourceAsStream,passwd,keyStoreType,alias);
        BouncyCastleProvider bouncyCastleProvider = new BouncyCastleProvider();
        Signature signature = Signature.getInstance("SHA256withRSA",bouncyCastleProvider);
        //请求参数
        Map<String,String> translateResultData=new HashMap<>();
        translateResultData.put("param1","value1");
        translateResultData.put("param2","value2");
        translateResultData.put("param3","value3");

        //签名
        String sign = SignatureUtil.sign(signature,content, (PrivateKey) keyCertInfo.getPrivateKey());

完结:到这里文章就先告一段落,希望对自己和他人有点帮助。


### 回答1: javasm2加密算法是一个基于椭圆曲线密码体制的非对称加密算法,它利用椭圆曲线上的点和点间的运算来实现加密和解密的过程。 具体的步骤如下: 1. 选择一个椭圆曲线参数集,包括曲线方程、椭圆曲线基点和曲线上的一个大整数N。 2. 选择一个私钥,即一个小于N的整数d作为加密方的私钥。 3. 根据私钥d计算公钥Q,即Q=d*G,其中G是椭圆曲线的基点。 4. 将待加密的明文转化为椭圆曲线上的点P,通过对明文进行哈希算法得到一个大整数H,然后将H与椭圆曲线的基点G相乘得到点P=H*G。 5. 选择一个随机数k,并计算点C1=k*G和C2=P+k*Q,其中C1和C2分别是加密后的曲线上的点。 6. 最终的密文为将C1和C2表示成字节串的形式。 对于解密过程,将C1和C2恢复成椭圆曲线上的点,即C1=k*G,C2=P+k*Q,然后通过计算C2-k*C1恢复出明文的点P,并将P转化成原始的明文。 javasm2加密算法通过利用椭圆曲线的数学性质,使得加密强度较高,同时运算速度也比较快。该算法被广泛应用于密码学领域,用于保护敏感信息的安全。 ### 回答2: JavaSM2是一种基于Java开发的SM2非对称加密算法的实现。SM2是中国自主研发的一种密码算法,其具有良好的安全性和高效性,特别适用于数字签名和密钥交换等场景。 JavaSM2的使用步骤如下: 1.生成密钥对:首先使用Java的密钥生成器生成SM2的公钥和私钥。公钥用于加密和验证数字签名,而私钥用于解密和生成数字签名。 2.加密数据:使用SM2的公钥对待加密的数据进行加密加密后的数据只能使用相应的私钥进行解密。 3.解密数据:使用SM2的私钥对加密后的数据进行解密,得到原始数据。 4.生成数字签名使用SM2的私钥对待签名的数据进行签名,生成数字签名。数字签名用于验证数据的完整性和真实性。 5.验证数字签名使用SM2的公钥对数字签名进行验证,确认数据的完整性和真实性。 JavaSM2的优点是具有较高的安全性,采用SM2算法可以保证数据的机密性和完整性。此外,它还具有高效性,能够在较短的时间内完成加密、解密和签名等操作。 总体而言,JavaSM2加密是一种安全可靠的加密算法实现,适用于各种安全通信和数据传输场景。 ### 回答3: JavaSM2是一种基于国密SM2算法的加密技术。SM2算法是中国自主研发的非对称加密算法,可用于数字签名、密钥交换和加密等安全通信应用。 JavaSM2加密C意味着使用Java语言实现SM2算法对C语言代码进行加密保护。加密过程大致分为三个步骤: 1. 密钥生成:首先需要生成SM2算法所需的密钥对,包括公钥和私钥。公钥用于加密,私钥用于解密。JavaSM2通过调用相关API生成密钥对。 2. 加密处理:将要加密的C语言代码转化为字节流数据,再调用JavaSM2提供的API进行加密操作。加密后的数据将变得不可读且不易被篡改,提高代码的安全性。 3. 解密操作:将加密的数据传递给相应的解密方法,并使用私钥进行解密处理。解密后的数据将还原成原始的C语言代码,以便进行后续的使用和执行。 通过JavaSM2加密C语言代码可以提高代码的安全性,防止代码泄露和恶意篡改,保护软件的知识产权。同时也能够保护软件系统的安全,减少攻击者对系统的恶意入侵。因此,JavaSM2加密C语言代码在保障信息安全和知识产权保护方面具有重要的意义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值