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

Уведомление

Icon
Error

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

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

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

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 24 раз в 21 постах
Попробовал сделать следующим образом:
Подпись файла:
Код:
cryptcp.exe -signf -detached -dir ./ -cert -der -strict -nostampcert -cadesbes -hashalg 1.2.643.7.1.1.2.2 -display -fext .sign -dn "CN=COMSIB RA DSS Admin" Example1.docx


Проверка подписи с использованием библиотеки bouncy castle:
Код:
(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])
}


Возвращает $true, проверка проходит успешно.
Вытаскиваю contentDigest и Signature

Код:
[System.IO.File]::WriteAllBytes(".\1.sig",$signers[0].GetSignature())
[System.IO.File]::WriteAllBytes(".\1.hash",$signers[0].GetContentDigest())


Начинаю проверку с использованием утилиты csptest:
Код:
csptest -keyset -verify GOST12_256 -in .\1.hash -signature .\1.sig -cert .\1.cer


csptest возвращает ошибку:
Код:
CSP (Type:80) v5.0.10003 KC1 Release Ver:5.0.11455 OS:Windows CPU:IA32 FastCode:READY:AVX.
AcquireContext: OK. HCRYPTPROV: 17644712
GetProvParam(PP_NAME): Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider
Public key imported from cert file: .\1.cer
Hash object created with alg: GOST12_256 0x8021
The data buffer has been hashed.
An error occurred in running the program.
ctkey.c:4039:Bad Signature.
Error number 0x80090006 (-2146893818).
Неправильная подпись.


Подскажите пожалуйста, что я делаю не так?
Offline Андрей *  
#2 Оставлено : 29 декабря 2020 г. 12:34:14(UTC)
Андрей *

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

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

Сказал «Спасибо»: 388 раз
Поблагодарили: 1590 раз в 1223 постах
Здравствуйте.


Приложите в архиве то, что передаёте в утилиту при проверке.
Техническую поддержку оказываем тут
Наша база знаний
Offline Анатолий Колкочев  
#3 Оставлено : 29 декабря 2020 г. 12:37:27(UTC)
TolikTipaTut1

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

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

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 24 раз в 21 постах
Example.zip (12kb) загружен 3 раз(а).
Offline Андрей *  
#4 Оставлено : 29 декабря 2020 г. 12:52:10(UTC)
Андрей *

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

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

Сказал «Спасибо»: 388 раз
Поблагодарили: 1590 раз в 1223 постах
а .GetSignature() что делает?

в 1.sig не значение подписи из cms...

Snimok ehkrana ot 2020-12-29 13-47-56.png (37kb) загружен 5 раз(а).


в 1.sig:
3F7F3F3F543F5C4A470B3F1C3F3F3F663F3F3F3F3F703F3F3F1E4D53526F3F113A3F3F3F1A037C3F43393F3F3F62003F3F7F3F3F3F633F073F2D5E3F3F763F77

в Example1.docx.sign:
9E7FC181549A5C4A470BA51CA4CA8B66E8DDD2DFEA70E9B4F81E4D53526F81113AD8BAB11A037C974339D7C5ED6200BF917F8783B363FE07AC2D5EF4D576BF77

Техническую поддержку оказываем тут
Наша база знаний
Offline Анатолий Колкочев  
#5 Оставлено : 29 декабря 2020 г. 12:56:00(UTC)
TolikTipaTut1

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

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

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

Он выдает массив байт подписи
Возсожно WriteAllBytes некорректно отрабатывает ...

Вывод GetSignature():
Код:
158, 127, 193, 129, 84, 154, 92, 74, 71, 11, 165, 28, 164, 202, 139, 102, 232, 221, 210, 223, 234, 112, 233, 180, 248, 30, 77, 83, 82, 111, 129, 17, 58, 216, 186, 177, 26, 3, 124, 151, 67, 57, 215, 197, 237, 98, 0, 191, 145, 127, 135, 131, 179, 99, 254, 7, 172, 45, 94, 244, 213, 118, 191, 119


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

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

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

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 24 раз в 21 постах
Код:
0..63 | % {
     [System.Text.Encoding]::Default.GetBytes((gc .\1.sig))[$_] -eq $signers[0].GetSignature()[$_]
}


Выдает везде $true

Изменил код записи данных в файл:
Код:
[System.IO.File]::WriteAllBytes((gci .\1.sig),$signers[0].GetSignature())


Заливаю новые файлы. Example.docx.zip (12kb) загружен 1 раз(а).

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

Offline Андрей *  
#7 Оставлено : 29 декабря 2020 г. 13:18:22(UTC)
Андрей *

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

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

Сказал «Спасибо»: 388 раз
Поблагодарили: 1590 раз в 1223 постах
Автор: Анатолий Колкочев Перейти к цитате
1.png (227kb) загружен 4 раз(а).

Он выдает массив байт подписи
Возсожно WriteAllBytes некорректно отрабатывает ...

Вывод GetSignature():
Код:
158, 127, 193, 129, 84, 154, 92, 74, 71, 11, 165, 28, 164, 202, 139, 102, 232, 221, 210, 223, 234, 112, 233, 180, 248, 30, 77, 83, 82, 111, 129, 17, 58, 216, 186, 177, 26, 3, 124, 151, 67, 57, 215, 197, 237, 98, 0, 191, 145, 127, 135, 131, 179, 99, 254, 7, 172, 45, 94, 244, 213, 118, 191, 119




но хеш же в 1.hash правильные байты записаны, так что WriteAllBytes - правильно записывает.

Snimok ehkrana ot 2020-12-29 14-17-51.png (36kb) загружен 2 раз(а).
Техническую поддержку оказываем тут
Наша база знаний
Offline Анатолий Колкочев  
#8 Оставлено : 29 декабря 2020 г. 13:25:36(UTC)
TolikTipaTut1

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

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

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 24 раз в 21 постах
Автор: Андрей * Перейти к цитате
Автор: Анатолий Колкочев Перейти к цитате
1.png (227kb) загружен 4 раз(а).

Он выдает массив байт подписи
Возсожно WriteAllBytes некорректно отрабатывает ...

Вывод GetSignature():
Код:
158, 127, 193, 129, 84, 154, 92, 74, 71, 11, 165, 28, 164, 202, 139, 102, 232, 221, 210, 223, 234, 112, 233, 180, 248, 30, 77, 83, 82, 111, 129, 17, 58, 216, 186, 177, 26, 3, 124, 151, 67, 57, 215, 197, 237, 98, 0, 191, 145, 127, 135, 131, 179, 99, 254, 7, 172, 45, 94, 244, 213, 118, 191, 119




но хеш же в 1.hash правильные байты записаны, так что WriteAllBytes - правильно записывает.

Snimok ehkrana ot 2020-12-29 14-17-51.png (36kb) загружен 2 раз(а).


Да вроде все правильно записывается, только csptest опять ругается ...
2.png (311kb) загружен 2 раз(а).
Offline Анатолий Колкочев  
#9 Оставлено : 29 декабря 2020 г. 13:55:54(UTC)
TolikTipaTut1

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

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

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 24 раз в 21 постах
Как бы ни пробовал - не работает ...
Если подписывать через csptest -keyset -sign, то проверка работает:
Код:
csptest -keys -cont "\\.\REGISTRY\CRDA" -sign GOST12_256 -keytype exchange -in .\1.hash -out .\1.sig

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

Offline Андрей *  
#10 Оставлено : 29 декабря 2020 г. 14:12:31(UTC)
Андрей *

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

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

Сказал «Спасибо»: 388 раз
Поблагодарили: 1590 раз в 1223 постах
в RFC нужно посмотреть..
Техническую поддержку оказываем тут
Наша база знаний
Offline Анатолий Колкочев  
#11 Оставлено : 29 декабря 2020 г. 16:49:30(UTC)
TolikTipaTut1

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

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

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 24 раз в 21 постах
Автор: Андрей * Перейти к цитате
в RFC нужно посмотреть..


Подскажите, что следует посмотреть ?
Offline Санчир Момолдаев  
#12 Оставлено : 29 декабря 2020 г. 21:13:20(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 68 раз
Поблагодарили: 158 раз в 154 постах
Добрый день!
попробуйте перевернуть подпись побайтово:
63<->0, 62<->1 ...
и проверить
Техническую поддержку оказываем тут
Наша база знаний
Offline Анатолий Колкочев  
#13 Оставлено : 29 декабря 2020 г. 21:31:38(UTC)
TolikTipaTut1

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

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

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 24 раз в 21 постах
Автор: Санчир Момолдаев Перейти к цитате
Добрый день!
попробуйте перевернуть подпись побайтово:
63<->0, 62<->1 ...
и проверить


Сделал array.reverse()

PS. Не помогло...( Опять неправильная подпись

Сделал:
Код:
$rev_sig = $signers[0].GetSignature()
[array]::Reverse($rev_sig)
[System.IO.File]::WriteAllBytes((gci .\1.sig),$rev_sig)

csptest -keyset -verify GOST12_256 -in .\1.hash -signature .\1.sig -cert .\1.cer

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

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

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

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

Сказал(а) «Спасибо»: 68 раз
Поблагодарили: 158 раз в 154 постах
в -in надо передать имя исходного файла, а не хэша
Техническую поддержку оказываем тут
Наша база знаний
Offline Анатолий Колкочев  
#15 Оставлено : 29 декабря 2020 г. 21:54:20(UTC)
TolikTipaTut1

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

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

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 24 раз в 21 постах
Автор: Санчир Момолдаев Перейти к цитате
в -in надо передать имя исходного файла, а не хэша


Так тоже попробовал. Не получилось ... Опять неправильная подпись.

PS. Попробовал и развернуть байты подписи array.reverse(). Неправильная подпись.

PPS. Скорее всего проблема в методе GetContentDigest(). Т.к. передавая его PrivateKey.VerifyHash() тоже получается false на выходе

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

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

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

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

Сказал(а) «Спасибо»: 68 раз
Поблагодарили: 158 раз в 154 постах
так у вас же cades-bes подпись.
в ней хэшируются подписанные аттрибуты и затем подписываются. и это значение подписи от хэша подписанных аттрибутов, а не исходных данных
может обойтись без cms подписей?
Техническую поддержку оказываем тут
Наша база знаний
Offline Анатолий Колкочев  
#17 Оставлено : 29 декабря 2020 г. 22:03:12(UTC)
TolikTipaTut1

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

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

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 24 раз в 21 постах
Автор: Санчир Момолдаев Перейти к цитате
так у вас же cades-bes подпись.
в ней хэшируются подписанные аттрибуты и затем подписываются. и это значение подписи от хэша подписанных аттрибутов, а не исходных данных
может обойтись без cms подписей?


Как раз сегодня об этом спрашивал тут

PS. Я пытаюсь найти метод, с помощью которого можно посчитать этот хеш-код. Видимо, метод GetContentDigest() в итоге выдает messageDigest, а не то, что нужно.

PSS. Нет, messageDigest в файле Example1.docx.sig:
Код:
22 04 06 6c 70 22 33 34  31 6f 4d c6 f7 eb a6 11
9b 5e 64 91 ae df 2b 9a  85 87 e9 bb 17 d6 bb 33


Вычисленный хеш-код для подписываемого файла Example1.docx:
Код:
cpverify.exe -mk .\Example1.docx -alg GR3411_2012_256
Вывод: 2204066C70223334316F4DC6F7EBA6119B5E6491AEDF2B9A8587E9BB17D6BB33

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

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

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

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

Сказал(а) «Спасибо»: 68 раз
Поблагодарили: 158 раз в 154 постах
а КриптоПро .NET установлен?
если через него то
Код:
// Создаем объект для хэширования.
Gost3411_2012_256CryptoServiceProvider gost3411 = new Gost3411_2012_256CryptoServiceProvider();
// Вычисляем хэш от всех прочитанных данных.
byte[] hashValue = gost3411.ComputeHash(data);
gost3411.Clear();

X509Certificate2 signerCert = GetSignerCert("Test");
Console.WriteLine("Сертификат: {0}",signerCert.Subject);
// первый способ
Gost2012_256SignatureFormatter gost = new Gost2012_256SignatureFormatter();
gost.SetKey(signerCert.PrivateKey);
byte[] sign = gost.CreateSignature(hashValue);

File.WriteAllBytes(sigFileName1,sign.Reverse().ToArray());

//еще одна подпись
Gost3410_2012_256CryptoServiceProvider cert_key = signerCert.PrivateKey as Gost3410_2012_256CryptoServiceProvider;
sign = cert_key.CreateSignature(hashValue);
File.WriteAllBytes(sigFileName2, sign);

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

Техническую поддержку оказываем тут
Наша база знаний
Offline Анатолий Колкочев  
#19 Оставлено : 29 декабря 2020 г. 22:14:23(UTC)
TolikTipaTut1

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

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

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 24 раз в 21 постах
Автор: Санчир Момолдаев Перейти к цитате
а КриптоПро .NET установлен?
если через него то
Код:
// Создаем объект для хэширования.
            Gost3411_2012_256CryptoServiceProvider gost3411 = new Gost3411_2012_256CryptoServiceProvider();
            // Вычисляем хэш от всех прочитанных данных.
            byte[] hashValue = gost3411.ComputeHash(data);
            gost3411.Clear();

            X509Certificate2 signerCert = GetSignerCert("Test");
            Console.WriteLine("Сертификат: {0}",signerCert.Subject);
            // первый способ
            Gost2012_256SignatureFormatter gost = new Gost2012_256SignatureFormatter();
            gost.SetKey(signerCert.PrivateKey);
            byte[] sign = gost.CreateSignature(hashValue);

            File.WriteAllBytes(sigFileName1,sign.Reverse().ToArray());

            //еще одна подпись
            Gost3410_2012_256CryptoServiceProvider cert_key = signerCert.PrivateKey as Gost3410_2012_256CryptoServiceProvider;
            sign = cert_key.CreateSignature(hashValue);
            File.WriteAllBytes(sigFileName2, sign);


Да, КриптоПро .Net стоит.
Но идея не в том, чтобы посчитать хеш-код для файла, а понять, что подписывается в CMS

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

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

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

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

Сказал(а) «Спасибо»: 68 раз
Поблагодарили: 158 раз в 154 постах
в кадес хэшируются аттрибуты. этот хэш подписывается.
в pkcs7 без подписанных аттрибутов http://cpdn.cryptopro.ru...p40/html/cadesattrs.html
подписывается хэш от данных
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.