签名本身有现成的类库可以使用,但是类库要求 XML 格式的秘钥,如果其他人只提供 PEM 格式的秘钥,需要将秘钥转换成 XML 格式的秘钥。
方法1:使用路遥工具箱
方法2:使用 XC.RSAUtil 类库进行转换(要求 .net core)
using System; namespace ConsoleAppCore { class Program { static void Main(string[] args) { string pkcs1Key = @"MIIBOQIBAAJBAMmyN/cdipSvD1N3YTByXoQIwtjy9dW13pCy5FfNes9KAVEjsk0NN8nTR2rAFGIN+cms9bZU3LpLPjtum4/HVPUCAwEAAQJAT+Qm5NwvszswP+hud8klhPkPbO230IHsebZSWjEK7yX2GpQuULPWue+p3mVoCUNaP+KLLIQch5I0DD4OEnKi1QIhAOdURi7gRDznTKv9BlzyJR4lmyba8DABE6uhulwGVpIXAiEA3zToE4kB/H6aaU+TVJ3DQA9vnKuSL5780gRCQO6p9NMCIFEnCGQDewzem9AuOKA8tnbH/JD5947vocXxO55y/sXLAiBMYdOFU95NJJn8rdGSJEa7tkyQhZoKF9MWn4R4qfOZJwIgdWdBWMRZdkhpVQ4zGZPSpTh2uYR5i1pPxOJhv+b+kb0="; Console.WriteLine(XC.RSAUtil.RsaKeyConvert.PrivateKeyPkcs1ToXml(pkcs1Key)); Console.ReadLine(); } } }
有了 XML 格式的秘钥就可以进行签名了(不要求 .net core):
private static string Signature(string originalText, string privateKey) { byte[] byteData = Encoding.UTF8.GetBytes(originalText); RSACryptoServiceProvider provider = new RSACryptoServiceProvider(); provider.FromXmlString(privateKey); byteData = provider.SignData(byteData, new SHA256CryptoServiceProvider());
//return Convert.ToBase64String(byteData);//Base64格式
return BitConverter.ToString(byteData, 0).Replace("-", string.Empty).ToLower();//HEX格式
}