首先声明我对这一切都非常陌生。我的目标是在Java中使用gpg解密一个加密文件。
我已经成功做到了以下几点:
让同事使用我的公钥和他的私钥加密文件,并成功解密。
反向操作
让另一个同事尝试解密不属于他的文件:失败(预期)
我的密钥是这样生成的...
(gpg --version告诉我我正在使用1.4.5版本,我正在使用Bouncy Castle 1.47)
gpg --gen-ley
选择选项“DSA and Elgamal (default)”
填写其他字段并生成一个密钥。
该文件是使用我的公钥和另一个人的秘密密钥进行加密的。 我想解密它。 我编写了以下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: 传递给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 more
我对很多建议持开放态度,从“不要使用gpg,改用x”到“不要使用bouncy castle,改用x”,任何在中间的建议都可以。谢谢!