简单的记录一下。还望指点
/// <summary>
/// 通过RSA 和 SHA256进行签名
/// </summary>
public static class signRSAHelper{
public static string publicKey;
public static string ToXmlStringExt(this RSA rsa,bool includePrivateParamters){
var p = rsa.ExportParameters(includePrivateParamters);
XElement xml;
if(includePrivateParamters){
xml = new XElement("RESKeyValue",
new XElement("Modulus",Convert.ToBase64String(p.Modulus)),
new XElement("Exponent",Convert.ToBase64String(p.Exponent)),
new XElement("P",Convert.ToBase64String(p.P)),
new XElement("Q",Convert.ToBase64String(p.Q)),
new XElement("DP",Convert.ToBase64String(p.DP)),
new XElement("InverseQ",Convert.ToBase64String(p.InverseQ))
);
}else{
xml = new XElement("RSAKeyVaule",
new XElement("Modulus",Convert.ToBase64String(p.Modulus)),
new XElement("Exponent",Convert.ToBase64String(p.Exponent))
);
}
return xml?.ToString();
}
public static void FromXmlStringExt(this RSA rsa,string parametersAsXml){
var xml = XDocument.Parse(parametersAsXml);
var root = xml.Element("RSAKeyValue");
var p = new RSAParameters{
Modulus = Convert.FromBase64String(root.Element("Modulus").Value),
Exponent = Convert.FromBase64String(root.Element("Exponent").Value)
};
if(root.Element("P") != null){
p.P = Convert.FromBase64String(root.Element("P").Value);
p.Q = Convert.FromBase64String(root.Element("Q").Value);
p.DP = Convert.FromBase64String(root.Element("DP").Value);
p.DQ = Convert.FromBase64String(root.Element("DQ").Value);
p.InverseQ = Convert.FromBase64String(root.Element("InverseQ").Value);
}
rsa.ImportParameters(p);
}
public static string GenerateSignature(string data){
byte [] dataBytes = Encoding.Unicode.GetBytes(data);
var sha = SHA256.Create();
var Hashdata = sha.ComputeHash(dataBytes);
var rsa = RSA.Create();
publicKey = rsa.ToXmlString(false);
return Convert.ToBase64String(rsa.SignHash(Hashdata,HashAlgorithmName.SHA256,RSASignaturePadding.Pkcs1));
}
public static bool ValiDateSignature(string data,string signatuare){
byte [] dataBytes = Encoding.Unicode.GetBytes(data);
var sha = SHA256.Create();
var hashData = sha.ComputeHash(dataBytes);
byte [] signatureBytes = Convert.FromBase64String(signatuare);
var rsa = RSA.Create();
rsa.FromXmlStringExt(publicKey);
return rsa.VerifyHash(hashData,signatureBytes,HashAlgorithmName.SHA256,RSASignaturePadding.Pkcs1);
}
}