Openssl Bouncy Castle从公钥加密的会话数据包中提取PGP会话密钥

Openssl Bouncy Castle从公钥加密的会话数据包中提取PGP会话密钥,openssl,cryptography,bouncycastle,gnupg,openpgp,Openssl,Cryptography,Bouncycastle,Gnupg,Openpgp,我有一个PGP,我想从中提取会话密钥,以便可以单独解密会话密钥。我正在使用BouncyCastle库并提取会话密钥,如下所示: private static void outputSessionKey(String path) throws FileNotFoundException, IOException { BCPGInputStream input = new BCPGInputStream(PGPUtil.getDecoderStream(new FileInputStream

我有一个PGP,我想从中提取会话密钥,以便可以单独解密会话密钥。我正在使用BouncyCastle库并提取会话密钥,如下所示:

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_decoded.bin -inkey private.pem
其中,session\u key\u enc.bin是我以二进制格式加密的会话密钥,private.pem是我用于在GPG中加密数据的公钥的对应私钥。在加密数据之前,我将RSA密钥对的公钥部分转换为PGP格式的密钥,并将其导入GPG

运行OpenSSL命令时,出现以下错误:

RSA operation error
140624851898072:error:0406506C:rsa routines:RSA_EAY_PRIVATE_DECRYPT:data greater than mod len:rsa_eay.c:518:
在检查session\u key\u enc.bin时,我发现文件是258字节。考虑到我使用的是2048位RSA密钥,并且规范表明加密会话密钥由n修改,这似乎不可能:

RSA加密的算法特定字段 -RSA加密值m**e mod n的多精度整数(MPI)

上述公式中的值“m”是从会话密钥派生的 具体如下。首先,会话密钥的前缀是一个八位字节 指定对称加密的算法标识符 用于加密以下对称加密数据的算法 小包裹然后附加一个两个八位校验和,它等于 前一个会话密钥八位字节的总和,不包括算法 标识符,模65536。然后按照中所述对该值进行编码 [RFC3447]第7.2.1节中的PKCS#1块编码EME-PKCS1-v1_5至 形成上述公式中使用的“m”值。见第13.1节 本文档介绍OpenPGP使用PKCS#1的注意事项


任何关于如何解决这个难题的建议都将不胜感激,谢谢

发现Bouncy Castle使用MPI格式导出加密的会话密钥,其中前2个字节是长度。这解决了我无法解密会话密钥的原始问题,因为它是258字节而不是256字节


尽管仍然无法使用--override session key和现在解密的session key的原始字节对文件进行解密,但我仍将此问题标记为已回答。

是否已拆分数据包的前几个头字节(或确保Bouncy Castle已在这样做)
pgpdump-pi
还应将会话密钥打印为整数值,您应该能够将Java代码的结果与此结果进行比较。@JensErat原来Bouncy Castle以MPI格式输出会话密钥,前两个字节表示总边。在剥离这些之后,我能够解密会话密钥,但仍然无法从解码的原始字节中获得任何合理的密钥。您好,希望您提供有关设置bouncy castle以连接我的C客户端的建议。我正在尝试用bouncy设置后端口gnutls应用程序(mandos服务器)。任何帮助都将不胜感激