Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,193 Сказал(а) «Спасибо»: 100 раз Поблагодарили: 274 раз в 254 постах
|
тут еще важен порядок. если делать все низкоуровнево, то надо попробовать прохэшировать как есть. иначе попробовать прохешировать предварительно отключив сортировку аттрибутов. к примеру в java есть info.signedAttrs.needSortSignedAttributes = needSortSignedAttributes; где info это final SignerInfo info = cms.signerInfos.elements[0]; |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 05.07.2018(UTC) Сообщений: 467
Сказал(а) «Спасибо»: 43 раз Поблагодарили: 69 раз в 61 постах
|
Автор: Санчир Момолдаев тут еще важен порядок. если делать все низкоуровнево, то надо попробовать прохэшировать как есть. иначе попробовать прохешировать предварительно отключив сортировку аттрибутов. к примеру в java есть info.signedAttrs.needSortSignedAttributes = needSortSignedAttributes; где info это final SignerInfo info = cms.signerInfos.elements[0]; Да, конечно, понимаю. Я просто вытаскиваю "как есть", без сортировки и какого-то анализа. Но пока безуспешно. Буду пытаться дальше... С наступившим!) |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 05.07.2018(UTC) Сообщений: 467
Сказал(а) «Спасибо»: 43 раз Поблагодарили: 69 раз в 61 постах
|
УРААА!!! ПОЛУЧИЛОСЬ!!! Вот что сделал: Код:(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)
| Причина: Не указана |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 05.07.2018(UTC) Сообщений: 467
Сказал(а) «Спасибо»: 43 раз Поблагодарили: 69 раз в 61 постах
|
Скажите пожалуйста, почему без array.reverse(signatureBytes) не проверяется? Зачем нужно инвертировать массив? |
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,193 Сказал(а) «Спасибо»: 100 раз Поблагодарили: 274 раз в 254 постах
|
Автор: Анатолий Колкочев Скажите пожалуйста, почему без array.reverse(signatureBytes) не проверяется? Зачем нужно инвертировать массив? Так исторически сложилось. в Microsoft CryptoAPI - Little Endian в C#, Java, etc - Big Endian разный порядок байт |
|
1 пользователь поблагодарил Санчир Момолдаев за этот пост.
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close