当前位置: 首页 > 知识库问答 >
问题:

Java中使用BouncyCastle PGP实用程序进行增量加密

宇文和昶
2023-03-14

我正在尝试编写一个加密文件,它将使用gpg解密,并将以增量方式写入行,而不是在一个块中。我已经在GnuPG中生成了密钥,并且正在使用公钥加密。下面是我正在使用的加密方法:

  public static byte[] encrypt(byte[] clearData, PGPPublicKey encKey,
            String fileName,boolean withIntegrityCheck, boolean armor)
            throws IOException, PGPException, NoSuchProviderException {
        if (fileName == null) {
            fileName = PGPLiteralData.CONSOLE;
        }

        ByteArrayOutputStream encOut = new ByteArrayOutputStream();

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

        ByteArrayOutputStream bOut = new ByteArrayOutputStream();

        PGPCompressedDataGenerator comData = new PGPCompressedDataGenerator(
                PGPCompressedDataGenerator.ZIP);
        OutputStream cos = comData.open(bOut); // open it with the final
        // destination
        PGPLiteralDataGenerator lData = new PGPLiteralDataGenerator();

        // we want to generate compressed data. This might be a user option
        // later,
        // in which case we would pass in bOut.
        OutputStream pOut = lData.open(cos, // the compressed output stream
                PGPLiteralData.BINARY, fileName, // "filename" to store
                clearData.length, // length of clear data
                new Date() // current time
                );
        pOut.write(clearData);

        lData.close();
        comData.close();

        PGPEncryptedDataGenerator cPk = new PGPEncryptedDataGenerator(new BcPGPDataEncryptorBuilder(SymmetricKeyAlgorithmTags.AES_192).setSecureRandom(new SecureRandom()));


        cPk.addMethod(new BcPublicKeyKeyEncryptionMethodGenerator(encKey));

        byte[] bytes = bOut.toByteArray();

        OutputStream cOut = cPk.open(out, bytes.length);

        cOut.write(bytes); // obtain the actual bytes from the compressed stream

        cOut.close();

        out.close();

        return encOut.toByteArray();
    }

我有一个小的原型测试类来使用这种方法:

            PGPPublicKey pubKey = PGPEncryptionTools.readPublicKeyFromCol(new FileInputStream(appProp.getKeyFileName()));

        byte[] encryptbytes = PGPEncryptionTools.encrypt("\nthis is some test text".getBytes(), pubKey, null, true, false);
        byte[] encryptbytes2 = PGPEncryptionTools.encrypt("\nmore test text".getBytes(), pubKey, null, true, false);

        FileOutputStream fos = new FileOutputStream("C:/Users/me/workspace/workspace/spring-batch-project/resources/encryptedfile.gpg");
        fos.write(encryptbytes);
        fos.write(encryptbytes2);
        fos.flush();
        fos.close();

我怎样才能修改这段代码,使它既能加密两行,又能让GnuPG解密它们呢?

共有1个答案

诸葛砚
2023-03-14

每次调用PGPEncryptionTools.Encrypt(...)方法时,都会生成多个独立的OpenPGP消息。要只输出单个OpenPGP消息(GnuPG也在一次运行中解密该消息),请将所有纯文本写入单个流(在代码中称为pout),并且在将最后一个字节写入流之前不要关闭该消息。

 类似资料:
  • 在过去的几天里,我读了很多关于RSA加密的帖子。我已经学到了不少东西,但不幸的是,由于这对我来说是新的,我仍然沉浸在新的信息中,并试图把所有的事情都整理好。 我正在考虑(肯定是开放的建议)有一个分割的许可证计划。 我有几个插件/小部件来增强网站。我打算在插件中发布公钥。 然后,插件会用公钥“给家里打电话”,我的服务器会拿着公钥进行匹配,并在一段时间内提供一个“授权”令牌……试用期,1年订阅期等等。

  • 问题内容: 以下代码对我来说可以用BlowFish加密对字符串加密。 如果我想定义自己的密钥,该怎么做? 问题答案:

  • 问题内容: 我正在尝试使用Java中的BouncyCastle使用ECC算法对某些内容进行加密。但是我对BouncyCastle库的说法例外:无法转换为。我理解的是,所产生的公共密钥是不能在java的使用方法。有人可以告诉我如何将其转换为公钥或X509规范,以便可以将其用于加密。 这是我尝试过的代码 我也尝试将公钥转换为X509EncodedSpec,但出现相同的异常 我得到的例外是 编辑 基于注

  • 问题内容: 在早期版本的MongoDB Java驱动程序中,要运行查询并对结果进行无序批量增补,我们要做的就是: 但是在版本3中,随着Bson Document支持和MongoCollection.bulkWrite()方法的引入,该怎么做? 我尝试了这个: 但是,我需要upsert功能。 谢谢。 问题答案: 您仍然可以使用所有功能,只是BulkWrites现在具有不同的语法: 因此,您可以使用(

  • 问题内容: 我了解对此主题有很多疑问。但是我仍然有些困惑,不确定何时使用这些操作。我正在为参加考试而做的旧考试。其中一种方法返回可访问的残疾人可用教室的数量。我编写了counter方法,但不确定是应该先递增还是递后递增计数器。我对它如何与方法中的return语句混淆。我仍然不知道该方法将在下面返回什么值。其他问题未在方法中显示返回值,因此我对它的工作方式感到困惑。这是代码: 问题答案: 当您要在表

  • 问题内容: 在过去的两年中,我一直在编写Java,现在,我开始用python(另外)进行编写。 问题是,当我查看我的Python代码时,似乎有人试图将Java代码转换为python格式,但结果却很糟糕,因为- python不是Java。 关于如何摆脱“用Python编写Java”模式的任何技巧? 谢谢! 问题答案: 您可能会考虑将自己沉浸在Python范例中。最好的方法是首先了解他们的知识,然后通