我有一个.gpg文件和一个RSA私钥。如何在不使用操作系统的情况下以编程方式解密它?例如不使用像Runtime.getRuntime().exec("gpg -decrypt.....");
库我发现所有运行的操作系统。与GnuPG或gnugpg-for-java一样。
答案 0 :(得分:1)
Bouncy Castle库提供(以及其他功能)OpenPGP实现。包org.bouncycastle.openpgp.examples
包含几个用法示例,其中一个示例显示如何使用公钥/密钥对加密/解密文件(bouncycastle主页上没有可浏览的源代码,但您可以查看示例在GrepCode)。
答案 1 :(得分:0)
Skyr提到:Bouncy Castle是要走的路。
你想用这把钥匙做什么?如果您的目标是对文件进行解密或解密,您可能需要查看bouncy-gpg(无耻的插件:我写了它)。
使用密钥实际上是三个步骤
PGPSecretKeyRing
无论如何,请查看the part that parses keys:
class ...
private PGPSecretKeyRingCollection secretKeyRings = new PGPSecretKeyRingCollection(EMPTY_LIST);
...
/**
* Add a new secret keyring to the public keyrings.
* .
* Can read the result of "gpg --export" and "gpg --export -a keyid"
* .
* E.g. "gpg --export-secret-key -a keyid":
* addSecretKey("-----BEGIN PGP PRIVATE KEY BLOCK----- ....".getBytes("US-ASCII")
* <p>
* The password is queried via the callback (decryptionSecretKeyPassphraseForSecretKeyId).
*
* @param encodedPrivateKey the key ascii armored or binary
* @throws IOException IO is dangerous
* @throws PGPException E.g. this is nor a valid key
*/
public void addSecretKey(byte[] encodedPrivateKey) throws IOException, PGPException {
if (encodedPrivateKey == null) {
throw new NullPointerException("encodedPrivateKey must not be null");
}
try (
final InputStream raw = new ByteArrayInputStream(encodedPrivateKey);
final InputStream decoded = org.bouncycastle.openpgp.PGPUtil.getDecoderStream(raw)
) {
PGPSecretKeyRing pgpPrivate = new PGPSecretKeyRing(decoded, getKeyFingerPrintCalculator());
this.secretKeyRings = PGPSecretKeyRingCollection.addSecretKeyRing(this.secretKeyRings, pgpPrivate);
}
}
final PGPSecretKeyRingCollection pgpSec = ...
final PGPSecretKey encryptedKey = pgpSec.getSecretKey(keyID);
稍后您必须decrypt the key using a password like so:
/**
* Decrypt an encrypted PGP secret key.
*
* @param encryptedKey An encrypted key
* @param passphrase The passphrase for the key
* @return the decrypted secret key
* @throws PGPException E.g. wrong passphrase
*/
public static PGPPrivateKey extractPrivateKey(PGPSecretKey encryptedKey, final char[] passphrase) throws PGPException {
LOGGER.debug("Extracting secret key with key ID '0x{}'", Long.toHexString(encryptedKey.getKeyID()));
PGPDigestCalculatorProvider calcProvider = new JcaPGPDigestCalculatorProviderBuilder()
.setProvider(BouncyCastleProvider.PROVIDER_NAME).build();
PBESecretKeyDecryptor decryptor = new JcePBESecretKeyDecryptorBuilder(
calcProvider).setProvider(BouncyCastleProvider.PROVIDER_NAME)
.build(passphrase);
return encryptedKey.extractPrivateKey(decryptor);
}
答案 2 :(得分:0)
我在带有PGP的Bouncy Castle上尝试了太多示例。常见的问题是在KeyRing中找不到keyID。
所以,我发现@Jens的bouncy-gpg(不确定他是否仍然维护它)。
这是来自github.io的文档。它很容易遵循和起作用! https://neuhalje.github.io/bouncy-gpg/