【发布时间】:2013-02-21 01:43:17
【问题描述】:
首先让我说我对这一切都非常陌生。我正在尝试做的是在 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:传递给 ElGamal 的未知密钥类型 在 org.bouncycastle.jcajce.provider.asymmetric.elgamal.CipherSpi.engineInit(未知来源) 在 org.bouncycastle.jcajce.provider.asymmetric.elgamal.CipherSpi.engineInit(未知来源) 在 javax.crypto.Cipher.init(DashoA13*..) 在 javax.crypto.Cipher.init(DashoA13*..) ... 8 更多
我愿意接受很多建议,从“不要使用 gpg,使用 x”到“不要使用充气城堡,使用 x”,再到介于两者之间的任何建议。谢谢!
【问题讨论】:
标签: java bouncycastle openpgp elgamal