【问题标题】:Is there a good GnuPG encryption library for Java/Scala? [closed]是否有适用于 Java/Scala 的良好 GnuPG 加密库? [关闭]
【发布时间】:2010-11-30 02:44:57
【问题描述】:

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

是否有推荐的库,或者您能否推荐从 Java(或 Scala)进行 GPG 加密的最佳方法?

我正在开发并打算在 Linux 环境中运行该应用程序,但首选跨平台解决方案。

【问题讨论】:

    标签: java scala jvm gnupg


    【解决方案1】:

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

    它的documentation 提到:

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

    这里有an example of openpgp ByteArrayHandler

    可能会有一些incompatibility between BouncyCastle encryption and GnuGP encryption,因为 BouncyCastle 不使用 GnuPG,而是在 Java 中实现 OpenPGP (RFC2440)。

    【讨论】:

    • 感谢您的回答 - 看起来很有希望。将试一试并报告我是否可以使其与 GnuPG 一起使用。看起来可能只是仔细选择相互兼容的选项。
    • 现在可以使用了。我建议特别查看 org.bouncycastle.openpgp.examples.KeyBasedFileProcessor 中的示例代码。棘手的问题包括在密钥环集合中找到所需的公钥,并确定标准 JDK 中提供的 JCE 实现已失效,您需要明确下载并安装“Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 6" 来自 Sun 网站。
    【解决方案2】:

    我最近不得不从事 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);
    

    我希望这会有所帮助。

    【讨论】:

    • 您好,您能详细说明一下吗?我有问题。
    • 我正在使用上面的代码获取类转换异常:PGPPublicKeyEncryptedData 无法转换为 PGPPBEEncryptedData。 :-(
    • 与@ShintaSmith 相同
    • 有谁能解决这个异常?
    【解决方案3】:

    https://github.com/smartrevolution/gnupg-for-java 基于 gpgme,在 GnuPG 1.4 之上工作。我们正在为 GnuPG 2.x 更新它,并在我们的 Android 应用程序中使用它。您可以在此处获取代码:

    【讨论】:

    • 我制作了一个测试应用程序来使用 gnupg-for-java 解密消息。它成功解密,但在fclose 上崩溃(在它更改返回结果之前)。然后我发现了一些使用 gpgme 的例子,他们不使用 fclose,而只是 gpgme_data_release。所以它看起来不像是一个准备好的解决方案。存储库中提供的示例运行良好。
    • 我们的 gnupg-for-java 分支当然可以使用一些工作,但它确实可以正常工作。有一些烦人的问题。
    猜你喜欢
    • 2011-01-04
    • 2012-09-11
    • 1970-01-01
    • 2011-06-17
    • 2010-09-30
    • 2020-08-22
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多