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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline 11ees  
#1 Оставлено : 10 декабря 2019 г. 8:06:51(UTC)
11ees

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

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

Есть несколько отсоединенных файлов с подписью (*.sig) к одному документу.
Нужно их объеденить в один файл (отсоединенный). Как это можно сделать на C#?
С пространоством System.Security.Cryptography.Pkcs и в частности SignedCms знаком, но простое решение этой задачи не могу найти.
Offline Алексей Н. (neal)  
#2 Оставлено : 22 июля 2025 г. 5:27:21(UTC)
Алексей Н. (neal)

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

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

Добрый день!

Удалось найти решение?
Offline orandno  
#3 Оставлено : 17 марта 2026 г. 11:52:56(UTC)
orandno

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

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

Сказал(а) «Спасибо»: 2 раз
Вопрос к сотрудникам КриптоПро: API С# этого не позволяет?...
Offline Илья К.А.  
#4 Оставлено : 17 марта 2026 г. 12:51:09(UTC)
Илья К.А.

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

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 5 раз в 5 постах
Автор: 11ees Перейти к цитате
Есть несколько отсоединенных файлов с подписью (*.sig) к одному документу.
Нужно их объеденить в один файл (отсоединенный). Как это можно сделать на C#?
С пространоством System.Security.Cryptography.Pkcs и в частности SignedCms знаком, но простое решение этой задачи не могу найти.


Здравствуйте.
Возможности объеденения нескольких CMS сообщений в одно в SignedCms из System.Security.Cryptography.Pkcs нет, так как нет функций для получения/добавления блоба SignerInfo в CMS сообщение.
Но можно создать подпись в добавление к существующей в сообщении, путём загрузки существующей подписи и вызова ComputeSignature:

Код:
var signedCms = new CpSignedCms();
signedCms.Decode(File.ReadAllBytes("signature.sig"));
CmsSigner cmsSigner = new CmsSigner(gostCert);
signedCms.ComputeSignature(cmsSigner);
var signature = signedCms.Encode();


Объеденить несколько CMS сообщений можно вызовами к CryptoAPI.
Для получения SignerInfo из одного сообщения:
CryptMsgGetParam(CMSG_CMS_SIGNER_INFO_PARAM)
А затем добавить к существующему сообщению:
CryptMsgControl(CMSG_CTRL_ADD_CMS_SIGNER_INFO)

И также с сертификатами подписантов:
CryptMsgGetParam(CMSG_CERT_PARAM)
CryptMsgControl(CMSG_CTRL_ADD_CERT)

Отредактировано пользователем 17 марта 2026 г. 12:56:02(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Илья К.А. за этот пост.
orandno оставлено 17.03.2026(UTC)
Offline orandno  
#5 Оставлено : 6 апреля 2026 г. 10:24:01(UTC)
orandno

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

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

Сказал(а) «Спасибо»: 2 раз
Что-то не получается...
1. Декодирую подпись с одним подписантом.
2. Получаю sinfo
3. Декодирую эту же подпись с другим дескриптором.
4. Добавляю туда sinfo
5. Делаю CryptMsgGetParam CMSG_ENCODED_MESSAGE
6.Записываю буфер в файл.

Что я пропустил? Можно немного подробней?
Offline Илья К.А.  
#6 Оставлено : 6 апреля 2026 г. 13:24:37(UTC)
Илья К.А.

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

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 5 раз в 5 постах
Сложно сказать по такому описанию, что пошло не так.
Вот готовый пример C кода для объединения подписей в один файл:
combine.txt (8kb) загружен 7 раз(а).
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.