Статус: Новичок
Группы: Участники
Зарегистрирован: 15.07.2019(UTC) Сообщений: 5  Откуда: Москва Сказал(а) «Спасибо»: 1 раз
|
Добрый день! Если я формирую подпись файла data через команду cryptcp: Код:cryptcp -sign -uroot -thumbprint b9447942870e418075d3a80e8afee0ebac97120e -der -nocert -nochain -detached -pin mypassword data data.sgn
то в файле data.sgn получаю подпись в формате PKCS#7. Если же я формирую подпись через команду csptest: Код:csptest -keyset -sign GOST12_256 -silent -cont le-2cf4ce8d-d0d5-4329-8cae-ce228a372aec -keytype exchange -in data -out data.sgn -password mypassword
то в файле data.sgn получаю 64 байта, насколько понимаю, «чистой» подписи. Собственно, вопросы: - Я могу как-то вытащить из файла PKCS#7 те самые 64 байта чистой подписи?
- Если нет, то каким образом я могу сформировать чистую подпись через CryptoAPI? В настоящий момент я использую функцию CryptMsgOpenToEncode, с нею у меня формируется полноценная подпись в формате PKCS#7.
Спасибо!
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,504   Сказал «Спасибо»: 554 раз Поблагодарили: 2250 раз в 1756 постах
|
Здравствуйте.
CryptCreateHash CryptSignHash |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,504   Сказал «Спасибо»: 554 раз Поблагодарили: 2250 раз в 1756 постах
|
Автор: outerspace  Собственно, вопросы:[list=1] Я могу как-то вытащить из файла PKCS#7 те самые 64 байта чистой подписи? При проверке подписи - вызвать: Цитата: CryptMsgGetParam(hMsg, CMSG_ENCRYPTED_DIGEST...
|
|
 1 пользователь поблагодарил Андрей * за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 15.07.2019(UTC) Сообщений: 5  Откуда: Москва Сказал(а) «Спасибо»: 1 раз
|
Андрей, спасибо за ответ! Попробовал сделать, как вы советуете: Цитата:При проверке подписи - вызвать: Цитата:CryptMsgGetParam(hMsg, CMSG_ENCRYPTED_DIGEST... Для этого я взял пример /opt/cprocsp/src/samples/CSP/CryptMsgSign и добавил в конец функции do_low_verify() (прямо перед комментарием «Освобождение памяти») следующий код: Код:DWORD cbSize;
if(CryptMsgGetParam(
hMsg,
CMSG_ENCRYPTED_DIGEST,
0,
NULL,
&cbSize)) {
printf("The length of the pure signature has been calculated: %d bytes \n", cbSize);
} else {
HandleError("MsgGetParam failed");
}
BYTE *pbPureSignature = (BYTE *)malloc(cbSize);
if(CryptMsgGetParam(
hMsg,
CMSG_ENCRYPTED_DIGEST,
0,
pbPureSignature,
&cbSize)) {
printf("Pure signature successfully obtained. \n");
} else {
HandleError("MsgGetParam failed");
}
FILE *f = fopen("data.sgn", "wb");
if (!f) {
HandleError("Could not open file!");
}
fwrite(pbPureSignature, 1, cbSize, f);
fclose(f);
Этот кусочек кода при запуске записал 64 байта подписи в файл data.sgn. Чтобы убедиться, что получившаяся подпись корректна, я делаю следующее: - Создаю файл с данными, аналогичными тем, что в примере:
Код:echo -n "Security is our business." > data
- Подписываю его утилитой csptest
Код:csptest -keyset -sign GOST12_256 -silent -cont le-2cf4ce8d-d0d5-4329-8cae-ce228a372aec -keytype exchange -in data -out data.sgn.csptest -password mypassword -export public.key
- Проверяю, что такая подпись валидируется
Код:csptest -keyset -verify GOST12_256 -silent -keytype exchange -in data -signature data.sgn.csptest -import public.key
# ...
Signature was verified OK
- А теперь точно такой же командой проверяю файл, сгенерированный моим приложением
Код:csptest -keyset -verify GOST12_256 -silent -keytype exchange -in data -signature data.sgn -import public.key
# ...
Invalid Signature.
В чём может быть ошибка? Моя задача — получить 64 байта подписи, которые будут успешно валидироваться утилитой csptest.
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602  Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
Предположу 2 варианта: 1) подпись выполнена разными алгоритмами (гост-2001 и гост-2012 256, проверьте перенесен ли пример на гост-2012) или разными сертификатами - тогда действительно длина будет 64, но проверка закономерно выдаст ошибку потому что расшифрованный хэш не совпадет с фактическим; 2) что-то не так с порядком байтов, возможно потребуется записать байты в обратном порядке. Как вариант использовать какой-то еще ключ чтобы команда проверки переворачивала на ходу. Отредактировано пользователем 16 июля 2019 г. 10:17:45(UTC)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 15.07.2019(UTC) Сообщений: 5  Откуда: Москва Сказал(а) «Спасибо»: 1 раз
|
Автор: two_oceans  Предположу 2 варианта: 1) подпись выполнена разными алгоритмами (гост-2001 и гост-2012 256, проверьте перенесен ли пример на гост-2012) или разными сертификатами - тогда действительно длина будет 64, но проверка закономерно выдаст ошибку потому что расшифрованный хэш не совпадет с фактическим; 2) что-то не так с порядком байтов, возможно потребуется записать байты в обратном порядке. Как вариант использовать какой-то еще ключ чтобы команда проверки переворачивала на ходу. - Да-да, тоже об этом подумал! Поэтому добавил в do_low_sign() после вызова GetHashOidForSign() вот такой код:
Код:printf("Hash algo is %s\n", HashAlgorithm.pszObjId);
printf("Signature algo is %s\n", pRecipientCert->pCertInfo->SignatureAlgorithm.pszObjId);
И получил
Код:Hash algo is 1.2.643.7.1.1.2.2
Signature algo is 1.2.643.7.1.1.3.2
т. е. алгоритмы используются верные. Сертификат у меня в хранилище My только один, так что и тут тоже вряд ли проблема.
- Попробовал перевернуть подпись. Для этого воспользовался такой командой (нагуглил):
Код:< data.sgn xxd -p -c1 | tac | xxd -p -r > data.sgn.rev
Файл data.sgn.rev также не проходит проверку (то, что байты перевернулись правильно, проверил через xxd -i — всё ок).
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 15.07.2019(UTC) Сообщений: 5  Откуда: Москва Сказал(а) «Спасибо»: 1 раз
|
В итоге, друзья, есть какие-то идеи, почему такое происходит? Напомню: я хочу программно через CryptoAPI генерировать ЭЦП, которую успешно проверит команда Код:csptest -keyset -verify GOST12_256 -silent -keytype exchange -in data -signature data.sgn -import public.key
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,504   Сказал «Спасибо»: 554 раз Поблагодарили: 2250 раз в 1756 постах
|
Автор: outerspace  В итоге, друзья, есть какие-то идеи, почему такое происходит? Напомню: я хочу программно через CryptoAPI генерировать ЭЦП, которую успешно проверит команда Код:csptest -keyset -verify GOST12_256 -silent -keytype exchange -in data -signature data.sgn -import public.key
Пришлите в zip архиве файлы: data.sgn и public.key (которые проходят проверку в csptest) |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,504   Сказал «Спасибо»: 554 раз Поблагодарили: 2250 раз в 1756 постах
|
Предположу, что в CMS у Вас подпись сформирована под структурой, которая включает хеш+атрибуты. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 15.07.2019(UTC) Сообщений: 5  Откуда: Москва Сказал(а) «Спасибо»: 1 раз
|
Автор: Андрей Писарев  Пришлите в zip архиве файлы: data.sgn и public.key (которые проходят проверку в csptest)  Archive.zip (1kb) загружен 4 раз(а).
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close