Сообщение
  • Пожалуйста, прежде пройдите авторизацию
  • Страница:
  • 1

ТЕМА: CryptoKey GOST c#

CryptoKey GOST c# 3 года, 8 мес. назад #1974

  • Manager777
  • Осваиваюсь на форуме
  • Постов: 32
  • Репутация: 1
Здравствуйте! Возможно ли на текущем SDK реализовать следующую схему:
1) byte[] message -> byte[] Hash "Gost OLD 34.311-95" -> byte[] SignedHash
Т.е. сначала вычисляю хэш, потом шифрую его сертификатом ГОСТ
Можно ли каким то образом достать CryptoKey из сертификата ГОСТ, либо просто шифровать закрытым ключом исходный хэш/ расшифровывать открытым ключом?

2) Меня честно говоря удивило, что содержимое Xml файла искажается при подписании через XmlClass.
Добавляются/Удаляются пробелы, переносы строк.
Таким образом подписанный Xml != исходному. Он как бы равен, но "уравнивать" приходится через велосипед.

3) Ладно Оригинальный Xml засунул в Класс с единственным полем типа byte[] и ещё раз сериализовал в Xml для упрощения структуры документа:

В подписанном Xml

<ds:DigestValue>1JQcjeqccIgfpzLngJtyhSc4nJhYXtp3aZkc2MqIifM=</ds:DigestValue>

это ХЭШ оригинального сообщения?

Если да - в таком случае:

byte[] arr = File.ReadAllBytes(@"ОРИГИНАЛЬНЫЙ XML");
bool res = false;
foreach (string hashalg in MessageDigest.AllNamesSorted)
{
try
{
using (MessageDigestContext con = new MessageDigestContext(MessageDigest.CreateByName(hashalg)))
{
con.Init();
byte[] a = con.Digest(arr);
if (a != null)
if ((result = Convert.ToBase64String(a) =="ХЭШ из подписанного XML"))
break;
}
}
catch { }
}

Почему то ни одного совпадения, дак каким же алгоритмом делается ХЭШ?
Я огорчен(

Re: CryptoKey GOST c# 3 года, 8 мес. назад #1975

  • Murat Seisenov
  • Модератор
  • Постов: 391
  • Репутация: 19
Здравствуйте!

Согласно спецификации xmldsig перед подписанием xml обязательно должен быть канонизирован. Также перед проверкой подписи, исходный xml также приводится к каноническому виду.
Модератор

Re: CryptoKey GOST c# 3 года, 8 мес. назад #1976

  • Manager777
  • Осваиваюсь на форуме
  • Постов: 32
  • Репутация: 1
а что можете сказать по первому вопросу?

Re: CryptoKey GOST c# 3 года, 8 мес. назад #1977

  • Manager777
  • Осваиваюсь на форуме
  • Постов: 32
  • Репутация: 1
Было бы здорово, если бы вы показали пример кода канонизации Xml.

Re: CryptoKey GOST c# 3 года, 8 мес. назад #1978

  • Manager777
  • Осваиваюсь на форуме
  • Постов: 32
  • Репутация: 1
В принципе разобрался - XmlClass verifyXMLbytes() по большому счету решает проблему, т.к. при изменении случайным образом какого нибудь байта в подписанном сообщении - результат = 0 (Signature is bad).
Т.е. проверяется как цепочка, так и целостность исходного сообщения.

Но все равно вопрос касаемо канонизации XML чтоб получить в конечном итоге ХЭШ = ХЭШу внутри подписанного XML - остается открытым.
Изменено: 3 года, 8 мес. назад от Manager777.

Re: CryptoKey GOST c# 3 года, 8 мес. назад #1980

  • Manager777
  • Осваиваюсь на форуме
  • Постов: 32
  • Репутация: 1
И ещё: наконец то разобрался и нашел первопричину сбоев при попытке проверить через OCSP)), по которой было много жалоб: приведу кусочек кода из рабочего проекта:

int res = 0;
string CACERT = Encoding.UTF8.GetString(CertNcaBytes)
.Replace("-----BEGIN CERTIFICATE-----", "")
.Replace("-----END CERTIFICATE-----","")
using (BIO cacrt = new BIO(Convert.FromBase64String(CACERT))
using (X509Certificate c = X509Certificate.FromDER(cacrt))
res = cert.CheckOCSP(c, " ocsp.pki.gov.kz/");

Вот могли бы Разработки SDK засунуть в SDK указания, что прежде чем проверять через OCSPCheck, конвертируйте текстовик root.gov.kz/root_cer/gost.php в DER, путем .... например как у меня - и будет вам сопутствовать удача и счастье)))
И да в случае с OCSP - требуется ли проверка цепочки сертификатов?
Изменено: 3 года, 8 мес. назад от Manager777.
  • Страница:
  • 1
FaLang translation system by Faboba