шифрование и сертификаты

  • Автор темы sadgb
  • Дата начала
S

sadgb

#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 вот этих приложения и больше не надо было ничего настраивать в сервере и в хр это возможно?
или всё таки надо настроить удостоверяющий центр
в любом случае хочеться чтобы не надо было руками добавлять сертификат а это делали сами программы(это возможно?)
пожалуйста ответьте на вопросы по тексту и по алгоритму и если не трудно помогите с реализацией. там примеры итд оч надо правдо.
заранее спасибо. буду ждать ответа
 
P

Pasha

#2
Для: sadgb
Код отправки/получения сообщений уже написан? Если нет, то просто используй Windows Communication Foundation, он умеет и сообщения по https передавать, и клиентов по сертификатам различать. Если да - то читай про makecert.exe (2) и классы из System.Security.Cryptography.X509Certificates (3).
 
S

sadgb

#3
ушёл читать про WCF.
СОобщения и передачу вобще не писал ещё тк не понял работу с сертификатами.
уточни что ты имел в виду говоря код отправки ?
я смотрел этот класс возникли сложности. можно простенькое что нибудь нарисовать?
например в а храниться открытый ключ в b закрытый
как вот например получить сертификат и как запросить открытый ключ по имени у бюросертификатов. опять же остаёться вопрос о том како й софт настроить надо кроме програмсмы чтобы всё работало
 
P

Pasha

#4
Для: sadgb
Под кодом отправки подразумевались сообщения и их передача.
Почитай про WCF внимательнее, там все особенности реализации скрыты. Т.е. для тебя передача соощения будет выглядеть как простой вызов метода. Обмен сертификатами - часть протокола. Если очень хочется знать детали реализации - почитай http://en.wikipedia.org/wiki/Transport_Layer_Security.
Почитай Securing Services and Clients, там подробно описана вся работа с сертификатами (генерация, импорт/экспорт, конфигурирование клиента и сервера).
 
S

sadgb

#5
те как я понимаю вызываю функцию передачи а она внутир себя всё сделает ? и реализует шифование rsa? :wacko:
хм...
а как я смогу продемонстрировать что она ДЕЙСЧТВИТЕЛЬНО работает с сертификатами ?
просто надо продимонстрировать работу полученную..
ps почему я не могу тебе репутацию поднять? сообщений мало ?
 
P

Pasha

#6
Для: sadgb
Так тебе надо чтобы работало или продемонстрировать? Если продемонстрировать, то реализуешь ручками установление SSL соединения, хотя бы по картинке и описанию протокола из wiki. Работа с шифрованием под .net неплохо расписана в MSDN, Cryptographic Services, работа с сертификатами - про ссылке в прошлом сообщении. Осталось только смешать и хорошенько взболтать :wacko: А если надо чтобы просто работало - используешь wcf и не думаешь о деталях реализации.
 
S

sadgb

#7
да у меня вот микс .
ваще я думаю меня препод не примёт с wcf... и заставит переделывать.
всё таки надо реализовать более открытую модель с использованием .net framework
паш спасиб уже очень помог.
теперь если можно объедини всё в 1 пост чтоб я понял до конца с источниками и ссылками. потому как пока я представляю только как написать на 1 компе 1 прогу которая шифрует и расгифровывает а вот с распределённым приложенирем да ещё и сертификатами .. ужс. мб пример надыбаешь?
я буду очень благодарен )
 
P

Pasha

#8
Для: sadgb
Нет, я ленивый :D
походи по ссылкам, там полно примеров.
 
S

sadgb

#9
эх... попытался я сделать.. упёрся опять в эти говносертификаты. не могу без примера. а где взять хз ваще
 
S

sadgb

#11
я не могу понять алгоритма и последовательности действий работы с сертификатами в случае с локальной сетью как у меня.
проблема по прежнему в шагах 2 и 3
и вот ещё такой вопрос прогу то я хочу чтоб та которая в сервере сама создавала новую пару сама мутила с сертификатами
и вторая прога тож всё сама делала , но я бы потом мог зайти в хп и показать что вот типа тут мы видим этот сертификат...
это реализуемо ?
или надо настраивать какой то удостоверяющий сервер ? или всё таки моно бз него ?
 
S

sadgb

#12
что же мне теперь делать. я плачу )оо боже куда делся мегагуру паша!!!
что же мне сегодня делать :)
 
P

Pasha

#13
Для: sadgb
:) Ты не до конца вчитался в систему с сертификатами. Весь их смысл в том, что они раздаются централизованно. Т.е. пользоваетели 1 и 2 получают сертификаты от кого-то, кому они могут доверять. Никаких " П2 как то делает сертификат со своим открытым ключом" быть не может, потому что тогда ему не будет доверять П1. А сама процедура установления соединения подробно описана в вики.
 
S

sadgb

#14
аааа вот оно что .
так значит всё таки нужноо как то настроить этот удостоверяющий сервер. такс это важно. пошёл делать этот удост сервер
 
S

sadgb

#15
так вот такое дело :
запустил я на windows server 2003 certification authority
дальше как я понимаю надо в хп и в самом сервере сделать его доверенным но как -0 не могу найти и не понимаю. подскажите плиз
 
P

Pasha

#16
Для: sadgb
Не надо настраивать удостоверяющий центр. Создаешь self-signed certificate, импортируешь его в "Trusted Root Certification Authorities", на сервере и на клиенте. Потом выдаешь от имени этого "Trusted Root" клиентский и серверный сертификаты. Тогда и клиент и сервер будут друг другу доверять. How To: Create Temporary Certificates for Use During Development
 
S

sadgb

#17
вот что я сотворил

C:\Program Files\Microsoft.NET\SDK\v1.1\Bin>makecert -n "CN=XPcert" -sk hranilcert -sr currentuser testcert.cer
Succeeded

сделал сертификат добавил его в XP добавил его в Server

дальше я так понимаю нуно работать с контейнерами и вот что я полчил
вот такая функция вытаскивает из контейнера то что нам нуно. прараметр - наш контейнер.
public static void GetKeyFromContainer(string ContainerName)
{
// Create the CspParameters object and set the key container
// name used to store the RSA key pair.
CspParameters cp = new CspParameters();
cp.KeyContainerName = ContainerName;

// Create a new instance of RSACryptoServiceProvider that accesses
// the key container MyKeyContainerName.
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);

// Display the key information to the console.
Console.WriteLine("Key retrieved from container : \n {0}", rsa.ToXmlString(true));
}

далее получил в хп
Key retrieved from container :
<RSAKeyValue><Modulus>zbXwdgYFwQ9soMG/FpbuRvNHkQqm2gQ5IVeFLXnIx3ETS1qh0WQvpBxpI
xAYHMG5AWYl2yR0PoIPH9rq6Ve90pSkO9PDxZrTkWRiI8K6pxFjImEPDyj8NjzJf7BvAz8sAln1/uMnp
1uXb6bKkwZZIEDQm2VN3qUqcKSswEiwJJ8=</Modulus><Exponent>AQAB</Exponent><P>600Ze6r
f7X0aQk3l5XoDRHIaY9azFUPn6gPNyObkVlgpXPfJeX8LyaZwFAF6c/WihOG1lHxluykl3kLa8fE7Bw=
=</P><Q>3855AXgE5R8B9Ph+FERHOaDeFHuSKikPHI2gSucmzX0sedIUHfwk8Jruqu/Dzo8WybhSvEvJ
WghqvsG7yMorqQ==</Q><DP>0Y0XPcB+rmT0hsoTDJvt3v3zLKjfUffoyMrccKfYAGGBbM8rua0AVXSJ
aferEyxVsRvF91gVzWmm1NsbW86m7w==</DP><DQ>c/Aj40znTEIZ42tu9NTCCOp64SV6fHi0qVf8t5C
zGzRC/ACGB1p9UF8SUF7QkoqxhWIFCiJAdnFxysvVmZiRsQ==</DQ><InverseQ>NsfguOvDElppQU+x
h4mQSDcNiLMaxu5k51aPThoXsxYWIcLZU2elHBwY6MgsTiy0EVkMoE0sX2yVn7Ml7SHFNw==</Invers
eQ><D>PQjviMUureKas3Po85XiqvCB2noTmXpJTSg/noeU2AAn3mLMwmj8ba/0Te/3h4i/ELgzITtGtk
k2nZgBvSxIaItzXfMTFr6xHbY9loDWx8z5qwWgBjSjSPkYV7lmVVcfN15QGKzwRd6Gv8taw3i7K7RQFw
GuzLFmAWqkLXguFrE=</D></RSAKeyValue>

в сервере
Key retrieved from container :
<RSAKeyValue><Modulus>ww8jhuyJ5e2KmsB5dWl9gL3Be/vIP5pxFpDuBcWdBEiErUt5HvzAUsRye
ic1YUB1PwEHPlYWCS4JmEh7YsuCLwdC8BRZpYjrH8jF8kslNndikCI/P99rBxatiXSgFAiVxFDUykElL
a2tQ1ESlNASeCWPZSTaiPlz8zn+Z+IxuSs=</Modulus><Exponent>AQAB</Exponent><P>4OJgFaZ
vj9TTOmFteHR0uvaeNGURw5i1oeVUHk/jMaVTavhOdDVymm+V73UstnMbzPXQj6tWOxKADwqRrc8YJw=
=</P><Q>3gxTxlwndYf+AYvCXHt6CMXZzi11UyhExg8xPRug+vHKZ3ON6SyJT2TAXxkB4i52CwhX2t4e
CNeE1HN3aydVXQ==</Q><DP>z3oLi+3yH5ELEGGyzd8jkxrU+yIEMaFCcgtSgGTUB4mwXJCaUTy+bx1k
B3jjt7CbhY2EzggVloqK+1WU8faPIQ==</DP><DQ>2rNfi/7WKo+wIYuq+nXvg1aDqOvjI+2El2L9R0f
ALYoapfwNaP0hnN4KD2BNF55VS5aDGaIuCN1lCe9UTmjmTQ==</DQ><InverseQ>SEZ96MdkPgp9A8zU
39Fu2Z1Qej44cHUFNTwpd88kB+ZGSsLDhT+eUIitN8Tzmj6N2Eb+jY472oQeJL8vHQTvzA==</Invers
eQ><D>Zd1VD1Qd266GkLRteYyClyYBki7174lG/6LmOqttiVwZtapRcYZLJa4jnnk1XjlcQW/XCY3Jaj
fZmOZZUUm4DM/V9bDyfcjkG09gr4Ut4+kEl1qLR+C7NW5VfrdvBKW9wdMIFxu3xxhhA70pyXuwgQUHEP
C4ARmhE4+m8Fkklyk=</D></RSAKeyValue>
очевидно что они разые. то есть как я понимаю он не находит контейнеры и нафиг создаёт новые ключи и записывает их в контейнер.

итак вопросы мои
1 как таки получить пару созданную в сертификате. какая команда или у меня ваще всё не правильно?
доп инфа в серевре пользователь administrator в хп пользователь с именем 1
просьба вот таки помочь исправить ошибки...
возможно я неправильно создаю сертификат - я почти уверен но и наверно неправильно понимаю алгоритм получений ключей из сертификата. ваще я не уверен что закрытый можно получить... короче вот тут помогите
надо чтоб хотя б открытый моно было получить из сертификата а то чё то ваще никак
 
S

sadgb

#18
кстати паш я те репутацию поднял. так что давай чуток осталось это последнее узкое место дальше я всё смогу
 
P

Pasha

#19
Для: sadgb
RSACryptoServiceProvider к сертификатам не имеет отношения. Создавай X509Store для СurrentUser и ищи в нем свой сертификат.
 
S

sadgb

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

}

ПОМОГИТЕ Пожалуйста )