首先让我说我对这一切都非常陌生。我想要做的是在 Java 中使用 gpg 来解密加密文件。
我成功完成的事情:
让一位同事使用我的公钥和他的私钥加密文件并成功解密。
走了另一条路
让另一位同事尝试解密不适合他的文件:失败(如预期)
我的密钥是这样生成的......
(gpg --version 告诉我我使用的是 1.4.5,我使用的是 Bouncy Castle 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:在 org.bouncycastle.jcajce.provider.asymmetric.elgamal.CipherSpi.engineInit(Unknown Source) 在 org.bouncycastle.jcajce.provider.asymmetric.elgamal.CipherSpi 处传递给 ElGamal 的未知密钥类型。 engineInit(Unknown Source) at javax.crypto.Cipher.init(DashoA13*..) at javax.crypto.Cipher.init(DashoA13*..) ... 还有 8 个
我在这里接受很多建议,从“不要使用 gpg,改用 x”到“不要使用充气城堡,改用 x”到介于两者之间的任何建议。谢谢!