Добрый день!
Не могли бы вы подсказать, в чем причина моей проблемы?
Вкратце ситуация: необходимо с помощью криптобиблиотеки BouncyCastle (v1.6) проверить ЭЦП, сформированную с помощью КриптоПРО CSP 3.6.
Пока тестирую.
Для подписывания генерится закрытый ключ, формируется запрос PKCS#10 и отправляется cryptopro.ru/certsrv, устанавливается подписанный сертификат.
Далее в mmc делается экспорт этого сертификата в DER'е. Этот сертификат содержит мой открытый ключ, и этим открытым ключом по идее я могу проверить собственную подпись.
Генерация подписи происходит через CryptoAPI.
Однако проверка подписи не проходит, подпись не верна.
С использованием CryptoAPI проверка проходит, все нормально, но нужно проверять именно BouncyCastle'ом.
Сообщение записанное и прочитанное совпадают байт в байт, подпись - аналогично.
Вот мой код (пишу на C# на VS2008):
StreamReader sr2;
X509CertificateParser prs; // парсер сертификата
Org.BouncyCastle.X509.X509Certificate cer; // сам объект сертификата
Gost3410DigestSigner gds; // Дайджест-сигнер, генерит для сообщения хэш по ГОСТ Р 34.10-94 и формирует/проверяет подпись по ГОСТ Р 34.10-2001
AsymmetricKeyParameter pubKey2; // объект открытого ключа
byte[] cont = Encoding.UTF8.GetBytes(content); // получаем байты сообщения, content - само прочитанное сообщение
DirectoryInfo di = new DirectoryInfo("D:\\MyDir"); // здесь реализовано просто: прошерстить всю папку, если найден сертификат - выдернуть оттуда открытый ключ и им проверить
foreach (FileInfo fi in di.GetFiles())
{
if (fi.Name.Contains(".cer"))
{
try
{
Console.WriteLine("CERTIFICATE: "+fi.Name );
sr2 = new StreamReader("D:\\MyDir\\"+fi.Name );
prs = new X509CertificateParser();
cer = prs.ReadCertificate(sr2.BaseStream); // разбираем сертификат
sr2.Close();
gds = new Gost3410DigestSigner(new ECGost3410Signer(), new Gost3411Digest()); // инициализируем дайджест-сигнер
pubKey2 = cer.GetPublicKey(); // выдергиваем открытый ключ
gds.Init(false, pubKey2); // инициализируем для проверки
gds.BlockUpdate(cont, 0, cont.Length); // формируем хэш
Console.WriteLine("-----------"+gds.VerifySignature(Convert.FromBase64String(sign))+"---------------"); // собственно, сама проверка. sign - подпись в Base64, формируемая CryptoAPI
}
catch (Exception exc)
{
Console.WriteLine(exc.Message );
}
}
}
Не может ли подпись, сформированная с помощью КриптоПро, по формату отличаться от ГОСТовой?
ГОСТ Р 34.10-2001 параграф 5.3 предусматривает конкатенацию r и s как двоичных векторов в BigEndian, этот массив байт и рассматривается как подпись.
Реверсить биты в прочитанной подписи пробовал также, не помогает.
Подскажите, пожалуйста, в чем моя ошибка?
PS: Подпись, формируемая BouncyCastle'ом проверяется нормально. Генерится ключевая пара, закрытй ключ пишется в файл. На основе этой ключевой пары
генерится запрос на сертификат PKCS#10, открытый ключ из которого используется для проверки подписи. Все читается-пишется-проверяется нормально, длина
Base64 строки 88 символов - как в подписи, формируемой CryptoAPI.
Отредактировано пользователем 17 ноября 2009 г. 15:14:00(UTC)
| Причина: Не указана