我想使用BouncyCastle从Java解密GPG文件。我发现的所有示例都需要密码,但这不适用于我们的用例。可以使用以下命令从命令提示符解密文件:
gpg --output test.csv.zip --decrypt test.csv.zip.gpg
对公钥和私钥使用gpg --import
后,这是有效的。
我怎么能用BouncyCastle做到这一点?我是否需要公钥,因为我想我只需要私钥进行解密?
答案 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 后,文件可以毫无问题地解密,密码为空。