runliuv

runliuv@cnblogs

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

私钥长度2048

--

 

/// <summary>
             /// 生成签名
             /// </summary>
             /// <param name="str">需签名的数据</param>
             /// <param name="privateKey">私钥</param>
             /// <param name="encoding">编码格式 默认utf-8</param>
             /// <returns>签名后的值</returns>
        public static string Signature(string str, string privateKey, string encoding)
        {
            //SHA256withRSA
            //根据需要加签时的哈希算法转化成对应的hash字符节
            //byte[] bt = Encoding.GetEncoding("utf-8").GetBytes(str);
            byte[] bt = Encoding.GetEncoding(encoding).GetBytes(str);
            var sha256 = new SHA256CryptoServiceProvider();
            byte[] rgbHash = sha256.ComputeHash(bt);

            RSACryptoServiceProvider key = new RSACryptoServiceProvider();
            key.FromXmlString(privateKey);
            RSAPKCS1SignatureFormatter formatter = new RSAPKCS1SignatureFormatter(key);
            formatter.SetHashAlgorithm("SHA256");//此处是你需要加签的hash算法,需要和上边你计算的hash值的算法一致,不然会报错。
            byte[] inArray = formatter.CreateSignature(rgbHash);
            return Convert.ToBase64String(inArray);

        }

 

上边的代码完全等效于:

RSACryptoServiceProvider.SignData(byToSign, "SHA256");

 

 

public string   SignData1(string strPriPkcs1,string strDJM)
 {
     //一、私钥签名
     //获取私钥对象
     RSACryptoServiceProvider rsaPri = RsaUtil.LoadPrivateKey(strPriPkcs1, "PKCS1");
     //待签名字符串 转为byte 数组
     byte[] byToSign = Encoding.UTF8.GetBytes(strDJM); // 编码要和其它语言一致,一般是:UTF8 
     byte[] bySigned = rsaPri.SignData(byToSign, "SHA256");//SHA256,对应JAVA,SHA256withRSA,签名结果是 byte 数组
     string strSigned = Convert.ToBase64String(bySigned);//将byte 数组转为字符串,方便传输,一般是base64字符串,其它类型需和对方协商
     Console.WriteLine("签名值:" + strSigned);

     return strSigned;
 }

 

--

posted on 2019-11-08 09:35  runliuv  阅读(7076)  评论(0)    收藏  举报