Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> распределённое приложение шифрование сертификаты 
:(
    Опции темы
sadgb
Дата 21.10.2007, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 21.10.2007

Репутация: нет
Всего: 1



Здравствуйте )
Вот уже 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 вот этих приложения и больше не надо было ничего настраивать в сервере и в хр это возможно?
или всё таки надо настроить удостоверяющий центр
в любом случае хочеться чтобы не надо было руками добавлять сертификат а это делали сами программы(это возможно?)
пожалуйста ответьте на вопросы по тексту и по алгоритму и если не трудно помогите с реализацией. там примеры итд оч надо правдо.
заранее спасибо. буду ждать ответа
PM MAIL   Вверх
Baa
Дата 22.10.2007, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: нет
Всего: 12



ммм, мне вот гугл выдал с первого запроса:
http://www.codeproject.com/useritems/Data_...n_Decryptio.asp


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
sadgb
Дата 22.10.2007, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 21.10.2007

Репутация: нет
Всего: 1



мм .. во первых не компилиться
начсинает с первой же строчки 
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 компе а мне надо межсетевую с передачей...\так что просьба уточнить пожалуйста
PM MAIL   Вверх
Experimenter
Дата 22.10.2007, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 1
Всего: 17



RSA-провайдер используется в основном не для шифрования сообщений, а для электронно-цифровой подписи ввиду ограниченности применения по размеру исходного сообщения (точно не помню, но счет идет на десятки байт).
Соответственно, если использовать открытый канал, там применяются другие провайдеры (симметричные, DES к примеру).
Либо, если применять цифровые сертификаты, тогда используют закрытый канал по технологии SSL.
Если все же условия по размеру тебя не пугают:
Цитата

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

начсинает с первой же строчки 
string DigitalCertificateName = "blablabla";
переменная объявлена вне класса.
И так далее... Коротко не расскажешь, матчасть поизучай сначала.


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
sadgb
Дата 22.10.2007, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 21.10.2007

Репутация: нет
Всего: 1



да тут вы в точку попали с си шарпом никак . есть начальные знания явы там так тоже низя ) щас я это сразу вспомнил.
ссылку посмотрел спаибою жаль что бейсик. но вот помоги мне ещё с самими сертификатами в конкретно моём случае что я должен сделать? если можно поподробней а то я стоко уже всего читал а так и не понял...
PM MAIL   Вверх
Experimenter
Дата 22.10.2007, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 1
Всего: 17



1. создать сертификат на сервере
2. создать на клиенте запрос на клиентский сертификат
3. создать на сервере клиентский сертификат и передать клиенту
в этой части OpenSSL тебе поможет

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

5. юзать ключи как в том примере, который ты нашел
с Х509 сертификатами по сети работают классы System.Net.HttpWebRequest, System.Net.Security.SslStream


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
sadgb
Дата 23.10.2007, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 21.10.2007

Репутация: нет
Всего: 1



Цитата(Experimenter @  22.10.2007,  19:49 Найти цитируемый пост)
1. создать сертификат на сервере2. создать на клиенте запрос на клиентский сертификат3. создать на сервере клиентский сертификат и передать клиенту

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

PM MAIL   Вверх
Experimenter
Дата 23.10.2007, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 1
Всего: 17



Цитата

это должны сделать сами мои программы как я понимаю ?
Это должны сделать OpenSSL или Makecert.exe, дотнет этого делать не умеет. Он может добавлять-удалять-импортировать-экспортировать сертификаты, НО НЕ СОЗДАВАТЬ с нуля. Хотя, если знать технологию их создания, то наверное возможно.


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
sadgb
Дата 23.10.2007, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 21.10.2007

Репутация: нет
Всего: 1



ТАК ЭКС . ты мне уже оч помог. наконец то я довпёр то той вещи которуя я видимо и не мог понять
значит сначала я создаю сертификат на сервере и потом уже 
моя прога делает запрос.
дальше как я понимаю по запросу прога из хп получит открытый ключ проги из сервера и надо будет тока зашифровать и отослать. я прав ?
PM MAIL   Вверх
Experimenter
Дата 24.10.2007, 06:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 1
Всего: 17



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


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
sadgb
Дата 24.10.2007, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 21.10.2007

Репутация: нет
Всего: 1



ушёл смареть вторую ссылку.хотя вроде там был..
PM MAIL   Вверх
sadgb
Дата 26.10.2007, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 21.10.2007

Репутация: нет
Всего: 1



итак вот значит что получилось 

в общем создал хранилище добавил туда сертификаты которые хотел 
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;
}

}

ПОМОГИТЕ Пожалуйста )
PM MAIL   Вверх
Experimenter
Дата 29.10.2007, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 1
Всего: 17



Я делал так
Код

                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 (байты заворачивать) для корректной передачи данных по сети.

Это сообщение отредактировал(а) Experimenter - 29.10.2007, 12:13


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
sadgb
Дата 14.6.2008, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 21.10.2007

Репутация: нет
Всего: 1



немного запоздалая благодарность -  спасибо)) 

PM MAIL   Вверх
sadgb
Дата 14.6.2008, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 21.10.2007

Репутация: нет
Всего: 1



немного запоздалая благодарность -  спасибо)) 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0839 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.