有没有适用于Java/Scala的好的GnuPG加密库?

47

我希望能够在Java应用程序中使用GnuPG对磁盘上的文件和/或内存中的数据进行加密。如果可能,我想避免调用GPG命令行工具。

是否有推荐的库,或者你可以推荐从Java(或Scala)加密到GPG的最佳方法?

我正在开发并打算在Linux环境中运行该应用程序,尽管跨平台的解决方案更受欢迎。

3个回答

27

您可以尝试调用BouncyCastle.org的JAVA API。

该网站文档中提到:

Bouncy Castle Crypto包是加密算法的Java实现。

在这里,您可以找到一个openpgp ByteArrayHandler示例。

然而,由于BouncyCastle不使用GnuPG,而是在Java中实现OpenPGP(RFC2440),因此BouncyCastle加密和GnuGP加密之间可能存在不兼容性


1
感谢您的答复 - 看起来很有前途。我会尝试并报告是否可以与GnuPG一起使用。看起来这可能只是关于仔细选择相互兼容的选项。 - James Shade
8
现在已经让它工作了。我建议特别看一下org.bouncycastle.openpgp.examples.KeyBasedFileProcessor 中的示例代码。其中一些棘手的部分包括从密钥环集合中找到所需的公钥,以及弄清楚标准JDK提供的JCE实现是有缺陷的,需要明确地从Sun网站下载和安装“Java加密扩展(JCE)无限制强度司法管辖区策略文件6”。 - James Shade

4
我最近需要处理GPG加密解密,发现BountyCastle的PGP库可以胜任。操作步骤如下:
1)在pom.xml属性中添加版本信息。
        <org.bouncycastle.version>1.46</org.bouncycastle.version>

2) 添加以下依赖项

        <!-- Dependency for PGP and GPG Encryption-Decryption -->
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcmail-jdk15</artifactId>
            <version>${org.bouncycastle.version}</version>
        </dependency>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcpg-jdk15</artifactId>
            <version>${org.bouncycastle.version}</version>
        </dependency>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15</artifactId>
            <version>${org.bouncycastle.version}</version>
        </dependency>

3)在实现类中添加了Java安全性提供程序。

         Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

4) 其他部分的代码只是简单的Java实现。

    File encryptedFile = new File(encryptedFileName);
    byte[]  encryptedByteArray = FileUtils.readFileToByteArray(inputFile);      
    byte[] decryptedByteArray = ByteArrayHandler.decrypt(encryptedByteArray, passPhrase.toCharArray());
    String decryptedString = new String(decryptedByteArray);

我希望这可以帮到你。

你好,能否详细说明一下?我遇到了问题。 - surhidamatya
2
我在使用上述代码时遇到了类转换异常:PGPPublicKeyEncryptedData 无法转换为 PGPPBEEncryptedData。 :-( - Shinta Smith
与@ShintaSmith相同 - TomazStoiljkovic
你们中有谁能解决这个异常吗? - Rocky4Ever

3

我制作了一个测试应用程序,使用gnupg-for-java解密消息。它成功解密了,但在fclose上崩溃(在返回结果之前)。然后我找到了一些使用gpgme的示例,他们不使用fclose,而是使用gpgme_data_release。因此,它看起来不像是一个可以直接使用的解决方案。提供在存储库中的示例运行良好。 - Alexey
我们的 gnupg-for-java 分支肯定需要一些改进,但它确实完全可用。有一些令人讨厌的陷阱。 - Hans-Christoph Steiner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接