Извлечение зашифрованного ключа сеанса из CMS Enveloped данных с использованием bouncycastle - PullRequest
0 голосов
/ 28 октября 2019

Я работаю над проектом (Java), и требование говорит, что мы должны расшифровать конверт CMS от третьей стороны. Закрытый ключ, соответствующий этому открытому ключу, хранится в HSM и не подлежит экспорту. Поэтому все, что мне нужно сделать, это извлечь зашифрованный сеансовый ключ из CMS Envelope и расшифровать его, а затем использовать расшифрованный сеансовый ключ для дешифрования содержимого. План звучит просто, только проблема в том, что я не могу понять, как извлечь зашифрованный сеансовый ключ, и если в надежном замке есть способ, при котором, если я предоставлю дешифрованный сеансовый ключ, он дешифрует сам контент, как это происходит с программными клавишами.

1 Ответ

0 голосов
/ 29 октября 2019

Спасибо, Джеймс, за то, что указал мне на тестовые случаи, я не нахожу ничего в пакете pkix, но в базовом пакете это тестовые случаи, которые мне очень помогли. Я могу извлечь ключ сеанса и зашифрованные данные, используя эти библиотеки.

        ContentInfo info = ContentInfo.getInstance(ASN1Primitive.fromByteArray(encryptedData));
        EnvelopedData envData = EnvelopedData.getInstance(info.getContent());
        ASN1Set s = envData.getRecipientInfos();
        RecipientInfo recipientInfo = RecipientInfo.getInstance(s.getObjectAt(0));
        byte[] encryptedKey;
        if (recipientInfo.getInfo() instanceof KeyTransRecipientInfo) {
            KeyTransRecipientInfo keyTransRecipientInfo = KeyTransRecipientInfo.getInstance(recipientInfo.getInfo());
            encryptedKey = keyTransRecipientInfo.getEncryptedKey().getOctets();
            AlgorithmIdentifier keyEncryptionAlgorithm = keyTransRecipientInfo.getKeyEncryptionAlgorithm();
            logger.info("Assymetric Encryption Algorithm : {}", keyEncryptionAlgorithm.getAlgorithm().getId());
            logger.info("Octet  encrypted Key            : {}", Hex.toHexString(encryptedKey));
        } else {
            throw new IllegalStateException("expected KeyTransRecipientInfo");
        }
        AlgorithmIdentifier contentEncryptionAlgorithm = envData.getEncryptedContentInfo().getContentEncryptionAlgorithm();
        logger.info("Symmetric Encryption Algorithm  : " + contentEncryptionAlgorithm.getAlgorithm().getId());
        logger.info("Octect Encrypted data           : " + Hex.toHexString(envData.getEncryptedContentInfo().getEncryptedContent().getOctets()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...