Тип "подпись", которую вы используете, основан на CMS (ранее известный как "PKCS # 7"). Это стандартный формат для инкапсуляции некоторых данных с помощью шифрования или подписи или и того, и другого; это рекурсивно, поэтому вы можете вложить несколько уровней.
Объект CMS является ContentInfo
структурой, определенной с помощью этой части ASN.1:
ContentInfo ::= SEQUENCE {
contentType ContentType,
content [0] EXPLICIT ANY DEFINED BY contentType }
ContentType ::= OBJECT IDENTIFIER
Когда объект описывает подписи, то contentType
поля содержит идентификатор для подписанных данных» », а content
представляет собой структуру SignedData
, определенную как:
SignedData ::= SEQUENCE {
version CMSVersion,
digestAlgorithms DigestAlgorithmIdentifiers,
encapContentInfo EncapsulatedContentInfo,
certificates [0] IMPLICIT CertificateSet OPTIONAL,
crls [1] IMPLICIT RevocationInfoChoices OPTIONAL,
signerInfos SignerInfos }
Фактическая криптографической подписи в signerInfos
объекта, в то время как encapContentInfo
может содержать данные, которые подписали. Это важный момент. EncapsulatedContentInfo
структура:
EncapsulatedContentInfo ::= SEQUENCE {
eContentType ContentType,
eContent [0] EXPLICIT OCTET STRING OPTIONAL }
Смотрите "OPTIONAL
"? Это означает, что объект CMS может содержать или не содержать данные, которые подписаны.
Когда объект CMS содержит данные, подписанные, то вы в конечном итоге с одного объектом, закодированным в виде массива байт (это точка с помощью ASN.1: все эти объекты могут быть закодированы и декодируются по желанию). С другой стороны, если объект CMS делает , а не содержит данные, которые подписаны, то это отдельная подпись. Конечно, подтверждение подписи не может быть выполнено без копии данных, которые должны быть подписаны, поэтому, если подпись «отключена», тогда должен быть какой-то другой способ передачи самих данных в верификатор.
Отдельные подписи популярны в контексте криптографически защищенных электронных писем с помощью S/MIME (S/MIME можно охарактеризовать как «объект CMS в сообщениях электронной почты»), поскольку выделенная подпись затем отправляется как прикрепленный файл электронной почты, оставляя текст электронной почты содержимое нетронутым: таким образом, содержимое электронной почты все еще может быть прочитано программным обеспечением, которое полностью не знает, что может быть S/MIME, и не сможет извлечь данные из объекта CMS-данных.
В вашем случае вы должны производить все, что потребуется верификатору для выполнения своей работы. Это должно быть уже определено в протоколе, который вы в настоящее время реализуете. Возможно, протокол может сказать вам, что данные, которые должны быть подписаны, уже доступны верификатору через другой канал; или он может сказать вам, что вы должны использовать незакрепленный объект CMS, подписанный.
Если нет четко определенного протокола, и вы делаете это, как вы идете, то это рецепт катастрофы. Я очень надеюсь, что это не так. Криптография трудно использовать, главным образом потому, что нет возможности проверить, правильно ли вы это сделали.