让GPG解密在Java中工作(充气城堡)
让我先说一下,我对这一切非常陌生。我试图做的是从Java中使用gpg来解密加密文件。
我成功做到了:
让一位同事使用我的公钥和他的私钥加密文件并成功解密。
走了另一条路
让另一位同事尝试解密一个不适合他的文件:失败(如预期的那样)
我的密钥是像这样生成的...
(gpg --版本告诉我我使用的是1.4.5,而我使用的是充气城堡1.47)
gpg --gen-ley
选择选项“DSA和Elgamal(默认)”
填写其他字段并生成密钥。
该文件是使用我的公钥和另一个人的私钥加密的。我想解密它。我编写了以下 Java 代码来实现此目的。我正在使用几个已弃用的方法,但我不知道如何正确实现使用未弃用版本所需的工厂方法,因此,如果有人对我应该使用的那些方法的实现有所了解,那将是一个不错的奖励。
Security.addProvider(new BouncyCastleProvider());
PGPSecretKeyRingCollection secretKeyRing = new PGPSecretKeyRingCollection(new FileInputStream(new File("test-files/secring.gpg")));
PGPSecretKeyRing pgpSecretKeyRing = (PGPSecretKeyRing) secretKeyRing.getKeyRings().next();
PGPSecretKey secretKey = pgpSecretKeyRing.getSecretKey();
PGPPrivateKey privateKey = secretKey.extractPrivateKey("mypassword".toCharArray(), "BC");
System.out.println(privateKey.getKey().getAlgorithm());
System.out.println(privateKey.getKey().getFormat());
PGPObjectFactory pgpF = new PGPObjectFactory(
new FileInputStream(new File("test-files/test-file.txt.gpg")));
Object pgpObj = pgpF.nextObject();
PGPEncryptedDataList encryptedDataList = (PGPEncryptedDataList) pgpObj;
Iterator objectsIterator = encryptedDataList.getEncryptedDataObjects();
PGPPublicKeyEncryptedData publicKeyEncryptedData = (PGPPublicKeyEncryptedData) objectsIterator.next();
InputStream inputStream = publicKeyEncryptedData.getDataStream(privateKey, "BC");
因此,当我运行此代码时,我了解到我的算法和格式对于我的密钥如下:
算法: DSA 格式: PKCS#8
然后它在最后一行中断:
Exception in thread "main" org.bouncycastle.openpgp.PGPException: error setting asymmetric cipher
at org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyDataDecryptorFactoryBuilder.decryptSessionData(Unknown Source)
at org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyDataDecryptorFactoryBuilder.access$000(Unknown Source)
at org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyDataDecryptorFactoryBuilder$2.recoverSessionData(Unknown Source)
at org.bouncycastle.openpgp.PGPPublicKeyEncryptedData.getDataStream(Unknown Source)
at org.bouncycastle.openpgp.PGPPublicKeyEncryptedData.getDataStream(Unknown Source)
at org.bouncycastle.openpgp.PGPPublicKeyEncryptedData.getDataStream(Unknown Source)
at org.bouncycastle.openpgp.PGPPublicKeyEncryptedData.getDataStream(Unknown Source)
at TestBouncyCastle.main(TestBouncyCastle.java:74)
原因: java.security.InvalidKeyException: unknown key type 传递给 ElGamal at org.bouncycastle.jcajce.provider.asymmetric.elgamal.CipherSpi.engineInit(Unknown Source) at org.bouncycastle.jcajce.provider.asymmetric.elgamal.CipherSpi.engineInit(Unknown Source) at javax.crypto.Cipher.init(DashoA13*..) at javax.crypto.Cipher.init(DashoA13*..) ...8更多
我在这里接受很多建议,从“不要使用gpg,而是使用x”到“不要使用充气城堡,而是使用x”,再到介于两者之间的任何东西。谢谢!