我正在尝试使用Java解码PEM编码的文件。已经发布了一个非常类似的问题,但是它是针对DER编码的文件,而不是PEM编码的文件。
在那里使用的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
答案 0 :(得分:1)
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