2

我有一个 .gpg 文件和一个 RSA 私钥。如何在不使用操作系统的情况下以编程方式解密它?例如,不使用类似的东西Runtime.getRuntime().exec("gpg -decrypt.....");

我发现所有运行操作系统的库。像GnuPGgnugpg-for-java

4

3 回答 3

2

正如 Skyr 所说:充气城堡是必经之路。

你想用这把钥匙做什么?如果您的目标是加密或解密文件,您可能想看看bouncy-gpg (无耻插件:我写的)。

使用秘钥其实是三个步骤

  1. 解析密钥并将其放入PGPSecretKeyRing
  2. 从密钥环中提取密钥
  3. 用密码解密

1.解析导出的key

无论如何,请在此处查找解析键的部分

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);
    }
}

2. 从密钥环中获取密钥

       final PGPSecretKeyRingCollection pgpSec = ...
       final PGPSecretKey encryptedKey = pgpSec.getSecretKey(keyID);

3. 解密密钥

稍后您必须使用如下密码解密密钥

 /**
 * 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);
}
于 2017-03-07T15:26:42.117 回答
1

Bouncy Castle库提供(以及其他功能)一个 OpenPGP 实现。该包org.bouncycastle.openpgp.examples包含几个使用示例,其中一个显示如何使用公钥/秘密密钥对加密/解密文件(您可以查看GrepCode项目的 Github 镜像上的示例)。

于 2013-04-27T13:16:08.840 回答
1

我用 PGP 在 Bouncy Castle 上尝试过的例子太多了。常见问题是在 KeyRing 中找不到 keyID。

所以,我找到了@Jens 的 bouncy-gpg(不确定他是否还在维护它。)

这是他来自 github.io 的文档。这很容易遵循和工作! https://neuhalje.github.io/bouncy-gpg/

于 2019-12-03T00:08:39.293 回答