![]() |
Модераторы: gambit |
![]() ![]() ![]() |
|
sadgb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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 вот этих приложения и больше не надо было ничего настраивать в сервере и в хр это возможно? или всё таки надо настроить удостоверяющий центр в любом случае хочеться чтобы не надо было руками добавлять сертификат а это делали сами программы(это возможно?) пожалуйста ответьте на вопросы по тексту и по алгоритму и если не трудно помогите с реализацией. там примеры итд оч надо правдо. заранее спасибо. буду ждать ответа |
|||
|
||||
Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 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 |
|||
|
||||
sadgb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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); и так далеее ![]() даже если допустить что это работает... не решает моей проблемы тк там работа на 1 компе а мне надо межсетевую с передачей...\так что просьба уточнить пожалуйста |
|||
|
||||
Experimenter |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 430 Регистрация: 8.5.2007 Где: Уфа Репутация: 1 Всего: 17 |
RSA-провайдер используется в основном не для шифрования сообщений, а для электронно-цифровой подписи ввиду ограниченности применения по размеру исходного сообщения (точно не помню, но счет идет на десятки байт).
Соответственно, если использовать открытый канал, там применяются другие провайдеры (симметричные, DES к примеру). Либо, если применять цифровые сертификаты, тогда используют закрытый канал по технологии SSL. Если все же условия по размеру тебя не пугают:
по шифрованию вот статейка. по созданию, импорту сертификатов здесь.
И так далее... Коротко не расскажешь, матчасть поизучай сначала. -------------------- 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"); } |
||||
|
|||||
sadgb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 21.10.2007 Репутация: нет Всего: 1 |
да тут вы в точку попали с си шарпом никак . есть начальные знания явы там так тоже низя ) щас я это сразу вспомнил.
ссылку посмотрел спаибою жаль что бейсик. но вот помоги мне ещё с самими сертификатами в конкретно моём случае что я должен сделать? если можно поподробней а то я стоко уже всего читал а так и не понял... |
|||
|
||||
Experimenter |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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"); } |
|||
|
||||
sadgb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 21.10.2007 Репутация: нет Всего: 1 |
||||
|
||||
Experimenter |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 430 Регистрация: 8.5.2007 Где: Уфа Репутация: 1 Всего: 17 |
-------------------- 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"); } |
|||
|
||||
sadgb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 21.10.2007 Репутация: нет Всего: 1 |
ТАК ЭКС . ты мне уже оч помог. наконец то я довпёр то той вещи которуя я видимо и не мог понять
значит сначала я создаю сертификат на сервере и потом уже моя прога делает запрос. дальше как я понимаю по запросу прога из хп получит открытый ключ проги из сервера и надо будет тока зашифровать и отослать. я прав ? |
|||
|
||||
Experimenter |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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"); } |
|||
|
||||
sadgb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 21.10.2007 Репутация: нет Всего: 1 |
ушёл смареть вторую ссылку.хотя вроде там был..
|
|||
|
||||
sadgb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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; } } ПОМОГИТЕ Пожалуйста ) |
|||
|
||||
Experimenter |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 430 Регистрация: 8.5.2007 Где: Уфа Репутация: 1 Всего: 17 |
Я делал так
но если все же надо, то строка
Парсер 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"); } |
||||
|
|||||
sadgb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 21.10.2007 Репутация: нет Всего: 1 |
немного запоздалая благодарность - спасибо))
|
|||
|
||||
sadgb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 21.10.2007 Репутация: нет Всего: 1 |
немного запоздалая благодарность - спасибо))
|
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |