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

Уведомление

Icon
Error

2 Страницы<12
Опции
К последнему сообщению К первому непрочитанному
Offline Анатолий Колкочев  
#21 Оставлено : 29 декабря 2020 г. 22:25:29(UTC)
TolikTipaTut1

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

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

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 24 раз в 21 постах
Автор: Санчир Момолдаев Перейти к цитате
в кадес хэшируются аттрибуты. этот хэш подписывается.
в pkcs7 без подписанных аттрибутов http://cpdn.cryptopro.ru...p40/html/cadesattrs.html
подписывается хэш от данных


Вот что получилось на данный момент (а что-то получилось!!)) )
Подписал следующим образом:
Код:
[CryptoPro.Sharpei.Gost3411_2012_256CryptoServiceProvider]$gost3411 = [CryptoPro.Sharpei.Gost3411_2012_256CryptoServiceProvider]::new()
[byte[]]$hashValue = $gost3411.ComputeHash($DataFileRawBytes)
$gost3411.Clear()

$signingCert = (gi Cert:\CurrentUser\My\E3005A57425DFFB920DB2953050D83E89F08008D)
[CryptoPro.Sharpei.Gost2012_256SignatureFormatter]$gost = [CryptoPro.Sharpei.Gost2012_256SignatureFormatter]::new()
$gost.SetKey($signingCert.PrivateKey)
$signature = $gost.CreateSignature($hashValue)


Далее попробовал проверить через csptest, не получилось, НО!!! я сделал array.reverse() для $signature и csptest проверил подпись!!!

Т.е. таким образом заработало!

PS. Это фактически равносильно csptest -keys -sign

Отредактировано пользователем 29 декабря 2020 г. 22:36:24(UTC)  | Причина: Не указана

Offline Анатолий Колкочев  
#22 Оставлено : 29 декабря 2020 г. 22:29:06(UTC)
TolikTipaTut1

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

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

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 24 раз в 21 постах
Но непонятно на самом деле, что было подписано в файле Example1.docx.sign ...
Offline Санчир Момолдаев  
#23 Оставлено : 29 декабря 2020 г. 22:42:05(UTC)
Санчир Момолдаев

Статус: Сотрудник

Группы: Модератор, Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 758
Российская Федерация

Сказал(а) «Спасибо»: 68 раз
Поблагодарили: 158 раз в 154 постах
Автор: Анатолий Колкочев Перейти к цитате
Но непонятно на самом деле, что было подписано в файле Example1.docx.sign ...


еще раз подписаны аттрибуты
берете этот файл. заходите на https://lapo.it загружаете
вот то что под [0] то и подписано
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#24 Оставлено : 29 декабря 2020 г. 22:44:07(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 10,577
Мужчина
Российская Федерация

Сказал «Спасибо»: 388 раз
Поблагодарили: 1595 раз в 1226 постах
При проверке подписи из cms с подписанными атрибутами, нужно проверять подпись под структурой с атрибутами, а не под байтами(хеш контента)
Техническую поддержку оказываем тут
Наша база знаний
Offline Анатолий Колкочев  
#25 Оставлено : 29 декабря 2020 г. 22:44:45(UTC)
TolikTipaTut1

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

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

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 24 раз в 21 постах
3.png (69kb) загружен 5 раз(а).

Там есть несколько нулей... Какой именно следует выбрать? Самый нижний?
Я просто никак понять не могу(

Отредактировано пользователем 29 декабря 2020 г. 22:47:23(UTC)  | Причина: Не указана

Offline Санчир Момолдаев  
#26 Оставлено : 29 декабря 2020 г. 22:57:26(UTC)
Санчир Момолдаев

Статус: Сотрудник

Группы: Модератор, Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 758
Российская Федерация

Сказал(а) «Спасибо»: 68 раз
Поблагодарили: 158 раз в 154 постах
самый нижний. где messageDigest
Техническую поддержку оказываем тут
Наша база знаний
Offline Анатолий Колкочев  
#27 Оставлено : 29 декабря 2020 г. 22:58:58(UTC)
TolikTipaTut1

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

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

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 24 раз в 21 постах
Понял. Сначала идет описание атрибутов, а потом то, что подписываем.

PS. Подписывается эта часть, верно? 4.png (304kb) загружен 6 раз(а).

Отредактировано пользователем 29 декабря 2020 г. 23:00:37(UTC)  | Причина: Не указана

Offline Санчир Момолдаев  
#28 Оставлено : 29 декабря 2020 г. 23:02:54(UTC)
Санчир Момолдаев

Статус: Сотрудник

Группы: Модератор, Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 758
Российская Федерация

Сказал(а) «Спасибо»: 68 раз
Поблагодарили: 158 раз в 154 постах
да. в с# это можно вытащить непосредственно из кода чтобы не изобретать велосипед
https://docs.microsoft.c...view=dotnet-plat-ext-5.0
Техническую поддержку оказываем тут
Наша база знаний
Offline Санчир Момолдаев  
#29 Оставлено : 29 декабря 2020 г. 23:14:55(UTC)
Санчир Момолдаев

Статус: Сотрудник

Группы: Модератор, Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 758
Российская Федерация

Сказал(а) «Спасибо»: 68 раз
Поблагодарили: 158 раз в 154 постах
вот тут в rfc написано что обязательно должно быть что опционально
Техническую поддержку оказываем тут
Наша база знаний
Offline Анатолий Колкочев  
#30 Оставлено : 30 декабря 2020 г. 10:43:49(UTC)
TolikTipaTut1

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

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

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 24 раз в 21 постах
Автор: Санчир Момолдаев Перейти к цитате
да. в с# это можно вытащить непосредственно из кода чтобы не изобретать велосипед
https://docs.microsoft.c...view=dotnet-plat-ext-5.0


Попробовал вытащить таким образом - не получилось( Он выдает только значения подписанных атрибутов, однако не возвращает полностью подписанный блок...
Подписывается блок полностью, а не только значения, как я понял...
Попробовал еще сделать так:
Код:
$encodedAttr = $signers[0].GetEncodedSignedAttributes() #Получил весь подписанный блок (используется библиотека bouncycastle)
$hash = [CryptoPro.Sharpei.Gost3411_2012_256]::Create().ComputeHash($encodedAttr) #Считаю хеш-код для него
$signingCert = gi Cert:\CurrentUser\My\E3005A57425DFFB920DB2953050D83E89F08008D
$signingCert.PrivateKey.VerifyHash($hash, $signers[0].GetSignature()) #Проверяю
#$signingCert.PrivateKey.VerifySignature($hash, $signers[0].GetSignature())


Но постоянно получаю в ответ $false
В целом я разобрался, что реально подписывается в CADeS. Спасибо большое! Хотелось бы еще самостоятельно проверить, но пока не получается (

Отредактировано пользователем 30 декабря 2020 г. 10:48:46(UTC)  | Причина: Не указана

Offline Санчир Момолдаев  
#31 Оставлено : 1 января 2021 г. 8:32:52(UTC)
Санчир Момолдаев

Статус: Сотрудник

Группы: Модератор, Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 758
Российская Федерация

Сказал(а) «Спасибо»: 68 раз
Поблагодарили: 158 раз в 154 постах
тут еще важен порядок.
если делать все низкоуровнево, то надо попробовать прохэшировать как есть.
иначе попробовать прохешировать предварительно отключив сортировку аттрибутов.
к примеру в java есть
info.signedAttrs.needSortSignedAttributes = needSortSignedAttributes;
где info это final SignerInfo info = cms.signerInfos.elements[0];
Техническую поддержку оказываем тут
Наша база знаний
Offline Анатолий Колкочев  
#32 Оставлено : 1 января 2021 г. 9:46:57(UTC)
TolikTipaTut1

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

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

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 24 раз в 21 постах
Автор: Санчир Момолдаев Перейти к цитате
тут еще важен порядок.
если делать все низкоуровнево, то надо попробовать прохэшировать как есть.
иначе попробовать прохешировать предварительно отключив сортировку аттрибутов.
к примеру в java есть
info.signedAttrs.needSortSignedAttributes = needSortSignedAttributes;
где info это final SignerInfo info = cms.signerInfos.elements[0];


Да, конечно, понимаю. Я просто вытаскиваю "как есть", без сортировки и какого-то анализа. Но пока безуспешно. Буду пытаться дальше...


С наступившим!)
Offline Анатолий Колкочев  
#33 Оставлено : 1 января 2021 г. 11:16:44(UTC)
TolikTipaTut1

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

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

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 24 раз в 21 постах
УРААА!!!
ПОЛУЧИЛОСЬ!!!

Вот что сделал:
Код:
(gci "./test files/Example1.docx" | % {[System.IO.File]::ReadAllBytes($_)}) -as [byte[]] | sv -Name "DataFileRawBytes"
(gci "./test files/Example1.docx.sign" | % {[System.IO.File]::ReadAllBytes($_)}) -as [byte[]] | sv -Name "SignatureFileRawBytes"
$signedContent = [Org.BouncyCastle.Cms.CmsProcessableByteArray]::new($DataFileRawBytes)
[Org.BouncyCastle.Cms.CmsSignedData] $signedData = [Org.BouncyCastle.Cms.CmsSignedData]::new($signedContent, $SignatureFileRawBytes)
$certStoreInSig = $signedData.GetCertificates("collection") #Получаем сертификаты
$signers = $signedData.GetSignerInfos().GetSigners()
0..($signers.Count-1) | % {
    $cert = $certStoreInSig.GetMatches($signers[$_].SignerID)
    $signers[$_].verify($cert[0]) #Проверяем подпись
} | % {if ($_ -eq $true) {
        Write-Host "Signature Verified!" -ForegroundColor Green
    }
    elseif ($_ -eq $false) {
        Write-Host "Signature NOT Verified!" -ForegroundColor Red
    }
}

$encodedAttrbFilePath = (pwd).ToString() + "\test files\encodedattrb.txt"
$encodedAttrb = $signers[0].GetEncodedSignedAttributes()
Test-Path -Path $encodedAttrbFilePath | % {if ($_ -eq $false) {ni -i File -p $encodedAttrbFilePath}; if ($_ -eq $true) {gci $encodedAttrbFilePath | sc -Value $null}}
[System.IO.File]::WriteAllBytes($encodedAttrbFilePath,$encodedAttrb)

$encodedAttrbSignatureFilePath = (pwd).ToString() + "\test files\encodedattrb.sign"
$encodedAttrbSignature = $signers[0].getSignature()
Test-Path -Path $encodedAttrbSignatureFilePath | % {if ($_ -eq $false) {ni -i File -p $encodedAttrbSignatureFilePath}; if ($_ -eq $true) {gci $encodedAttrbSignatureFilePath | sc -Value $null}}
[array]::Reverse($encodedAttrbSignature) #Разворачиваем массив подписи
[System.IO.File]::WriteAllBytes($encodedAttrbSignatureFilePath,$encodedAttrbSignature)
& "C:\Program Files (x86)\Crypto Pro\CSP\csptest.exe" -keyset -verify GOST12_256 -in $encodedAttrbFilePath -signature $encodedAttrbSignatureFilePath -cert (gci ".\test files\1.cer") #Получаем Signature Verified OK (УРААА!!!!)

[byte[]]$encodedAttrbHash = [CryptoPro.Sharpei.Gost3411_2012_256]::Create().ComputeHash($encodedAttrb)
$certi = gi Cert:\CurrentUser\My\E3005A57425DFFB920DB2953050D83E89F08008D
$certi.PrivateKey.VerifyHash($encodedAttrbHash, $encodedAttrbSignature) #Получаем $true
$certi.PrivateKey.VerifySignature($encodedAttrbHash, $encodedAttrbSignature) #Получаем $true


Спасибо большое за помощь и разъяснения!)

Отредактировано пользователем 1 января 2021 г. 11:36:29(UTC)  | Причина: Не указана

Offline Анатолий Колкочев  
#34 Оставлено : 1 января 2021 г. 14:38:14(UTC)
TolikTipaTut1

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

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

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 24 раз в 21 постах
Скажите пожалуйста, почему без array.reverse(signatureBytes) не проверяется?
Зачем нужно инвертировать массив?
Offline Санчир Момолдаев  
#35 Оставлено : 1 января 2021 г. 15:38:32(UTC)
Санчир Момолдаев

Статус: Сотрудник

Группы: Модератор, Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 758
Российская Федерация

Сказал(а) «Спасибо»: 68 раз
Поблагодарили: 158 раз в 154 постах
Автор: Анатолий Колкочев Перейти к цитате
Скажите пожалуйста, почему без array.reverse(signatureBytes) не проверяется?
Зачем нужно инвертировать массив?


Так исторически сложилось.
в Microsoft CryptoAPI - Little Endian
в C#, Java, etc - Big Endian
разный порядок байт
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Санчир Момолдаев за этот пост.
TolikTipaTut1 оставлено 01.01.2021(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
2 Страницы<12
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.