如何使用BouncyCastle解密GPG文件而不使用密码短语

时间:2017-02-13 14:01:05

标签: java bouncycastle gnupg

我想使用BouncyCastle从Java解密GPG文件。我发现的所有示例都需要密码,但这不适用于我们的用例。可以使用以下命令从命令提示符解密文件:

gpg --output test.csv.zip --decrypt test.csv.zip.gpg

对公钥和私钥使用gpg --import后,这是有效的。

我怎么能用BouncyCastle做到这一点?我是否需要公钥,因为我想我只需要私钥进行解密?

2 个答案:

答案 0 :(得分:0)

根据这个(希望没有过时)example,你应该能够做到这一点。

RSADecryption rsaDecryption = new RSADecryption();
privateKeyFilename = args[0].trim();
encryptedData = args[1].trim();
rsaDecryption.decrypt(privateKeyFilename, encryptedData);

该示例希望您传递两个参数;第一个是私钥文件名;然后将加密数据作为字符串。可能不完全是你想要的,但足以让你前进。

如果不这样做,你可以查看给出here的更复杂的例子。

答案 1 :(得分:0)

如果有人仍然面临同样的问题,这可能会有所帮助。我试图在没有密码短语的情况下解密文件(它是一个空字符串),但我在类 org.bouncycastle.openpgp.PGPSecretKey 中遇到错误

public PGPPrivateKey extractPrivateKey(
        PBESecretKeyDecryptor decryptorFactory)

例外情况如下:

Exception in thread "main" java.lang.NoSuchMethodError: org.bouncycastle.util.BigIntegers.modOddInverse(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/math/BigInteger;
    at org.bouncycastle.bcpg.RSASecretBCPGKey.<init>(Unknown Source)
    at org.bouncycastle.openpgp.PGPSecretKey.extractPrivateKey(Unknown Source)
    at com.hp.etl.pipeline.utils.pgptool.KeyFilesOperationsPgpImpl.getPrivateKey(KeyFilesOperationsPgpImpl.java:318)
    at com.hp.etl.pipeline.utils.pgptool.PGPDecryptor.decrypt(PGPDecryptor.java:134)
    at com.hp.etl.pipeline.utils.PGPUtils.decryptRoutine(PGPUtils.java:107)
    at com.hp.etl.pipeline.utils.PGPUtils.decryptPGPFile(PGPUtils.java:56)
    at com.hp.etl.pipeline.connectors.sftp.SFTPConnector.getPGPDecryptedFiles(SFTPConnector.java:392)
    at com.hp.etl.pipeline.connectors.sftp.SFTPConnector.downloadFiles(SFTPConnector.java:292)
    at com.hp.etl.pipeline.connectors.sftp.SFTPConnector.retrieveS3FileNames(SFTPConnector.java:235)
    at bmttest.BMTTest.main(BMTTest.java:90)

我使用的是 Maven 工件 org.bouncycastle » bcpg-jdk15on version 1.68,在将 Maven 工件降级到 version 1.63 后,文件可以毫无问题地解密,密码为空。