Prueba esto:
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!");
}
}
}
Es importante tener en cuenta que un nuevo par de claves pública/privada se genera cada vez que se inicia este programa. Para hacer lo que desea, querrá guardar el par de llaves público/privado antes de usarlo en ambos extremos. Su clave pública es lo único que necesita verificar, por lo que su clave privada no se publicará en el cliente.
Es posible que desee consultar ExportParameters o ExportCspBlob para lograr guardar/cargar el par de llaves público/privado.
No quiero firmar un ensamblaje. Quiero generar un valor en un archivo para evitar alterar los valores en ese archivo. – Riri