Хочу собрать PKCS#7 EnvelopedData, не пользуясь для этого высокоуровневыми функциями CAPI 2.0.
При этом у меня возникли вопросы по правильности заполнения следующих элементов ASN.1 структуры (поскольку остальные данные у меня не вызывают сомнений):
GostR3410-KeyTransport ::= SEQUENCE {
sessionEncryptedKey Gost28147-89-EncryptedKey,
transportParameters
[0] IMPLICIT GostR3410-TransportParameters OPTIONAL
}
Gost28147-89-EncryptedKey ::= SEQUENCE {
encryptedKey Gost28147-89-Key,
macKey Gost28147-89-MAC
}
GostR3410-94-TransportParameters ::= SEQUENCE {
encryptionParamSet OBJECT IDENTIFIER,
ephemeralPublicKey SubjectPublicKeyInfo OPTIONAL,
ukm OCTET STRING
}
EncryptedContentInfo ::= SEQUENCE {
contentType ContentType,
contentEncryptionAlgorithm GOST28147-89-AlgorithmIdentifier,
encryptedContent [0] IMPLICIT EncryptedContent OPTIONAL
}
Поля выше приведенных структур заполняю следующим образом:
Для Gost28147-89-EncryptedKey
encryptedKey = CRYPT_SIMPLEBLOB.bEncryptedKey;
macKey = CRYPT_SIMPLEBLOB.bMacKey;
Для GostR3410-94-TransportParameters
encryptionParamSet = “1.2.643.2.2.31.1”; // соответствует CRYPT_SIMPLEBLOB.encryptionParamSet
SubjectPublicKeyInfo.AlgorithmIdentifier.algorithmOID = “1.2.643.2.2.19”;
SubjectPublicKeyInfo.AlgorithmIdentifier.Parameters[1] = “1.2.643.2.2.36.0”;
SubjectPublicKeyInfo.AlgorithmIdentifier.Parameters[2] = “1.2.643.2.2.30.1”;
SubjectPublicKeyInfo.PublicKey = [массив байт эфемерного ключа]; // 64 байт
ukm = CRYPT_SIMPLEBLOB.bSV;
Для EncryptedContentInfo
EncryptedContentInfo.contentType=”1.2.840.113549.1.7.1”;
EncryptedContentInfo.GOST28147-89-AlgorithmIdentifier.identifier=”1.2.643.2.2.21”;
EncryptedContentInfo.GOST28147-89-AlgorithmIdentifier.Parameters.iv=[ вектор инициализации, массив байт, который возвращает функция
CryptGetKeyParam(hSessionKey,KP_IV,pbIV,&cbIV,0) ]
EncryptedContentInfo.GOST28147-89-AlgorithmIdentifier.Parameters.oid=”1.2.643.2.2.31.1”;
EncryptedContentInfo = [зашифрованный контент, CryptEncrypt]
После формирования файла со структурой PKCS#7, я его пробую расшифровать функцией CryptDecryptMessage, которая возвращает мне ошибку ERROR_INVALID_PARAMETER.
Если же для расшифрования я использую функцию CryptDecrypt, то сообщение расшифровывается нормально. Подозрение падает на следующие данные: encryptedKey, macKey, ukm, iv. Пробовал менять последовательность байт, но результат все равно отрицательный. Может ли кто-нибудь разъяснить, как правильно сохранять данные для указанных полей: encryptedKey, macKey, ukm, iv?
Спасибо.
Вложение(я):

example.p7
(1kb) загружен 25 раз(а).У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.