Цифровая подпись в C # - PullRequest
0 голосов
/ 25 июля 2011

Итак, у меня есть сервер и клиенты.И у меня есть задача / проблема с безопасностью.Диалог между сервером и клиентом: Клиент: Дайте мне файл конфигурации, Сервер!Сервер: отправка файла конфигурации с цифровой подписью. Клиент: получение данных

Итак, какой подход выбрать?

  1. Создание закрытых и открытых ключей (на стороне сервера).
  2. Сохранить закрытый ключ в xml-файле (TIP1)
  3. Клиенты будут распространяться с открытым ключом (сгенерированным вместе с закрытым ключом)

чем,когда клиенты отправят запрос на сервер: 1. Сервер получит закрытый ключ из xml-файла (TIP1) и отправит файл конфигурации + цифровую подпись (зашифрованный с помощью закрытого ключа) 2. Клиент получит ответ от сервера и проверит цифровую подпись открытым ключом

Как я могу реализовать эту идею в C #?Ключи (частные и публичные) я буду генерировать по специальной программе.Поэтому закрытый ключ я сохраню в xml-файле.

ДОПОЛНИТЕЛЬНО

Я написал какой-то класс, который, возможно, выполняет ту работу, которую я хочу:

public class Cryptography
{
    private const string CONTAINER_NAME = "MyContainer";

    private static RSACryptoServiceProvider rsa;
    private static MD5 md5;

    private static void AssignParameter()
    {           
        CspParameters cspParams;
        cspParams = new CspParameters();
        cspParams.KeyContainerName = CONTAINER_NAME;
        cspParams.Flags = CspProviderFlags.UseMachineKeyStore;

        rsa = new RSACryptoServiceProvider(cspParams);
    }

    static Cryptography()
    {
        md5 = MD5.Create();
    }

    public static byte[] CreateSignature(byte[] data, string pathToKey)
    {
        AssignParameter();

        StreamReader reader = new StreamReader(pathToKey);
        string privateKeyXML = reader.ReadToEnd();
        rsa.FromXmlString(privateKeyXML);
        reader.Close();

        RSAPKCS1SignatureFormatter RSAform = new RSAPKCS1SignatureFormatter(rsa);
        RSAform.SetHashAlgorithm("MD5");

        byte[] hashData = md5.ComputeHash(data);

        return RSAform.CreateSignature(hashData);
    }

    public static bool VerifySignature(byte[] originalData, byte[] data, string pathToKey)
    {
        StreamReader reader = new StreamReader(pathToKey);
        string publicKeyXML = reader.ReadToEnd();
        rsa.FromXmlString(publicKeyXML);
        reader.Close();

        RSAPKCS1SignatureDeformatter RSAdeform = new RSAPKCS1SignatureDeformatter(rsa);
        RSAdeform.SetHashAlgorithm("MD5");

        byte[] hashOriginalData = md5.ComputeHash(originalData);

        return RSAdeform.VerifySignature(hashOriginalData, data);
    }

    public static void AssignNewKey()
    {
        AssignParameter();

        StreamWriter writer = new StreamWriter(@"D:\cryptography\privatekey.xml");
        string privatePrivateKeyXML = rsa.ToXmlString(true);
        writer.Write(privatePrivateKeyXML);
        writer.Close();

        writer = new StreamWriter(@"D:\cryptography\publickey.xml");
        string publicOnlyKeyXML = rsa.ToXmlString(false);
        writer.Write(publicOnlyKeyXML);
        writer.Close();

    }

}

Что выдумаете?

1 Ответ

0 голосов
/ 25 июля 2011

Вместо того, чтобы заново изобретать колесо, вы можете просто использовать WCF Transport или Message Security и покончить с этим - если, конечно, вы не можете использовать WCF по любой причине.

...