Итак, у меня есть сервер и клиенты.И у меня есть задача / проблема с безопасностью.Диалог между сервером и клиентом: Клиент: Дайте мне файл конфигурации, Сервер!Сервер: отправка файла конфигурации с цифровой подписью. Клиент: получение данных
Итак, какой подход выбрать?
- Создание закрытых и открытых ключей (на стороне сервера).
- Сохранить закрытый ключ в xml-файле (TIP1)
- Клиенты будут распространяться с открытым ключом (сгенерированным вместе с закрытым ключом)
чем,когда клиенты отправят запрос на сервер: 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();
}
}
Что выдумаете?