如何在jruby9.1.2.0中使用PGP加密来加密文件?

How to encrypt a file using PGP encryption in jruby9.1.2.0?

提问人:Pravin 提问时间:11/25/2016 最后编辑:Pravin 更新时间:1/28/2020 访问量:951

问:

我正在尝试使用 gpg 加密来加密文件,然后再将其发送到我的 jruby 项目中。但是,我没有找到足够的资源。我尝试使用 ruby-gpgme,但 jruby 不支持 C 库。我尝试阅读 Bouncy Castle,但我被类文档淹没了,没有找到一篇简单的文件加密文章。

Vivek 在这个问题中的回答接近我的解决方案,但只有解密文件的解决方案。我目前正在关注这篇文章,并尝试在jruby中连接java代码,但无济于事。我认为该功能是我需要的,如下所示:encryptFile

public static void encryptFile(
        OutputStream out,
        String fileName,
        PGPPublicKey encKey,
        boolean armor,
        boolean withIntegrityCheck)
        throws IOException, NoSuchProviderException, PGPException
    {
        Security.addProvider(new BouncyCastleProvider());

        if (armor) {
            out = new ArmoredOutputStream(out);
        }

        ByteArrayOutputStream bOut = new ByteArrayOutputStream();
        PGPCompressedDataGenerator comData = new PGPCompressedDataGenerator(PGPCompressedData.ZIP);

        PGPUtil.writeFileToLiteralData(
                comData.open(bOut),
                PGPLiteralData.BINARY,
                new File(fileName) );

        comData.close();

        BcPGPDataEncryptorBuilder dataEncryptor = new BcPGPDataEncryptorBuilder(PGPEncryptedData.TRIPLE_DES);
        dataEncryptor.setWithIntegrityPacket(withIntegrityCheck);
        dataEncryptor.setSecureRandom(new SecureRandom());

        PGPEncryptedDataGenerator encryptedDataGenerator = new PGPEncryptedDataGenerator(dataEncryptor);
        encryptedDataGenerator.addMethod(new BcPublicKeyKeyEncryptionMethodGenerator(encKey));

        byte[] bytes = bOut.toByteArray();
        OutputStream cOut = encryptedDataGenerator.open(out, bytes.length);
        cOut.write(bytes);
        cOut.close();
        out.close();
    }

)

我收到以下错误:

NoMethodError: undefined method `ZIP' for Java::OrgBouncycastleOpenpgp::PGPCompressedData:Class

 PGPCompressedDataGenerator comData = new PGPCompressedDataGenerator(PGPCompressedData.ZIP);

如果您能帮助我处理代码或在整个 jruby 中使用 gpg 的加密文件,那将是一个很大的帮助。

更新 1ZIP 值原来是整数值的常量,并列在此页面中。

更新 2我做到了这个功能:

PGPEncryptedDataGenerator encryptedDataGenerator = new PGPEncryptedDataGenerator(dataEncryptor);
    encryptedDataGenerator.addMethod(new BcPublicKeyKeyEncryptionMethodGenerator(encKey)); // encKey is class PGPPublicKey's instance

我有从操作系统生成的公钥。如何从我拥有的公钥字符串创建 PGPPublic Key 实例?encKey

Java Ruby-on-Rails 加密 BouncyCastle OpenPGP

评论

0赞 EnabrenTane 11/28/2016
ZIP可以是类常量,而不是方法。尝试使用 to 引用类常量而不是 a to 引用类方法。PGPCompressedData::ZIP.ZIP
0赞 Pravin 11/28/2016
是的,我从此页面中找到了 zip 的相应常量值。bouncycastle.org/docs/pgdocs1.5on/......
0赞 Pravin 11/28/2016
我仍在尝试围绕它编写一个包装器,只是为了加密。帮助将不胜感激。
0赞 EnabrenTane 11/28/2016
是的,在 Ruby 中会调用一个方法。您希望在类中引用一个常量。使用而不是应该做诀窍。反思并可能有所帮助。如果它是一个常量,则替换 with 应该这样做。PGPCompressedData.zip::.PGPCompressedDataPGPCompressedData.constants.sortPGPCompressedData.methods.sortPGPCompressedData.ZIPPGPCompressedData::ZIP
0赞 Pravin 11/28/2016
@EnabrenTane我刚刚传递了整数值。

答:

0赞 Pravin 12/5/2016 #1

我找不到足够的答案或宝石来做到这一点,包括项目文件夹中的 pgp 库。因此,我已将此 repo 分叉到此 repo 以连接 rails 和系统的 gpg 库。它适用于 ubuntu。我没有在其他机器上测试过它。

加密:

在安装了公钥的计算机中

encryptObj = Gpgr::Encrypt::GpgFileForEncryption.new
encryptObj.email_address = <email_of_gpg_owner>
encryptObj.file = <path_to_file_to_encrypt>
encryptObj.file_output = <path_to_output_file>
encryptObj.encrypt

解密

在具有私钥的计算机中

decryptObj = Gpgr::Decrypt::GpgFileForDecryption.new
decryptObj.file = <path_to_file_to_decrypt>
decryptObj.file_output = <path_to_output_file>
decryptObj.decrypt