У меня есть только открытый ключ RSA для получателя, а не весь сертификат X509
В KeyTransRecipientInfo структуре CMS EnvelopedData можно использовать значение SubjectKeyIdentifier иногда присутствует в сертификате X.509 / PKIX как расширение , а Bouncy имеет перегруженный ctor для этого случая .Поскольку у вас нет сертификата, вам придется выяснить, какой метод использовался для расчета значения в сертификате (-ах), если получатель (-и) будут использовать сертификат, или пробовать разные догадки, пока не найдете его.это работает, или, если вы контролируете получателя (ей), просто выберите некоторые значения, которые он (они) примет.
org.bouncycastle.cert.X509ExtensionUtils и его два подкласса предоставляют методы для вычисления двух стандартных схем, но я нахожу их не более удобными, чем делать это напрямую.
В настоящее время мы используем ... AES / CTS / NoPadding ... и в классе CMSAlgorithm я не вижу никакой опции CTS
Это не только то, что в CMSAlgorithm.Существуют два соответствующих фактора:
любой конкретный шифр (в терминах JCA, преобразование), используемый в CMS / PKCS7. EnvelopedData должен идентифицироваться OID и условно параметрами
шифр, используемый для данного сообщения, должен поддерживаться отправителем и получателем или всеми получателями.
org.bouncycastle.cms.CMSAlgorithm это просто удобный сборник шифров и некоторых других вещей, таких как ключевые соглашения, которые имеют стандартизированные OID и реализуются BC, последний из которых фактически контролируется org.bouncycastle.cms.jcajce.EnvelopedDataHelper или нативный эквивалент , который, как вы можете видеть, поддерживает только режим CBC для поддерживаемых блочных шифров.(Оба также поддерживают RC4, но в качестве потокового шифра он не использует никакой режим. Плюс RC4 теперь очень непопулярен.)
Я не припоминаю, чтобы когда-либо видел какой-либо стандартизированный OID для шифра в режиме CTS.Если это правильно, вам придется выделить один, и, поскольку никто другой не будет реализовывать этот OID, ваши сообщения не будут взаимодействовать ни с кем.Если вы можете найти стандартный OID (или, по крайней мере, AlgId), который реализуют ваши коллеги, для BC вам придется создать свой собственный класс, соответствующий (interface) OutputEncryptor
, что не так уж сложно, если выпосмотрите на приведенные выше источники, учитывая, что у вас есть провайдер или bc-native реализация базового шифра.