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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Dennisw  
#1 Оставлено : 2 ноября 2009 г. 16:53:52(UTC)
Dennisw

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

Группы: Участники
Зарегистрирован: 15.10.2009(UTC)
Сообщений: 49
Откуда: CHL

Добрый День

Пример приведенный в CounterSigned.vb

Код:
 Dim signedCms As SignedCms = New SignedCms(contentInfo)

        ' Подписываем сообщение в формате CMS/PKCS7
        ' один раз для каждого сертификата отправителя.
        For Each cert As X509Certificate2 In signerCerts
            Console.Write("Вычисляем подпись сообщения для субъекта " & _
                "{0} ... ", cert.SubjectName.Name)
            signedCms.ComputeSignature(New CmsSigner(cert), False)
            Console.WriteLine("Успешно.")
        Next

        ' Вычисляем соподписи к первой в сообщении в формате
        ' CMS/PKCS7 один раз для каждого сертификата дополнительной подписи.
        For Each cert As X509Certificate2 In countersignerCerts
            Console.Write("Вычисляем соподписи сообщения для субъекта " & _
                " {0} ... ", _
                cert.SubjectName.Name)
            signedCms.SignerInfos(0).ComputeCounterSignature( _
                New CmsSigner(cert))
            Console.WriteLine("Успешно.")
        Next


в примере описывается возможность подписывания документа несколькими сертификатами + соподписи
все сертификаты при подписи требуют наличие секретного ключа и пароля к нему.

Вопрос собственно в том есть ли возможность подписывать документ с разных компьютеров в разное время. Т.е. ситуация есть документ его подписывает одно лицо (на одном компьютере), далее второе лицо со своим созданным вновь signedCms подписывает еще раз документ (может произойти с другого компьютера), кто то там зашифровывает его (не важно - может третье лицо). При подписи я так понимаю contentInfo преобразуется, и повторное подписывание документа приведет к потере информации о первой подписи ну и вообще к проблемам при signedCms.Decode.

Ну и метод выведет только последнюю подпись которой собственно подписался документ.

Код:
 ' Этот метод выводит некотоорые свойства подписанного сообщения 
    ' в формате CMS/PKCS7. Эти свойства включают число основных и 
    ' дополнительных подписей, информацию, является ли сообщение 
    ' отделенным и версию сообщения.
    Private Sub DisplaySignedCmsProperties(ByVal info As String, _
        ByVal s As SignedCms)
        Console.WriteLine()
        Me.ListBox1.Items.Add("{0}SignedCms: {1}" & _
            Environment.NewLine & " - " & info)
        Me.ListBox1.Items.Add(ChrW(9) + "Количество подписавших:" & _
            ChrW(9) + ChrW(9) + ChrW(9) + " {0} " & _
            s.SignerInfos.Count)
        For i As Integer = 0 To s.SignerInfos.Count - 1
            Me.ListBox1.Items.Add(ChrW(9) + "Имя субъекта подписавшего #{0}:" & _
                ChrW(9) & ChrW(9) & "{1}" & _
                i + 1 & " - " & s.SignerInfos(i).Certificate.SubjectName.Name)
            Me.ListBox1.Items.Add(ChrW(9) + "Количество соподпией для " & _
                "подписавшего #{0}:" & ChrW(9) & "{1}" & _
                i + 1 & " - " & s.SignerInfos(i).CounterSignerInfos.Count)
        Next
        Console.WriteLine()
    End Sub


Если возможно разделять сертификаты для подписи документа, как можно это сделать?
Спасибо
Offline Dennisw  
#2 Оставлено : 2 ноября 2009 г. 17:01:23(UTC)
Dennisw

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

Группы: Участники
Зарегистрирован: 15.10.2009(UTC)
Сообщений: 49
Откуда: CHL

Или же я где то храню постоянно не тронутый contentInfo для каждого подписывающего сообщение
и после signedCms.ComputeSignature добавляю в конечный файл результат signedCms.Encode()
А потом все зашифровываю?

Тем самым перед шифрованием получаю файл из нескольких кусков signedCms.Encode()
для каждого contentInfo- сообщения которое хочет подписать сертификат?

Или не в ту сторону мыслю совсем?)

Отредактировано пользователем 2 ноября 2009 г. 17:03:47(UTC)  | Причина: Не указана

Offline Челпанов А.  
#3 Оставлено : 2 ноября 2009 г. 17:26:04(UTC)
Челпанов А.

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

Группы: Участники
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 390
Мужчина
Откуда: КриптоПро

Поблагодарили: 2 раз в 2 постах
1. Никто не подписывает зашифрованный текст. Обычно проставляют подписи, а потом зашифровывают. Зашифрование обычно производят на время пересылки документа. Пример подписи и последующего зашифрования EnvelopedSigned.* .
2. Есть два основных вида подписи.
- подпись текста
- соподпись (подпись подписи).
В обоих случаях подписывать можно многократно. В любом случае подписываемый текст остается неизменным. И при каждой следующей подписи можно проверять предыдущую. Соподпись используется очень редко.
3. Если Вы создадите SignedCms по уже подписанному документу (как Вы делаете при проверке), и добавите еще одного CmsSigner с его подписью, то подпись первого останется правильной. Хранить нужно весь CMS просто в качестве содержимого надо брать именно содержимое, а не весь подписанный CMS.
С уважением, Александр.
Offline Dennisw  
#4 Оставлено : 2 ноября 2009 г. 17:44:34(UTC)
Dennisw

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

Группы: Участники
Зарегистрирован: 15.10.2009(UTC)
Сообщений: 49
Откуда: CHL

Да безусловно сначало подписываю документ потом шифрование (возможно что то не так написал)
Получается что когда выполняется команда signedCms.Encode() при подписывании - на самом деле в файл добавляется подпись электронная - само содержимое не меняется?

т.е. я могу подготовить файл таким образом

1. Собрать в файл все подписи для документа
2. Добавить в файл содержимое документа
3. Провести шифрование

на выходе получить зашифрованное сообщение для переписки + подписи людей которые пожелали поучавствовать в электронной подписи для документа?
Offline Dennisw  
#5 Оставлено : 2 ноября 2009 г. 17:50:53(UTC)
Dennisw

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

Группы: Участники
Зарегистрирован: 15.10.2009(UTC)
Сообщений: 49
Откуда: CHL

EnvelopedSigned пример на этапе подписи тоже идет кодирование:
Код:
        ByVal signerCert As X509Certificate2) As Byte()
        ' Создаем объект ContentInfo по сообщению.
        ' Это необходимо для создания объекта SignedCms.
        Dim ContentInfo As ContentInfo = New ContentInfo(msg)

        ' Создаем объект SignedCms по только что созданному
        ' объекту ContentInfo.
        ' SubjectIdentifierType установлен по умолчанию в 
        ' IssuerAndSerialNumber.
        ' Свойство Detached установлено по умолчанию в false, таким 
        ' образом сообщение будет включено в SignedCms.
        Dim signedCms As SignedCms = New SignedCms(ContentInfo)

        ' Определяем подписывающего, объектом CmsSigner.
        Dim cmsSigner As CmsSigner = New CmsSigner(signerCert)

        ' Подписываем CMS/PKCS #7 сообение.
        Console.Write("Вычисляем подпись сообщения для субъекта " & _
            "{0} ... ", signerCert.SubjectName.Name)
        signedCms.ComputeSignature(cmsSigner)
        Console.WriteLine("Успешно.")

        ' Кодируем CMS/PKCS #7 сообщение.
        Return signedCms.Encode()


опять же для одного сертификата или же это кодирование подписи?
Offline Челпанов А.  
#6 Оставлено : 2 ноября 2009 г. 18:05:29(UTC)
Челпанов А.

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

Группы: Участники
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 390
Мужчина
Откуда: КриптоПро

Поблагодарили: 2 раз в 2 постах
Цитата:
Получается что когда выполняется команда signedCms.Encode() при подписывании - на самом деле в файл добавляется подпись электронная - само содержимое не меняется?

В SignedCms содержится подписываемый тест, собственно подписи, подписываемые атрибуты, неподписываемые атрибуты и др. Огрубляя, при вызове функции ComputeSignature подписывается только текст и подписываемые атрибуты, другие подписи не подписываются. Функция encode (decode) - кодирует (декодирует) это все в одну байтовую последовательность (текст, подписи, атирибуты...). При проверке подписи из декодированного сообщения выбирается то что подписывалось - текст и подписываемые атрибуты, другие подписи так же не участвуют в проверке.
С уважением, Александр.
Offline Челпанов А.  
#7 Оставлено : 2 ноября 2009 г. 18:11:01(UTC)
Челпанов А.

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

Группы: Участники
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 390
Мужчина
Откуда: КриптоПро

Поблагодарили: 2 раз в 2 постах
С уважением, Александр.
Offline Dennisw  
#8 Оставлено : 3 ноября 2009 г. 10:52:17(UTC)
Dennisw

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

Группы: Участники
Зарегистрирован: 15.10.2009(UTC)
Сообщений: 49
Откуда: CHL

все равно не понятно Александр - если есть возможность, можно примерчик что бы наглядно для задачи
1. есть файлик (или текст)
2. Файлик или текст подписывается 1м пользователем (после подписывания сохраняется на диск)
3. Уже подписанный файлик подписывается 2м пользователем (после подписывания сохраняется на диск)
4. открываем файлик и видим что у него стоит 2е подписи.

Если такое возможно конечно.

просто затык в том что все примеры показывают конечный результат после подписывания и заканчиваются signedCms.Encode
в случае нескольких подписей опять же подразумевается наличие в коллекции всех сертификатов для подписи и он по циклу их прогоняет и подписывает опять же все в рамках одной области signedCms. А как сделать так что бы подписать - сохранить подпись + подписать еще раз - опять сохранить и потом увидеть в сохраненном что файл имеет 2е подписи.

Я может задаю какие то тривиальные вопросы) которые всем уже понятны)). Но хочется разобраться
Offline Челпанов А.  
#9 Оставлено : 3 ноября 2009 г. 22:57:16(UTC)
Челпанов А.

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

Группы: Участники
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 390
Мужчина
Откуда: КриптоПро

Поблагодарили: 2 раз в 2 постах
AddSign.cs добавление подписи в уже подписанный CMS
Verify.cs проверка подписей в CMS (все что найдет)
Вложение(я):
AddSign.cs (6kb) загружен 85 раз(а).
Verify.cs (7kb) загружен 58 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
С уважением, Александр.
Offline Dennisw  
#10 Оставлено : 4 ноября 2009 г. 0:46:31(UTC)
Dennisw

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

Группы: Участники
Зарегистрирован: 15.10.2009(UTC)
Сообщений: 49
Откуда: CHL

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