【问题标题】:Decrypt OpenPGP Session Key解密 OpenPGP 会话密钥
【发布时间】:2018-03-17 16:01:13
【问题描述】:

我有一个使用 GPG 加密的文件,我想从中提取会话密钥,以便单独解密会话密钥。我正在使用 Bouncy Castle 使用以下代码提取会话密钥:

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 命令解密会话密钥:

openssl rsautl -decrypt -in session_key_enc.bin -out session_key_dec.bin -inkey private.pem -raw

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

有人知道这个设置可能出了什么问题吗?

【问题讨论】:

    标签: cryptography rsa bouncycastle gnupg openpgp


    【解决方案1】:

    我看到两件事(至少)应该出错。

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

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

    (2) PGP 的 RSA 加密使用 PKCS1-v1_5(类型 02)填充。更正(1)后需要使用默认的-pkcs而不是-raw

    通过这些更改,它对我有用。请注意,根据sec 5.1,RSA 加密的密钥块“m”由 1 个八位字节对称算法、实际密钥和 2 个八位字节校验和组成;前两个用冒号隔开,第三个不包含在 GPG 的 session-key 中。

    【讨论】:

    • 嗨,戴夫,感谢您的回答。为了解决您的观点: 0. 我不假设 GPG 使用 RSA,因为这是我设置的默认值。 1.我在帖子中没有提到这一点,但是我确实将前两个字节去掉以隔离加密密钥的字节。 2. 我会试试你的建议,看看它是否有效。我能够从原始字节中提取解密的密钥,但似乎存在小的差异
    猜你喜欢
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 2016-05-03
    • 2014-05-31
    • 1970-01-01
    • 2017-02-14
    相关资源
    最近更新 更多