使用.NET中的私钥对文件进行签名

时间:2009-04-06 08:55:41

标签: .net encryption

如何使用.NET对文件进行签名,如何在阅读后验证生成的密钥是否有效?

我的目标是让文本文件包含一些值和生成的密钥。然后,我希望能够检查文件中生成的密钥,以便在我将文件发送给客户后,没有人篡改文件中的值。

更新: 在答案的帮助下找到它here

3 个答案:

答案 0 :(得分:6)

试试这个:

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以完成保存/加载公钥/私钥对。

答案 1 :(得分:3)

如果你想签署一个集会,jaloplo给出了解决方案。

如果要签署程序创建的某些文件,请查看System.Security.Cryptography命名空间中的DSACryptoServiceProvider class

答案 2 :(得分:-2)

您有两种可能性:

  • 一旦在Sign选项上的项目属性上。
  • 第二个是修改AssemblyInfo.cs文件并添加命令以使用生成的sn:[assembly: AssemblyKeyFile("..\\..\\SN_Generated.snk")]