私钥长度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; }
--