Попробуйте это:
class Program
{
static byte[] Sign(string message, RSAParameters key)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(key);
byte[] toSign = Encoding.Unicode.GetBytes(message);
return rsa.SignData(toSign, "SHA1");
}
static bool Verify(string message, byte[] signature, RSAParameters key)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(key);
byte[] toVerify = Encoding.Unicode.GetBytes(message);
return rsa.VerifyData(toVerify, "SHA1", signature);
}
static void Main(string[] args)
{
string message = "Let's sign this message.";
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); // Creates a new RANDOM key.
RSAParameters privatekey = rsa.ExportParameters(true);
RSAParameters publickey = rsa.ExportParameters(false);
byte[] signature = Sign(message, privatekey);
if (Verify(message, signature, publickey))
{
Console.WriteLine("It worked!");
}
}
}
Важно отметить, что новая пара открытых / закрытых ключей генерируется при каждом запуске этой программы. Чтобы сделать то, что вы хотите, вам нужно сохранить пару открытых / закрытых ключей, прежде чем использовать их на обоих концах. Ваш открытый ключ - это единственное, что вам нужно проверить, поэтому ваш закрытый ключ не будет опубликован для клиента.
Возможно, вы захотите взглянуть на ExportParameters или ExportCspBlob, чтобы выполнить сохранение / загрузку пары открытых / закрытых ключей.