Подписать файл с помощью закрытого ключа в .NET - PullRequest
6 голосов
/ 06 апреля 2009

Как мне подписать файл с помощью .NET и как я могу проверить, что сгенерированный ключ является действительным после того, как я его прочитал?

Моя цель - получить текстовый файл с некоторыми значениями и сгенерированным ключом. Затем я хочу иметь возможность проверить этот сгенерированный ключ в файле, чтобы никто не вмешивался в значения в файле, как только я отправил файл клиенту.

Обновление: Нашел здесь с некоторой помощью из ответов.

Ответы [ 3 ]

6 голосов
/ 06 апреля 2009

Попробуйте это:

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, чтобы выполнить сохранение / загрузку пары открытых / закрытых ключей.

3 голосов
/ 06 апреля 2009

Если вы хотите подписать сборку, jaloplo дал решение.

Если вы хотите подписать некоторые файлы, созданные вашей программой, взгляните на класс DSACryptoServiceProvider в пространстве имен System.Security.Cryptography.

0 голосов
/ 06 апреля 2009

У вас есть две возможности:

  • Один раз в свойствах проекта в опции Подписать.
  • Второй - изменить файл AssemblyInfo.cs и добавить команды для использования сгенерированного sn: [assembly: AssemblyKeyFile("..\\..\\SN_Generated.snk")]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...