当前位置: 首页 > 知识库问答 >
问题:

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

萧麒
2023-03-14

我有一个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 rsautl -decrypt -in session_key_enc.bin -out session_key_decoded.bin -inkey private.pem

其中session_key_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_key_enc.bin时,我发现该文件是258字节。考虑到我使用的是2048位RSA密钥,并且规范指示加密的会话密钥是由n调制的,这似乎是不可能的:

共有1个答案

曹成双
2023-03-14

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

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

 类似资料:
  • 问题内容: 我正在写一种加密会话密钥的方法。它需要这样做,以便可以通过已成功测试的其他程序解密密钥。解密程序无法更改。我受困的是使我的加密工作与解密例程保持一致。 首先让我给出解密例程。请记住,这不能改变: 这是我正在编写的加密例程。我生成base64编码的文本,但最终无法解密。值得注意的是,我已验证解密例程正确获取了加密例程的结果(两者之间没有握手问题)。 我真的被卡住了。任何帮助表示赞赏。谢谢

  • 我目前正在用java编写一个加密消息传递服务,我使用的是bouncycastle PGP库。我编写了一个生成密钥对的测试程序,并对消息进行加密/解密。这已经工作了一段时间,但它最近在解密阶段停止了,给了我一个InvalidKeyException。 我做了一些研究,下载了JCE.jar文件,并将它们导入到我的项目中(通过Eclipse Project->Properties->add extern

  • 在SSO的实现中,我使用了bouncycastle(JAVA)进行签名、加密、解密和签名的验证。我有原始PGP公钥和私钥,我需要将它们存储在Java Keystore中。这些PGP公钥没有证书。 我知道对于公钥(根据Keystore的javadoc:http://docs.oracle.com/javase/6/docs/api/java/security/keystore.html),我必须创建

  • 我一直在尝试使用BouncyCastle库来进行PGP加密/解密。我有一些代码需要修改,以便只使用流-不使用文件。 我尝试移除pgputilities.writeFileToliteralData(),然后让它返回一个流,但没有成功(输出流为空)。 这里更明确的是方法应该是什么: 下面是我需要修改的代码:

  • 我需要在C#中加密数据,以便将其传递给Java。Java代码属于第三方,但我得到了相关的源代码,因此我决定,由于Java使用Bouncy Castle库,所以我将使用C#端口。 解密工作正常。但是,解密仅在使用私钥使用encrypt时有效,而不是使用公钥。使用公钥时,解密失败,出现。 编辑: 我还添加了一个单元测试,它证明公钥等于从私钥中提取的公钥:

  • 因为我是加密概念的新手。我想做的是一个应用程序,它发送的数据是用AES对称技术加密的。另外,我还需要将我以前使用非对称RSA技术加密的密钥以加密格式发送到另一边。我已经完成了使用AES对称加密技术使用256位密钥的加密,现在我已经加密数据,密钥,和启动矢量(IV)在字节。当我试图解密时,我知道起始向量也需要得到准确的数据。 现在我的问题是 C#中的AES解密代码: 我在C#中的非对称代码