smime-用java解密pem编码文件

wfsdck30  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(303)

我试图用java解码一个pem编码的文件。有一个非常类似的问题已经公布,但它是为der编码的文件,而不是pem编码的文件。
openssl-java解密
这里使用的cmsendevelopedDataParser似乎不适合我的工作。我可以用什么来代替?我正努力在网上找到一个可行的例子。任何片段都将不胜感激。
要重现问题,只需执行以下步骤。

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
pu82cl6c

pu82cl6c1#

pem格式(现在实际的pem已经消失了)大部分(包括这里)是用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

或者你自己做的q&d方法是这样的:

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

相关问题