Форум КриптоПро
»
Средства криптографической защиты информации
»
КриптоПро .NET
»
Как проверить отсоединённую ЭЦП файла с помощью открытого ключа??
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 24.12.2007(UTC) Сообщений: 390 Откуда: КриптоПро Поблагодарили: 2 раз в 2 постах
|
Детская болезнь левизны в подписи... Код:Data.Seek(0, SeekOrigin.Begin);
перед проверкой, поможет :). Подписываете - файл, проверяете - то, что за пределами файла - ничего. Отредактировано пользователем 31 октября 2008 г. 15:52:14(UTC)
| Причина: Не указана |
С уважением, Александр. |
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 16.10.2008(UTC) Сообщений: 33
|
Хм... интересно.. говорит, что подпись не верна даже когда проверяю с помощью открытого ключа извлечённого непосредственно из сертификата.. А в моей программе такая проверка работает правильно. Значит это не ошибка 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)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 16.10.2008(UTC) Сообщений: 33
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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-ки или массива байтов преобразованного в строку. Большое спасибо за консультацию!! А то уже вторую неделю с этой ЭЦП парюсь
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 24.12.2007(UTC) Сообщений: 390 Откуда: КриптоПро Поблагодарили: 2 раз в 2 постах
|
Про "Думаю можно использовать методы ExportCspBlob()/ImportCspBlob() и FromXmlString()/ToXmlString() для того что бы формировать объект класса Gost3410Parameters на проверяющей стороне" не понял... Почему нельзя воспользоваться методом ExportParameters? И еще, когда вы передаете сообщение с вложенным в него открытым ключом никто не мешает противнику изменить сообщение, переподписать сообщение на своем секретном ключе и вложить в это сообщение свой открытый ключ. Поэтому, я надеюсь, что Вы помните об этом и предприняли все необходимы шаги для защиты от подобных атаки. |
С уважением, Александр. |
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 16.10.2008(UTC) Сообщений: 33
|
Спасибо за совет. Неприменно учту! :-)
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 16.10.2008(UTC) Сообщений: 33
|
Челпанов А. написал:Про "Думаю можно использовать методы ExportCspBlob()/ImportCspBlob() и FromXmlString()/ToXmlString() для того что бы формировать объект класса Gost3410Parameters на проверяющей стороне" не понял... Почему нельзя воспользоваться методом ExportParameters? И еще, когда вы передаете сообщение с вложенным в него открытым ключом никто не мешает противнику изменить сообщение, переподписать сообщение на своем секретном ключе и вложить в это сообщение свой открытый ключ. Поэтому, я надеюсь, что Вы помните об этом и предприняли все необходимы шаги для защиты от подобных атаки. Я вам наверное уже жутко надоел. Но у меня возник ещё одн вопрос в связи с этим вашим коментарием. Как я понял, для создания ЭЦП пользователь обращается в центр сертификации и получает от него 2 сертификата: 1) Сертификат сертификационнго центра. Который подтверждает, что второй сертификат выдан действительно сертификационным центром и что он действителен. 2) Сертификат который содерджит ОТКРЫТЫЙ и ЗАКРЫТЫЙ ключи. Используя второй сертифика пользователь подписывает информацию и у него появляется ЭЦП, которую он может передать потребителю информации вместе с самой информацией и ОТКРЫТЫМ ключём для проверки ЭЦП. Потребитель информации, что бы проверить ЭЦП должен получить ОТКРЫТЫЙ ключ из сертификата пользователя, который создал ЭЦП. Причём наилучший способо передать ОТКРЫТЫЙ ключ, это передать его в виде public key certificate. Такой Public key certificate потребитель информации может проверить с помощью центра сертификаци, который его выдал и убедиться что у него в руках настоящий ОТКРЫТЫЙ ключ пользователя подписавшего информацию и спокойно проверить её. Возникает вопрос! А откуда берётся Public key certificate с ОТКРЫТЫМ ключём, причём с таким же ОТКРЫТЫМ ключём как в сертификате пользователя подписавшего информацию? И как его получить программно? :-)) Или я совсем перемудрил тут?
|
|
|
|
Статус: Администратор
Группы: Администраторы, Участники Зарегистрирован: 13.12.2007(UTC) Сообщений: 111 Откуда: Крипто-Про
Поблагодарили: 33 раз в 10 постах
|
:-)) Или я совсем перемудрил тут?
Совсем. Не стоит придумывать. Или почитать или поучится.
У нас на первой страничке ссылки.
Учебный центр Информзащита — Использование ЭЦП в PKI на основе Удостоверяющего центра КриптоПро, Организационно-правовые основы применения ЭЦП и деятельности удостоверяющих центров, Формирование регламентов деятельности удостоверяющего центра и настройка компонентов "КриптоПро УЦ" Академия АйТи — Использование ЭЦП на основе КриптоПро УЦ
учебные центры: Сетевая Академия ЛАНИТ - Практика использования инфраструктуры открытых ключей (PKI) на основе продуктов КриптоПро УЦ, КриптоПро CSP и идентификаторов Рутокен
видеокурсы на CNews TV: - секреты "КриптоПро УЦ";
- цифровые сертификаты не вечны.
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 16.10.2008(UTC) Сообщений: 33
|
|
|
|
|
Форум КриптоПро
»
Средства криптографической защиты информации
»
КриптоПро .NET
»
Как проверить отсоединённую ЭЦП файла с помощью открытого ключа??
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close