首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解密OpenPGP会话密钥

解密OpenPGP会话密钥
EN

Stack Overflow用户
提问于 2017-10-05 22:26:59
回答 1查看 2.1K关注 0票数 0

我有一个使用GPG加密的文件,我希望从中提取会话密钥,这样我就可以单独解密会话密钥。我使用Bouncy城堡来使用以下代码提取会话密钥:

代码语言:javascript
复制
private static void outputSessionKey(String path) throws FileNotFoundException, IOException {
    BCPGInputStream input = new BCPGInputStream(PGPUtil.getDecoderStream(new FileInputStream(path)));
    Packet packet;
    while((packet = input.readPacket()) != null) {
        if (packet instanceof PublicKeyEncSessionPacket) {
            PublicKeyEncSessionPacket encPacket = (PublicKeyEncSessionPacket) packet;
            byte[] encKey = encPacket.getEncSessionKey()[0];
            FileOutputStream output = new FileOutputStream("session_key_enc.bin");
            output.write(encKey);
            output.close();
         }
     }

    input.close();
}

然后使用以下OpenSSL命令解密会话密钥:

代码语言:javascript
复制
openssl rsautl -decrypt -in session_key_enc.bin -out session_key_dec.bin -inkey private.pem -raw

我希望原始输出现在是解密的会话密钥,但我无法使用它来使用-重写-会话密钥来解密原始文件。

有人知道这个设置会有什么问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-07 02:20:37

我认为有两件事(至少)应该出错。

(0)您显然假定所使用的密钥(和算法)是RSA,这不是PGP和GPG使用的唯一加密算法。

(1) PublicKeyEncSessionPacket.getEncSessionKey()的元素(S)是MPInteger.getEncoded()的结果,即rfc4880 sec 3.2编码的结果,该编码是一个两个八进制位长,然后是实际值八进制。当写入这个值时,对于RSA解密来说应该太大了,而且rsautl -decrypt应该给出了一个错误,至少假设您使用的是正确的密钥。

(2) PGP的RSA加密采用PKCS1-v1_5 (02型)填充。在纠正(1)之后,您需要使用默认的-pkcs,而不是-raw

这些变化对我来说很管用。注意,按照第5.1节,RSA加密密钥块m由一个八进制对称算法、实际密钥和两个八进制校验和组成;前两个由冒号分隔,第三个不包含在GPG的会话密钥中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46595699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档