openssl smime -decrypt PEM-кодированный файл с помощью Java - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь декодировать файл в формате PEM, используя Java.Уже опубликован очень похожий вопрос, однако он касается файлов, закодированных с помощью DER, в отличие от файлов, закодированных с помощью PEM.

openssl -decrypt от Java

Используемый там CMSEnvelopedDataParser не подходит для моей работы.Что я могу использовать вместо этого?Я изо всех сил пытаюсь найти рабочий пример в Интернете.Любой фрагмент будет очень признателен.

Чтобы воссоздать проблему, можно просто выполнить следующие шаги.

openssl req -nodes -new -x509 -keyout private.pem -out cert.cert
openssl rsa -pubout -in private.pem -out public.pem 
openssl smime -encrypt -outform PEM -inkey public.pem -in text.txt -out text.txt.pem cert.cert

Тогда команда, которую я пытаюсь заменить на java, следующая:

openssl smime -decrypt -inform PEM -in text.txt.pem -out dec.txt -inkey private.pem

1 Ответ

0 голосов
/ 07 декабря 2018
Формат

PEM (теперь, когда фактический PEM пропал) в основном (в том числе и здесь) DER кодируется в base64 с разрывами строк и добавлением ----BEGIN x----- и -----END x----- строк;см. https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail.

Bouncy предоставляет группу связанных классов для обработки PEM:

org.bouncycastle.util.io.pem.PemObject obj = new org.bouncycastle.util.io.pem.PemReader(reader).readPemObject();
// where reader is a java.io.Reader that reads the PEM such as a FileReader on a file 
if( !obj.getType().equals("PKCS7") ) throw error; // or maybe CMS -- optional 
... CMSEnvelopedDataParser (obj.getContent()) and on from there

, или способ сделать это самостоятельно - это что-то вроде:

StringBuilder b64 = new StringBuilder();
try( Reader rdr = new BufferedReader (new FileReader (filename)) ){
    for( String line; (line = rdr.readLine()) != null; )
        if( !line.startsWith ("-----") ) b64.append (line);
        // else optionally check for errors?
} // or use a Stream/filter/collect if you prefer 
byte[] der = Base64.getDecoder().decode(pem);
... CMSEnvelopedDataParser (der) and on from there 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...