我有一个 .gpg 文件和一个 RSA 私钥。如何在不使用操作系统的情况下以编程方式解密它?例如,不使用类似的东西Runtime.getRuntime().exec("gpg -decrypt.....");
我发现所有运行操作系统的库。像GnuPG或gnugpg-for-java。
我有一个 .gpg 文件和一个 RSA 私钥。如何在不使用操作系统的情况下以编程方式解密它?例如,不使用类似的东西Runtime.getRuntime().exec("gpg -decrypt.....");
我发现所有运行操作系统的库。像GnuPG或gnugpg-for-java。
正如 Skyr 所说:充气城堡是必经之路。
你想用这把钥匙做什么?如果您的目标是加密或解密文件,您可能想看看bouncy-gpg (无耻插件:我写的)。
使用秘钥其实是三个步骤
PGPSecretKeyRing
无论如何,请在此处查找解析键的部分:
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 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);
}
Bouncy Castle库提供(以及其他功能)一个 OpenPGP 实现。该包org.bouncycastle.openpgp.examples
包含几个使用示例,其中一个显示如何使用公钥/秘密密钥对加密/解密文件(您可以查看GrepCode或项目的 Github 镜像上的示例)。
我用 PGP 在 Bouncy Castle 上尝试过的例子太多了。常见问题是在 KeyRing 中找不到 keyID。
所以,我找到了@Jens 的 bouncy-gpg(不确定他是否还在维护它。)
这是他来自 github.io 的文档。这很容易遵循和工作! https://neuhalje.github.io/bouncy-gpg/