【问题标题】:openssl smime -decrypt PEM encoded file by Javaopenssl smime - 用 Ja​​va 解密 PEM 编码文件
【发布时间】:2018-12-06 20:43:46
【问题描述】:

我正在尝试使用 java 解码 PEM 编码文件。已经发布了一个非常相似的问题,但是它适用于 DER 编码文件,而不是 PEM 编码文件。

openssl -decrypt by Java

那里使用的 CMSEnvelopedDataParser 似乎不适合我的工作。我可以用什么代替?我正在努力在网上找到一个工作示例。任何 sn-p 将不胜感激。

要重现问题,只需按照以下步骤操作即可。

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

【问题讨论】:

    标签: java openssl


    【解决方案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 
    

    【讨论】:

    • 太完美了。谢谢戴夫!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 2016-05-18
    • 2012-07-09
    • 2018-12-05
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多