слишком большой ввод для шифра RSA - мне нужна рабочая альтернатива в оперативной памяти для расшифровки openssl cms - PullRequest
1 голос
/ 23 апреля 2019

У меня есть следующая команда openssl, которая прекрасно работает для расшифровки зашифрованного файла .mp3.bin с закрытым ключом RSA, который у меня есть:

openssl.exe cms -decrypt -inform DER -in {inFilePath} -binary -inkey {privateKey} -out {outFilePath}

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

Я посмотрел на надувной замок и другие опции, но не нашел ничего, что работает.У меня есть этот код, но он возвращает ошибку: «Необработанное исключение: Org.BouncyCastle.Crypto.DataLengthException: слишком большой ввод для шифра RSA».Сейчас я просто тестирую дешифрование файла в памяти, который уже находится на моей локальной машине.


AsymmetricKeyParameter privateKey = getPrivateKey(privateKeyFileName);
RsaEngine e = new RsaEngine();
e.Init(false, privateKey);
byte[] decryptedAudioFile = File.ReadAllBytes(binFileName);
byte[] decrypted = e.ProcessBlock(decryptedAudioFile, 0, decryptedAudioFile.Length);

static AsymmetricKeyParameter getPrivateKey(string privateKeyFileName)
        {
            AsymmetricCipherKeyPair keyPair;
            using(var reader = File.OpenText(privateKeyFileName))
            {
                keyPair = (AsymmetricCipherKeyPair)new PemReader(reader).ReadObject();
            }
            return keyPair.Private;
        }

Я не совсем уверен, почему из-за ошибки вводится слишком большой ввод для ключа RSA, поскольку онработает с ранее упомянутой командой openssl cms, может кто-нибудь помочь?Дайте мне знать, если что-то неясно, пожалуйста!

1 Ответ

2 голосов
/ 24 апреля 2019

Вы должны использовать библиотеки CMS Bouncy Castle для такого рода расшифровки. RSA, используемый в CMS, - это не просто RSA, это RSA + AES в структуре контейнера. Ищите CmsEnvelopedDataParser, чтобы получить больше информации.

Обратите внимание, что CMS также напрямую поддерживается Microsoft API, в этом случае ищите EnvelopedCms.

В настоящее время вы напрямую используете RSA, который на самом деле не может использоваться напрямую - и определенно не практичен - для больших объемов данных.


Мне немного сложно настроить Bouncy C #, но, возможно, если я дам вам исходный код на Java, вы сможете использовать в основном те же классы в C #. Самым большим трюком является обработка ключа / Receipient, возможно.

<code>/**
 * <pre>
 * openssl genrsa -out rsaprivkey.pem 2048
 * openssl pkcs8 -topk8 -nocrypt -in rsaprivkey.pem -out privkey.pem 
 * openssl req -x509 -key privkey.pem -out encrypt.cer 
 * openssl cms -encrypt -binary -in plain.txt -outform DER -out enveloped.p7 encrypt.cer
 * openssl cms -decrypt -binary -inform DER -in enveloped.p7 -out decrypted_openssl.txt -inkey privkey.pem
 * 
* * @author maartenb * / открытый класс DecryptRSACms { частная статическая пустота выдает IOException, CMSException { byte [] encryptedData = Files.readAllBytes (encrypted.toPath ()); CMSEnvelopedDataParser parser = новый CMSEnvelopedDataParser (encryptedData); RecipientInformation recInfo = getSingleRecipient (parser); Получатель получателя = новый JceKeyTransEnvelopedRecipient (privateKey); try (InputStream decryptedStream = recInfo.getContentStream (получатель) .getContentStream ()) { Files.copy (decryptedStream, decryptedDestination.toPath ()); } System.out.println (String.format ("Расшифровано"% s "в"% s "", encrypted.getAbsolutePath (), decryptedDestination.getAbsolutePath ())); } приватная статическая RecipientInformation getSingleRecipient (CMSEnvelopedDataParser parser) { Коллекция recInfos = parser.getRecipientInfos (). GetRecipients (); Iterator receientIterator = recInfos.iterator (); if (! receientIterator.hasNext ()) { бросить новое RuntimeException («Не удалось найти получателя»); } return (RecipientInformation) receientIterator.next (); } закрытая статическая RSAPrivateKey parsePrivateKey (файл privateKeyPEM) генерирует IOException, InvalidKeySpecException { PemObject readPemObject; try (PEMParser parser = new PEMParser (new FileReader (privateKeyPEM)))) { readPemObject = parser.readPemObject (); } System.out.println (readPemObject.getType ()); byte [] pkcs8KeyData = readPemObject.getContent (); PKCS8EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec (pkcs8KeyData); KeyFactory kf; пытаться { kf = KeyFactory.getInstance ("RSA"); } catch (NoSuchAlgorithmException e) { бросить новое RuntimeException (e); } PrivateKey privKey = kf.generatePrivate (privKeySpec); return (RSAPrivateKey) privKey; } public static void main (String [] args) выдает Exception { RSAPrivateKey rsaPrivateKey = parsePrivateKey (новый файл (args [0])); расшифровать (rsaPrivateKey, новый файл (args [1]), новый файл (args [2])); } }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...