Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

3 Страницы<123>
Опции
К последнему сообщению К первому непрочитанному
Offline Ruslan  
#11 Оставлено : 31 октября 2008 г. 15:36:43(UTC)
Ruslan

Статус: Активный участник

Группы: Участники
Зарегистрирован: 16.10.2008(UTC)
Сообщений: 33

Вот, сделал консольное приложение для проверки...

Цитата:



string sertName="Имя Сертификата";

//Извлекаем нужный нам сертификат
X509Store storeMy = new X509Store(StoreName.My, StoreLocation.CurrentUser);
storeMy.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
X509CertificateCollection foundCertColl = storeMy.Certificates.Find(X509FindType.FindBySubjectName, sertName, false);
if (foundCertColl.Count == 0) { Console.WriteLine("Не найдено сертификатов:\n" + sertName); }
else { Console.WriteLine("Найдено " + foundCertColl.Count.ToString() + " сертификатов:\n" + sertName); }

int i = 0;
//извлекаем сертификат
X509Certificate cert = storeMy.Certificates [i];
X509Certificate2 cert2 = new X509Certificate2(cert);

Gost3410CryptoServiceProvider KeyPublic = new Gost3410CryptoServiceProvider();
//достаём из сертификата открытый ключ
KeyPublic = (Gost3410CryptoServiceProvider)cert2.PublicKey.Key;
//экспортируем параметры и открытый ключ
Gost3410Parameters s = KeyPublic.ExportParameters(false);

Gost3410CryptoServiceProvider KeyPrivate = new Gost3410CryptoServiceProvider();
//достаём из сертификата закрытый ключ
KeyPrivate = (Gost3410CryptoServiceProvider)cert2.PrivateKey;
// Объект, реализующий алгоритм хэширования ГОСТ 3411.
Gost3411CryptoServiceProvider GostHash = new Gost3411CryptoServiceProvider();
// Cоздаём из подписываемого файла поток байтов.
Stream Data = File.Open(@"c:\MyDemo\проверка.docx",FileMode.Open,FileAccess.Read,FileShare.Read);
// Делаем ЭЦП для потока байтов, созданного из подписываемого файла
byte[] Sign = KeyPrivate.SignData(Data, GostHash);

//преобразуем массив в строку
string SignString = System.Convert.ToBase64String(Sign);
Console.WriteLine("Получаем ЭЦП с помощью закрытого ключа: " + SignString);

// а вот теперь мы используем полученные нами параметры открытого ключа, для проверки ЭЦП файла
Gost3410CryptoServiceProvider NewKeyPublic = new Gost3410CryptoServiceProvider();
//импортируем в криптопровайдер параметры и открытый ключ.
NewKeyPublic.ImportParameters (s);
if (NewKeyPublic.VerifyData(Data, GostHash, Sign))
{
Console.WriteLine("Верна");
}
else
{
Console.WriteLine("Не верна");
}



Выдаёт, что подпись "Не верна"! В чём проблема?? Что-то я в конец запутался!!! Аналогичные результаты если использую ExportCspBlob()/ImportCspBlob() и FromXmlString()/ToXmlString().

Отредактировано пользователем 31 октября 2008 г. 15:49:34(UTC)  | Причина: Не указана

Offline Челпанов А.  
#12 Оставлено : 31 октября 2008 г. 15:50:36(UTC)
Челпанов А.

Статус: Активный участник

Группы: Участники
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 390
Мужчина
Откуда: КриптоПро

Поблагодарили: 2 раз в 2 постах
Детская болезнь левизны в подписи...
Код:
Data.Seek(0, SeekOrigin.Begin);
перед проверкой, поможет :). Подписываете - файл, проверяете - то, что за пределами файла - ничего.

Отредактировано пользователем 31 октября 2008 г. 15:52:14(UTC)  | Причина: Не указана

С уважением, Александр.
Offline Ruslan  
#13 Оставлено : 31 октября 2008 г. 15:52:33(UTC)
Ruslan

Статус: Активный участник

Группы: Участники
Зарегистрирован: 16.10.2008(UTC)
Сообщений: 33

Хм... интересно.. говорит, что подпись не верна даже когда проверяю с помощью открытого ключа извлечённого непосредственно из сертификата.. А в моей программе такая проверка работает правильно. Brick wall Значит это не ошибка Sharpei...

Цитата:


Хм..

string sertName = @"Имя файла";

//Извлекаем нужный нам сертификат
X509Store storeMy = new X509Store(StoreName.My, StoreLocation.CurrentUser);
storeMy.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
X509CertificateCollection foundCertColl = storeMy.Certificates.Find(X509FindType.FindBySubjectName, sertName, false);
if (foundCertColl.Count == 0) { Console.WriteLine("Не найдено сертификатов, соответствующих пользователю:\n" + sertName); }
else { Console.WriteLine("Найдено " + foundCertColl.Count.ToString() + " сертификатов, соответствующих пользователю:\n" + sertName); }

int i = 0;
//извлекаем сертификат
X509Certificate cert = storeMy.Certificates [i];
X509Certificate2 cert2 = new X509Certificate2(cert);

Gost3410CryptoServiceProvider KeyPublic = new Gost3410CryptoServiceProvider();
//достаём из сертификата открытый ключ
KeyPublic = (Gost3410CryptoServiceProvider)cert2.PublicKey.Key;
//экспортируем параметры и открытый ключ
Gost3410Parameters s = KeyPublic.ExportParameters(false);

Gost3410CryptoServiceProvider KeyPrivate = new Gost3410CryptoServiceProvider();
//достаём из сертификата закрытый ключ
KeyPrivate = (Gost3410CryptoServiceProvider)cert2.PrivateKey;
// Объект, реализующий алгоритм хэширования ГОСТ 3411.
Gost3411CryptoServiceProvider GostHash = new Gost3411CryptoServiceProvider();
// Cоздаём из подписываемого файла поток байтов.
Stream Data = File.Open(@"c:\MyDemo\проверка.docx",FileMode.Open,FileAccess.Read,FileShare.Read);
// Делаем ЭЦП для потока байтов, созданного из подписываемого файла
byte[] Sign = KeyPrivate.SignData(Data, GostHash);

//преобразуем массив в строку
string SignString = System.Convert.ToBase64String(Sign);
Console.WriteLine("Получаем ЭЦП с помощью закрытого ключа: " + SignString);

// проверяем подпись сначала с помощью открытого ключа извлечённого непосредственно из сертификата вместе с закрытым ключём
if (KeyPublic.VerifyData(Data, GostHash, Sign))
{
Console.WriteLine("Верна");
}
else
{
Console.WriteLine("Не верна");
}

// а вот теперь мы используем полученные нами параметры открытого ключа, для проверки ЭЦП файла
Gost3410CryptoServiceProvider NewKeyPublic = new Gost3410CryptoServiceProvider();
//импортируем в криптопровайдер параметры и открытый ключ.
NewKeyPublic.ImportParameters (s);
if (NewKeyPublic.VerifyData(Data, GostHash, Sign))
{
Console.WriteLine("Верна");
}
else
{
Console.WriteLine("Не верна");
}

Отредактировано пользователем 31 октября 2008 г. 16:06:04(UTC)  | Причина: Не указана

Offline Ruslan  
#14 Оставлено : 31 октября 2008 г. 15:53:23(UTC)
Ruslan

Статус: Активный участник

Группы: Участники
Зарегистрирован: 16.10.2008(UTC)
Сообщений: 33

ок.. счас посмотрю..
Offline Ruslan  
#15 Оставлено : 31 октября 2008 г. 16:04:45(UTC)
Ruslan

Статус: Активный участник

Группы: Участники
Зарегистрирован: 16.10.2008(UTC)
Сообщений: 33

Цитата:

string sertName = @"Имя сертификата";

//Извлекаем нужный нам сертификат
X509Store storeMy = new X509Store(StoreName.My, StoreLocation.CurrentUser);
storeMy.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
X509CertificateCollection foundCertColl = storeMy.Certificates.Find(X509FindType.FindBySubjectName, sertName, false);
if (foundCertColl.Count == 0) { Console.WriteLine("Не найдено сертификатов, соответствующих пользователю:\n" + sertName); }
else { Console.WriteLine("Найдено " + foundCertColl.Count.ToString() + " сертификатов, соответствующих пользователю:\n" + sertName); }

int i = 0;
//извлекаем сертификат
X509Certificate cert = storeMy.Certificates [i];
X509Certificate2 cert2 = new X509Certificate2(cert);

Gost3410CryptoServiceProvider KeyPublic = new Gost3410CryptoServiceProvider();
//достаём из сертификата открытый ключ
KeyPublic = (Gost3410CryptoServiceProvider)cert2.PublicKey.Key;
//экспортируем параметры и открытый ключ
string s = KeyPublic.ToXmlString(false);

Gost3410CryptoServiceProvider KeyPrivate = new Gost3410CryptoServiceProvider();
//достаём из сертификата закрытый ключ
KeyPrivate = (Gost3410CryptoServiceProvider)cert2.PrivateKey;
// Объект, реализующий алгоритм хэширования ГОСТ 3411.
Gost3411CryptoServiceProvider GostHash = new Gost3411CryptoServiceProvider();
// Cоздаём из подписываемого файла поток байтов.
Stream Data = File.Open(@"c:\MyDemo\проверка.docx",FileMode.Open,FileAccess.Read,FileShare.Read);

// Делаем ЭЦП для потока байтов, созданного из подписываемого файла
byte[] Sign = KeyPrivate.SignData(Data, GostHash);

//преобразуем массив в строку
string SignString = System.Convert.ToBase64String(Sign);
Console.WriteLine("Получаем ЭЦП с помощью закрытого ключа: " + SignString);
Data.Seek(0, SeekOrigin.Begin);
// проверяем подпись сначала с помощью открытого ключа извлечённого из сертификата вместе с закрытым
if (KeyPublic.VerifyData(Data, GostHash, Sign))
{
Console.WriteLine("Верна");
}
else
{
Console.WriteLine("Не верна");
}

// а вот теперь мы используем полученные нами параметры открытого ключа, для проверки ЭЦП файла
Gost3410CryptoServiceProvider NewKeyPublic = new Gost3410CryptoServiceProvider();
//импортируем в криптопровайдер параметры и открытый ключ.
NewKeyPublic.FromXmlString (s);
Data.Seek(0, SeekOrigin.Begin);
if (NewKeyPublic.VerifyData(Data, GostHash, Sign))
{
Console.WriteLine("Верна");
}
else
{
Console.WriteLine("Не верна");
}



Моя ошибка из разряда сам дурак! :-)
Прогнал поток в методе, а указатель в начало потока перед проверкой не поставил. Всё работает, большое спасибо. Думаю можно использовать методы ExportCspBlob()/ImportCspBlob() и FromXmlString()/ToXmlString() для того что бы формировать объект класса Gost3410Parameters на проверяющей стороне. Очень просто передать открытый ключь и параметры в виде xml-ки или массива байтов преобразованного в строку. Большое спасибо за консультацию!! Applause А то уже вторую неделю с этой ЭЦП парюсь
Offline Челпанов А.  
#16 Оставлено : 31 октября 2008 г. 16:45:08(UTC)
Челпанов А.

Статус: Активный участник

Группы: Участники
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 390
Мужчина
Откуда: КриптоПро

Поблагодарили: 2 раз в 2 постах
Про "Думаю можно использовать методы ExportCspBlob()/ImportCspBlob() и FromXmlString()/ToXmlString() для того что бы формировать объект класса Gost3410Parameters на проверяющей стороне" не понял... Почему нельзя воспользоваться методом ExportParameters?
И еще, когда вы передаете сообщение с вложенным в него открытым ключом никто не мешает противнику изменить сообщение, переподписать сообщение на своем секретном ключе и вложить в это сообщение свой открытый ключ. Поэтому, я надеюсь, что Вы помните об этом и предприняли все необходимы шаги для защиты от подобных атаки.
С уважением, Александр.
Offline Ruslan  
#17 Оставлено : 31 октября 2008 г. 17:17:57(UTC)
Ruslan

Статус: Активный участник

Группы: Участники
Зарегистрирован: 16.10.2008(UTC)
Сообщений: 33

Спасибо за совет. Неприменно учту! :-)
Offline Ruslan  
#18 Оставлено : 1 ноября 2008 г. 15:37:24(UTC)
Ruslan

Статус: Активный участник

Группы: Участники
Зарегистрирован: 16.10.2008(UTC)
Сообщений: 33

Челпанов А. написал:
Про "Думаю можно использовать методы ExportCspBlob()/ImportCspBlob() и FromXmlString()/ToXmlString() для того что бы формировать объект класса Gost3410Parameters на проверяющей стороне" не понял... Почему нельзя воспользоваться методом ExportParameters?
И еще, когда вы передаете сообщение с вложенным в него открытым ключом никто не мешает противнику изменить сообщение, переподписать сообщение на своем секретном ключе и вложить в это сообщение свой открытый ключ. Поэтому, я надеюсь, что Вы помните об этом и предприняли все необходимы шаги для защиты от подобных атаки.


Я вам наверное уже жутко надоел. Но у меня возник ещё одн вопрос в связи с этим вашим коментарием.
Как я понял, для создания ЭЦП пользователь обращается в центр сертификации и получает от него 2 сертификата:
1) Сертификат сертификационнго центра. Который подтверждает, что второй сертификат выдан действительно сертификационным центром и что он действителен.
2) Сертификат который содерджит ОТКРЫТЫЙ и ЗАКРЫТЫЙ ключи.

Используя второй сертифика пользователь подписывает информацию и у него появляется ЭЦП, которую он может передать потребителю информации вместе с самой информацией и ОТКРЫТЫМ ключём для проверки ЭЦП.

Потребитель информации, что бы проверить ЭЦП должен получить ОТКРЫТЫЙ ключ из сертификата пользователя, который создал ЭЦП.
Причём наилучший способо передать ОТКРЫТЫЙ ключ, это передать его в виде public key certificate. Такой Public key certificate потребитель информации может проверить с помощью центра сертификаци, который его выдал и убедиться что у него в руках настоящий ОТКРЫТЫЙ ключ пользователя подписавшего информацию и спокойно проверить её.

Возникает вопрос! А откуда берётся Public key certificate с ОТКРЫТЫМ ключём, причём с таким же ОТКРЫТЫМ ключём как в сертификате пользователя подписавшего информацию? И как его получить программно?

:-)) Или я совсем перемудрил тут?
Offline Kure  
#19 Оставлено : 1 ноября 2008 г. 16:38:03(UTC)
Kure

Статус: Администратор

Группы: Администраторы, Участники
Зарегистрирован: 13.12.2007(UTC)
Сообщений: 111
Откуда: Крипто-Про

Поблагодарили: 33 раз в 10 постах
:-)) Или я совсем перемудрил тут?

Совсем.
Не стоит придумывать.
Или почитать или поучится.

У нас на первой страничке ссылки.

Учебный центр Информзащита — Использование ЭЦП в PKI на основе Удостоверяющего центра КриптоПро,
Организационно-правовые основы применения ЭЦП и деятельности удостоверяющих центров,
Формирование регламентов деятельности удостоверяющего центра и настройка компонентов "КриптоПро УЦ"
Академия АйТи — Использование ЭЦП на основе КриптоПро УЦ

учебные центры:
Сетевая Академия ЛАНИТ - Практика использования инфраструктуры открытых ключей (PKI) на основе продуктов КриптоПро УЦ, КриптоПро CSP и идентификаторов Рутокен

видеокурсы на CNews TV:
- секреты "КриптоПро УЦ";

- цифровые сертификаты не вечны.
Offline Ruslan  
#20 Оставлено : 1 ноября 2008 г. 17:24:43(UTC)
Ruslan

Статус: Активный участник

Группы: Участники
Зарегистрирован: 16.10.2008(UTC)
Сообщений: 33

Хорошо..почитаю..
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (3)
3 Страницы<123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.