распределённое приложение шифрование сертификаты

 
0
 
.NET
ava
sadgb | 22.10.2007, 00:51
Здравствуйте )
Вот уже 4 дня не могу разобраться с задачей а она такая
есть windows xp и есть windows server 2003 на них запущенно распределённое приложение
задача передать сообщение от xp к server 2003 по открытому каналу соответственно надо использовать шифрование с открытым ключом и цифровые сертификаты.(и то и другое испольовать обязательно).
я посидел почитал гугл почитал мсдн но результатов совсем и совсем не густо.
посмотрел как используется rsa шифрование вроде немного разобрался с этим
вот какой алгоритм я набросал (мне кажеться он такой помогите исправить если не верен)
пусть П1 - программа в xp а П2 программа в server 2003
1. П2 регистрирует RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); и тут у нас уже будет 2 ключа. я прав ?
2. П2 как то делает сертификат со своим открытым ключом
3. П1 получает открытый ключ программы2 (как ?) и проверяет по базе сертификатов (как?)
4. П1 шифрует открытым ключом программы2 и пересылает программе2
5. П2 расшифровывает

собственно если в целом принять эту последовательность правильной (а так ли это я надеюсь вы мне сейчас скажете)
помогите с шагами 2 и 3 . у меня что то вообще нету никаких идей дайте пример там на си++ или шарпе
и кстати хотелось бы чтобы было 2 вот этих приложения и больше не надо было ничего настраивать в сервере и в хр это возможно?
или всё таки надо настроить удостоверяющий центр
в любом случае хочеться чтобы не надо было руками добавлять сертификат а это делали сами программы(это возможно?)
пожалуйста ответьте на вопросы по тексту и по алгоритму и если не трудно помогите с реализацией. там примеры итд оч надо правдо.
заранее спасибо. буду ждать ответа
Comments (14)
ava
Baa | 22.10.2007, 10:34 #
ммм, мне вот гугл выдал с первого запроса:
http://www.codeproject.com/useritems/Data_...n_Decryptio.asp
ava
sadgb | 22.10.2007, 14:27 #
мм .. во первых не компилиться
начсинает с первой же строчки
string DigitalCertificateName = "blablabla";
пишет
\Error 1 A namespace does not directly contain members such as fields or methods C:\Users\Егорка\Documents\Visual Studio 2005\Projects\ConsoleApplication5\ConsoleApplication5\Program.cs 10 1 ConsoleApplication5
ну и далее
Error 2 Expected class, delegate, enum, interface, or struct C:\Users\Егорка\Documents\Visual Studio 2005\Projects\ConsoleApplication5\ConsoleApplication5\Program.cs 20 15 ConsoleApplication5

X509Store store = new X509Store(StoreName.My);
и так далеее smile .
даже если допустить что это работает... не решает моей проблемы тк там работа на 1 компе а мне надо межсетевую с передачей...\так что просьба уточнить пожалуйста
ava
Experimenter | 22.10.2007, 19:01 #
RSA-провайдер используется в основном не для шифрования сообщений, а для электронно-цифровой подписи ввиду ограниченности применения по размеру исходного сообщения (точно не помню, но счет идет на десятки байт).
Соответственно, если использовать открытый канал, там применяются другие провайдеры (симметричные, DES к примеру).
Либо, если применять цифровые сертификаты, тогда используют закрытый канал по технологии SSL.
Если все же условия по размеру тебя не пугают:
Цитата


2. П2 как то делает сертификат со своим открытым ключом

как-то сертификат программа не делает, его создать надо ручками.
по шифрованию вот статейка.
по созданию, импорту сертификатов здесь.
Цитата


начсинает с первой же строчки

string DigitalCertificateName = "blablabla";

переменная объявлена вне класса.
И так далее... Коротко не расскажешь, матчасть поизучай сначала.
ava
sadgb | 22.10.2007, 19:17 #
да тут вы в точку попали с си шарпом никак . есть начальные знания явы там так тоже низя ) щас я это сразу вспомнил.
ссылку посмотрел спаибою жаль что бейсик. но вот помоги мне ещё с самими сертификатами в конкретно моём случае что я должен сделать? если можно поподробней а то я стоко уже всего читал а так и не понял...
ava
Experimenter | 22.10.2007, 19:49 #
1. создать сертификат на сервере
2. создать на клиенте запрос на клиентский сертификат
3. создать на сервере клиентский сертификат и передать клиенту
в этой части OpenSSL тебе поможет

4. на клиенте установить полученный сертификат в хранилище
это уже вручную

5. юзать ключи как в том примере, который ты нашел
с Х509 сертификатами по сети работают классы System.Net.HttpWebRequest, System.Net.Security.SslStream
ava
sadgb | 23.10.2007, 11:33 #
Цитата (Experimenter @ 22.10.2007, 19:49 findReferencedText)
1. создать сертификат на сервере2. создать на клиенте запрос на клиентский сертификат3. создать на сервере клиентский сертификат и передать клиенту

это должны сделать сами мои программы как я понимаю ?
ava
Experimenter | 23.10.2007, 16:56 #
Цитата


это должны сделать сами мои программы как я понимаю ?

Это должны сделать OpenSSL или Makecert.exe, дотнет этого делать не умеет. Он может добавлять-удалять-импортировать-экспортировать сертификаты, НО НЕ СОЗДАВАТЬ с нуля. Хотя, если знать технологию их создания, то наверное возможно.
ava
sadgb | 23.10.2007, 21:09 #
ТАК ЭКС . ты мне уже оч помог. наконец то я довпёр то той вещи которуя я видимо и не мог понять
значит сначала я создаю сертификат на сервере и потом уже
моя прога делает запрос.
дальше как я понимаю по запросу прога из хп получит открытый ключ проги из сервера и надо будет тока зашифровать и отослать. я прав ?
ava
Experimenter | 24.10.2007, 06:03 #
sadgb, зайди по второй ссылке, что я тебе дал, похоже, что ты там не был.
Запрос на сертификат - это не запрос в обычном понимании (от клиента к серверу), а специально созданный файл, на основе которого сервером генерится клиентский сертик. Взаимодействие между клиентом и сервером на программном уровне начинается только, когда сертификаты будут установлены на обеих конечных точках (вручную).
ava
sadgb | 24.10.2007, 17:42 #
ушёл смареть вторую ссылку.хотя вроде там был..
ava
sadgb | 26.10.2007, 23:55 #
итак вот значит что получилось

в общем создал хранилище добавил туда сертификаты которые хотел
public static void Main(string[] args)
{
//есть у меня teststore где мои сертификаты
X509Store store = new X509Store("teststore", StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadWrite);
X509Certificate2 certificate1 = new X509Certificate2();
//далее я выбираю нужный мне сертификат из хранилища
certificate1 = null;
foreach (X509Certificate2 c in storecollection3)
{
if (c.Subject == "CN=XPcert1")
{
certificate1 = c;

break;
}
}
// далее тупо вывод на экран всех параметров сертификата

Console.WriteLine("{0}Subject: {1}{0}", Environment.NewLine, certificate1.Subject);
Console.WriteLine("{0}Issuer: {1}{0}", Environment.NewLine, certificate1.Issuer);
Console.WriteLine("{0}Version: {1}{0}", Environment.NewLine, certificate1.Version);
Console.WriteLine("{0}Valid Date: {1}{0}", Environment.NewLine, certificate1.NotBefore);
Console.WriteLine("{0}Expiry Date: {1}{0}", Environment.NewLine, certificate1.NotAfter);
Console.WriteLine("{0}Thumbprint: {1}{0}", Environment.NewLine, certificate1.Thumbprint);
Console.WriteLine("{0}Serial Number: {1}{0}", Environment.NewLine, certificate1.SerialNumber);
Console.WriteLine("{0}Friendly Name: {1}{0}", Environment.NewLine, certificate1.PublicKey.Oid.FriendlyName);
Console.WriteLine("{0}Public Key Format: {1}{0}", Environment.NewLine, certificate1.PublicKey.EncodedKeyValue.Format(true));
Console.WriteLine("{0}Raw Data Length: {1}{0}", Environment.NewLine, certificate1.RawData.Length);
Console.WriteLine("{0}Certificate to string: {1}{0}", Environment.NewLine, certificate1.ToString(true));
Console.WriteLine("{0}Certificate to XML String: {1}{0}", Environment.NewLine, certificate1.PublicKey.Key.ToXmlString(false));
//и закрываю хранилище
store.Close();


А вот тут начинаеться самое интересно теперь когда сертификат доступен мне надо зашифровать используя этот самый открытый ключ. ну вот что есть у меня для шифрования

RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
RSAParameters RSAKeyInfo = new RSAParameters();
RSAKeyInfo.Modulus = ?????????????????????? ; //!!!!!!!!!!!!!!!!!!!
RSAKeyInfo.Exponent = ?????????????????????? ; //!!!!!!!!!!!!!!!!!!!

ну и дальше там вызов функции шифрования спараметрами который работает я там внутри импортирую эти значения.
Вопрос как мне вписать эти хреновы значения модуля и экспоненты . а то уже всё сделал даже пересылку последний момент остался. пожалуйста вот прям 2 строчки напиши чтоб работало )


ps функция которой шифрую


static public byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
{
try
{
//Create a new instance of RSACryptoServiceProvider.
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

//Import the RSA Key information. This only needs
//toinclude the public key information.
RSA.ImportParameters(RSAKeyInfo);

//Encrypt the passed byte array and specify OAEP padding.
//OAEP padding is only available on Microsoft Windows XP or
//later.
return RSA.Encrypt(DataToEncrypt,false);
}
//Catch and display a CryptographicException
//to the console.
catch (CryptographicException e)
{
Console.WriteLine(e.Message);

return null;
}

}

ПОМОГИТЕ Пожалуйста )
ava
Experimenter | 29.10.2007, 12:11 #
Я делал так

X509Store xs = new X509Store(StoreName.My, StoreLocation.CurrentUser);
xs.Open(OpenFlags.ReadOnly);
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
foreach (X509Certificate2 cert in xs.Certificates)
if (cert.Subject.Contains("MySubject"))
rsa.FromXmlString(cert.PrivateKey.ToXmlString(false)); //true - добавить приватный ключ, false - не добавлять
xs.Close();
byte[] encryptedData = RSAEncrypt (bteDataToEncrypt, rsa.ExportParameters(false), 0, bteDataToEncrypt.Length);
и не ломал голову над модулюсами и экспонентами
но если все же надо, то строка

string xmlCertData = cert.PrivateKey.ToXmlString(true);
создаст XML со всеми значениями, которые только доступны в сертификате (модулюс и экспонента там же).
Парсер XML тебе поможет. Я из лени предпочел обойтись без него.
Советую еще использовать Base64Encoding (байты заворачивать) для корректной передачи данных по сети.
ava
sadgb | 14.06.2008, 23:06 #
немного запоздалая благодарность - спасибо))
ava
sadgb | 14.06.2008, 23:06 #
немного запоздалая благодарность - спасибо))
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit