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

Уведомление

Icon
Error

6 Страницы«<3456>
Опции
К последнему сообщению К первому непрочитанному
Offline Новожилова Елена  
#41 Оставлено : 26 августа 2013 г. 13:20:24(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 935
Женщина
Откуда: Крипто-Про

Поблагодарили: 111 раз в 101 постах
Цитата:
Задача: есть отсоединенная PKCS7 подпись, нужно добавить подпись, не загружая исходные данные, HCRYPTMSG между подписями закрывается.
Именно добавить подпись, а не подписать предыдущую подпись (CryptMsgCountersign).

Насколько мне известно, при помощи только CryptoAPI это сделать не удастся.

Но можно воспользоваться этой функцией.
Offline Ахат  
#42 Оставлено : 26 августа 2013 г. 19:31:03(UTC)
Ахат

Статус: Участник

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

Сказал(а) «Спасибо»: 5 раз
Спасибо за ответ. Используя CadesAddHashSignature я буду ограничен в использовании только вашего криптопровайдера?

Вопрос по теории. Как из хэша, например, полученного CryptMsgGetParam(CMSG_COMPUTED_HASH_PARAM), получить подпись из PKCS7?
CryptSetHashParam и далее CryptSignHash дают не тот результат, даже если результат читать наоборот (в порядке байтов).
В rfc2315 сказано "The result of the digest-encryption process is the encryption with the signer's private
key of the BER encoding of a value of type DigestInfo:

DigestInfo ::= SEQUENCE {
digestAlgorithm DigestAlgorithmIdentifier,
digest Digest }"
Допустим, имею я DigestInfo в виде байтов. Что далее мне с ним делать (желательно только через CryptoAPI),
чтобы получить эту "encryptedDigest EncryptedDigest" в PKCS7 подписи ? Не опять же хэшировать? - этого в rfc не нашел.
Offline Андрей Писарев  
#43 Оставлено : 27 августа 2013 г. 13:24:11(UTC)
Андрей *

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

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

Сказал «Спасибо»: 599 раз
Поблагодарили: 2336 раз в 1833 постах
Автор: Ахат Перейти к цитате

Вопрос по теории. Как из хэша, например, полученного CryptMsgGetParam(CMSG_COMPUTED_HASH_PARAM), получить подпись из PKCS7?
CryptSetHashParam и далее CryptSignHash дают не тот результат, даже если результат читать наоборот (в порядке байтов).


Если речь идет про различные значения подписи на один и те же данные, тогда ответ здесь
Техническую поддержку оказываем тут
Наша база знаний
Offline Pashk88  
#44 Оставлено : 19 июня 2014 г. 16:26:41(UTC)
Pashk88

Статус: Новичок

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

Добрый день, у меня такая проблема.

1) Сценарий 1.
Создаю криптографическое сообщение (без данных) с одной подписью X1, созданной ключом Х. Проверяю подпись достоверна. Меняю данные, проверяю подпись скомпрометирована. Соподписываю сообщение опять ключом X и получаю подпись X2. Проверяю X1 и X2 достоверны. Меняю данные на первоначальные - обе подписи скомпрометированы.



2) Сценарий 2.
Создаю криптографическое сообщение (без данных) с одной подписью X1, созданной ключом Х. Проверяю подпись достоверна. Меняю данные, проверяю подпись скомпрометирована. Соподписываю сообщение ключом Y и получаю подпись Y1. Проверяю подпись Y1 достоверна, а X1 соответственно скомпрометирована. Меняю данные еще раз. Проверяю подпись Y1 скомпрометирована, а X1 достоверна. Все верно. Соподписываю сообщение опять ключом X получаю подпись X2. Проверяю все подписи X1, X2 достоверны, Y1 - не достоверна. Подписываю ключом Y и получаю подпись Y2. Проверяю все подписи X1, X2 достоверны, Y1, Y2 - не достоверны.



Кратко о том как я делал:

1) Создание криптографического сообщения с подписью
Цитата:
1.1 Ищу контейнер закрытого ключа
1.1 Получаю закрытый ключ CryptAcquireCertificatePrivateKey()
1.2 Заполняю структуры CRYPT_ALGORITHM_IDENTIFIER, CMSG_SIGNER_ENCODE_INFO
1.3 Структуру CMSG_SIGNER_ENCODE_INFO помещаю в массив структур CMSG_SIGNER_ENCODE_INFO (массив csei)
1.4 Заполняю структуры CERT_BLOB
1.5 Структуру CERT_BLOB помещаю в массив структур CERT_BLOB (массив cb)
1.6 Заполняю структуру CMSG_SIGNED_ENCODE_INFO (csedei) с учетом массивов csei и cb
1.7 Получаю сообщение CryptMsgOpenToEncode(MY_ENCODING_TYPE, CMSG_DETACHED_FLAG, CMSG_SIGNED, &csedei, NULL, NULL)
1.8 В цикле заполняю сообщение CryptMsgUpdate(..., feof(...))
1.9 Получаю сообщение CryptMsgGetParam(hMsg, CMSG_CONTENT_PARAM, 0, &blob, &i)
1.10 Записываю блоб в файл.


2) Соподпись
Цитата:
2.1 Повтор пунктов 1.1, 1.2, 1.4
2.2 Загружаю содержимое файла (криптографическое сообщения) в память
2.3 Получаю сообщение CryptMsgOpenToDecode(MY_ENCODING_TYPE, CMSG_DETACHED_FLAG, 0, NULL, NULL, NULL)
2.4 Копирую в сообщение содержимое файла (крипт. сообщения) CryptMsgUpdate(..., TRUE)
2.5 Аналогично пункту 1.8
2.6 Помещаю подпись в сообщение CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_SIGNER, &SignerEncodeInfo)
2.7 Помещаю сертификат открытого ключа в сообщение CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_CERT, &SignerCertBlob)
2.8 Повтор пунктов 1.9 и 1.10


3) Проверка
Цитата:
3.1 Повтор пункта 2.3, 2.4, 1.8
3.2 Получаю кол-во подписей CryptMsgGetParam(hMsg, CMSG_SIGNER_COUNT_PARAM, 0, &count, &size)
3.3 В цикле по каждой подписи
3.3.1 CryptMsgGetParam(hMsg, CMSG_SIGNER_CERT_INFO_PARAM, номер_подписи, pbSignerCertInfo, &cbSignerCertInfo)){
3.3.2 Открываю хранилище hStoreHandle = CertOpenStore(CERT_STORE_PROV_MSG, MY_ENCODING_TYPE, hCryptProv, 0, hMsg)
3.3.3 Получаю контекст pSignerCertContext = CertGetSubjectCertificateFromStore(hStoreHandle,MY_ENCODING_TYPE, pSignerCertInfo)
3.3.4 Получаю структуру CMSG_SIGNER_INFO_PARAM: CryptMsgGetParam(hMsg, CMSG_SIGNER_INFO_PARAM, номер_подписи, (PVOID)pSignerInfo, &dwSignerInfo)
3.3.5 Проверяю CryptMsgControl(hMsg,0,CMSG_CTRL_VERIFY_SIGNATURE, pSignerCertContext->pCertInfo)
3.3.6 Получаю остальные необходимые параметры (даты, а так же свои собственные подписанные атрибуты - комментарий и еще один).


Подскажите это все таки моя ошибка (можете подсказать где именно) или все таки ошибка CryptoPro или особенность CryptoAPI?

Отредактировано пользователем 19 июня 2014 г. 17:36:17(UTC)  | Причина: Не указана

Offline Андрей Писарев  
#45 Оставлено : 19 июня 2014 г. 16:33:56(UTC)
Андрей *

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

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

Сказал «Спасибо»: 599 раз
Поблагодарили: 2336 раз в 1833 постах
Приложите файлы.
Техническую поддержку оказываем тут
Наша база знаний
Offline Pashk88  
#46 Оставлено : 19 июня 2014 г. 16:53:56(UTC)
Pashk88

Статус: Новичок

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

Отправил вам личным сообщением.

Обратите внимание, исправил ошибку в сценарии 2.

Впринципе мне не очень важна задача подписания данных одним закрытым ключом несколько раз. Каким образом можно проверять наличие подписи - получать для всех подписей CMSG_SIGNER_CERT_INFO_PARAM и сравнивать с сертификатом, которым планируется создать новую подпись, это нужно чтобы исключить возможность подписания два раза

Отмечу, что при этом все все мои атрибуты, а так же стандартные (даты) остается неизменным у каждой подписи.

Отредактировано пользователем 19 июня 2014 г. 17:33:37(UTC)  | Причина: Не указана

Offline Pashk88  
#47 Оставлено : 23 июня 2014 г. 15:02:35(UTC)
Pashk88

Статус: Новичок

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

Так все же, это особенность соподписи одним и тем же ключом или мой баг?
Offline Новожилова Елена  
#48 Оставлено : 23 июня 2014 г. 16:37:32(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 935
Женщина
Откуда: Крипто-Про

Поблагодарили: 111 раз в 101 постах
Здравствуйте!
Как я понимаю, вы создаете отделенную подпись. В этом случае, какие данные были переданы в CryptMsgUpdate - такие данные и будут подписаны. Данные в самом подписанном сообщении вы при этом не меняете.
В чем именно заключается проблема? Из описания не очень понятно...

Единственное - вы при создании параллельной подписи данные в CryptMsgUpdate вообще передаете?

Отредактировано пользователем 23 июня 2014 г. 16:40:23(UTC)  | Причина: Не указана

Offline Pashk88  
#49 Оставлено : 23 июня 2014 г. 16:46:16(UTC)
Pashk88

Статус: Новичок

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

Елена, добрый день. Все верно, я создаю криптографическое сообщение с отдельными данными. При соподписи я создаю сообщение (CryptMsgOpenToDecode())и добавляю туда содержание самого сообщения CryptMsgUpdate(..., TRUE), а затем сами данные CryptMsgUpdate(..., feof(...)). Я это более подпробно описал в пункте 2) Соподпись.

Еще раз о проблеме. У меня есть два ключа X и Y и данные в состоянии 1. Я создаю подпись X1 ключом X (пункт 1 - Создание криптографического сообщения с подписью). Меняю исходные данные (на состояние 2), после чего ключом Y соподписываю данные (как описал в пункте 2 - Соподпись), т.е. добавляю подпись Y1 в криптографическое сообщение. Тоесть теперь у меня X1 - не действительная подпись, так как данные менял, а Y1 действительная. После чего опять соподписываю данные с помощью ключа X и получаю подпись X2. И теперь если проверять все подписи в криптографическом сообщении они все становятся действительными (т.е. X1 стала действительной).


Добавлю.
Теперь когда есть три подписи (после проделанных выше действий) в криптографическом сообщении и они все действительны, я меняю данные (в состояние 3). Проверяю все подписи становятся недействиельными. Создаю соподпись X3 ключом X. Проверяю все подписи не действительны, даже X3.. Возвращаю данные на состояние 2. Проверяю... и опять все даже X3(?!) становится действительной!

Отредактировано пользователем 23 июня 2014 г. 16:54:38(UTC)  | Причина: Не указана

Offline Новожилова Елена  
#50 Оставлено : 23 июня 2014 г. 17:55:17(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 935
Женщина
Откуда: Крипто-Про

Поблагодарили: 111 раз в 101 постах
То есть:

1. Создаете отделенную подпись для данных Data1 (x1). Получаете сообщение Msg1.

2. Открываете контекст сообщения Msg1, но с другими данными Data2. Создаете вторую подпись (y1). Получаете сообщение Msg2.

3. Открываете контекст сообщения Msg2, с данными (Data1, Data2 или Data3 - ?). Создаете третью подпись (x2). Получаете сообщение Msg3.

В Msg3 - если в п.3 данные были Data1, то действительными будут подписи x1 и x2. Если Data2, то y1 и x2. Если Data3, то только x2.
Если это не так, то внимательно проверяете код.

И помните, что при добавлении параллельной подписи, она необязательно добавится в сообщение последней.

Отредактировано пользователем 23 июня 2014 г. 18:02:32(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
6 Страницы«<3456>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.