引用:encoding - Signing and verifying signatures with RSA C# - Stack Overflow
1.首先生成Key
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
{
//Export the key information to an RSAParameters object.
//Pass false to export the public key information or pass
//true to export public and private key information.
//RSAParameters RSAPublicParams = RSA.ExportParameters(false);
//RSAParameters RSAPrivateParams = RSA.ExportParameters(false);
var publicKye = RSA.ExportXmlPublicKey();
var privateKye = RSA.ExportXmlPrivateKey();
}
2. 使用上面保存的Key
var signText = "";
var originalMessage = "this is a test.";
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
{
RSA.FromXmlString(privateKey);
var parameterKey = RSA.ExportParameters(true);
signText = SignData(originalMessage, parameterKey);
Console.WriteLine(signText);
}
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
{
RSA.FromXmlString(publickKey);
var parameterKey = RSA.ExportParameters(false);
var result = VerifyData(originalMessage, signText, parameterKey);
Console.WriteLine(result);
}
static string SignData(string message, RSAParameters privateKey)
{
The array to store the signed message in bytes
byte[] signedBytes;
using (var rsa = new RSACryptoServiceProvider())
{
Write the message to a byte array using UTF8 as the encoding.
byte[] originalData = Encoding.UTF8.GetBytes(message);
try
{
Import the private key used for signing the message
rsa.ImportParameters(privateKey);
Sign the data, using SHA512 as the hashing algorithm
signedBytes = rsa.SignData(originalData, CryptoConfig.MapNameToOID("SHA512"));
}
catch (CryptographicException e)
{
Console.WriteLine(e.Message);
return null;
}
finally
{
Set the keycontainer to be cleared when rsa is garbage collected.
rsa.PersistKeyInCsp = false;
}
}
Convert the a base64 string before returning
return Convert.ToBase64String(signedBytes);
}
static bool VerifyData(string originalMessage, string signedMessage, RSAParameters publicKey)
{
bool success = false;
using (var rsa = new RSACryptoServiceProvider())
{
try
{
byte[] bytesToVerify = Encoding.UTF8.GetBytes(originalMessage);
byte[] signedBytes = Convert.FromBase64String(signedMessage);
rsa.ImportParameters(publicKey);
SHA512Managed Hash = new SHA512Managed();
byte[] hashedData = Hash.ComputeHash(signedBytes);
success = rsa.VerifyData(bytesToVerify, CryptoConfig.MapNameToOID("SHA512"), signedBytes);
}
catch (CryptographicException e)
{
Console.WriteLine(e.Message);
}
finally
{
rsa.PersistKeyInCsp = false;
}
}
return success;
}