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

在Java中刷新PGP加密的Bouncy Castle输出流

卫俊誉
2023-03-14

我正在开发一个概念验证Java应用程序,该应用程序从PGP加密的文件中读取一系列换行分隔的请求,处理这些请求,然后将响应写入另一个PGP加密的文件,在每次响应写入后进行刷新。

我已经成功地将Bouncy Castle 1.5与我的应用程序集成在一起,但我似乎无法刷新命令的输出:

private ArmoredOutputStream armoredOut = null;
private OutputStream compressedOut = null;
private OutputStream encryptedOut = null;

public OutputStream encryptStream(OutputStream outputStream){
    OutputStream literalOut = null;
    try{
        armoredOut = new ArmoredOutputStream(outputStream);
        BcPGPDataEncryptorBuilder dataEncryptor = new BcPGPDataEncryptorBuilder(PGPEncryptedData.AES_256);
        dataEncryptor.setSecureRandom(new SecureRandom());
        PGPEncryptedDataGenerator encryptGen = new PGPEncryptedDataGenerator(dataEncryptor);

        PGPPublicKey publicKey = null;
        InputStream publicKeyStream = null;
        try{
            publicKeyStream = this.getClass().getClassLoader().getResourceAsStream(keyName);
            publicKey = getEncryptionKey(publicKeyStream);
        }
        finally{
            if(publicKeyStream != null){
                publicKeyStream.close();
            }
        }
        if(publicKey == null){
            throw new IllegalArgumentException("Couldn't obtain public key.");
        }

        encryptGen.addMethod(new BcPublicKeyKeyEncryptionMethodGenerator(publicKey));

        encryptedOut = encryptGen.open(armoredOut, new byte[bufferSize]);

        PGPCompressedDataGenerator compressGen = new PGPCompressedDataGenerator(PGPCompressedData.ZIP);
        compressedOut = compressGen.open(encryptedOut);

        PGPLiteralDataGenerator literalGen = new PGPLiteralDataGenerator();
        literalOut = literalGen.open(compressedOut, PGPLiteralDataGenerator.UTF8, "Response", new Date(), new byte[bufferSize]);
    }
    catch(PGPException e){
        LOGGER.error(ExceptionUtils.getStackTrace(e));
    }
    catch(IOException e){
        LOGGER.error(ExceptionUtils.getStackTrace(e));
    }
    return literalOut;
}

当我显式html" target="_blank">调用flush()时,返回的OutputStream不会刷新。只有在对compressedOut、encryptedOut和armoredOut OutputStreams中的每一个调用close()方法时,它们才会被实际刷新。

我试图修改Bouncy Castle的源代码,但我所做的一切都导致某种形式的错误或损坏的PGP消息无法解密。我也尝试过修改缓冲区大小,使其更小、更大,以及单个请求的确切大小,但这没有奏效。

有没有人对如何用Bouncy Castle手动刷新加密的OutputStream有什么建议?

共有1个答案

申屠瀚海
2023-03-14

我和BC也有同样的问题。查看ArmoredOutputStream类。Flush为空,而close不调用它的底层输出流close。这意味着如果您正在使用ArmoredOutputStreamArmoredInputStream,您必须关闭ArmoredOutputStream本身和基础的OutputStream。同花顺也一样!

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

  • 这段代码的目的是在最终用户的机器上生成一个CSR,然后我对它进行签名,并用机器的MAC地址(和salt)对它进行加密,这样程序就只能在授权的机器上运行,而且只有授权的机器才能访问我的PostgreSql数据库。 建议?

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

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

  • 我试图使用java BouncyCastle库解密和验证PGP消息,但遇到了一些问题,抱怨PartialInputStream过早结束。 我知道encrypt工作得很好,因为我可以在命令行上使用gpg解密和验证使用encrypt函数创建的消息。

  • 我正在尝试编写一个加密文件,它将使用gpg解密,并将以增量方式写入行,而不是在一个块中。我已经在GnuPG中生成了密钥,并且正在使用公钥加密。下面是我正在使用的加密方法: 我有一个小的原型测试类来使用这种方法: 我怎样才能修改这段代码,使它既能加密两行,又能让GnuPG解密它们呢?