在不使用Java.Runtime的情况下解密Java中的gpg

时间:2013-04-26 20:05:34

标签: java rsa gnupg

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

这样的东西

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

3 个答案:

答案 0 :(得分:1)

Bouncy Castle库提供(以及其他功能)OpenPGP实现。包org.bouncycastle.openpgp.examples包含几个用法示例,其中一个示例显示如何使用公钥/密钥对加密/解密文件(bouncycastle主页上没有可浏览的源代码,但您可以查看示例在GrepCode)。

答案 1 :(得分:0)

Skyr提到:Bouncy Castle是要走的路。

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

使用密钥实际上是三个步骤

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

    1。解析导出的密钥

    无论如何,请查看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);
        }
    }
    

    2。从密钥环获取密钥

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

    3。解密密钥

    稍后您必须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/