如何通过 java 的加密扩展加密 PGP 消息?

How do I encrypt a PGP message through java's crypto extension?

目前我正在使用 bouncy castle 的库进行实际工作,并在 sloanseaman.com 找到了一个示例,该示例(经过一些调整后)适用于 v1.52。

我还从 developer.com 中获得了一个工作示例,说明如何使用 JCE 接口,甚至可以将 bcprov 放入其中并使用其中的一些算法。

public class CryptoUtil {
private static final String ALGORITHM = "IDEA/PGP/NoPadding";

public static void encryptFile(File keyFile, File plainTextFile, File encryptedFile) throws GeneralSecurityException, IOException {
    Cipher desCipher = Cipher.getInstance(ALGORITHM);
    desCipher.init(Cipher.ENCRYPT_MODE, readKeyFromFile(keyFile));
    OutputStream out = new BufferedOutputStream(new FileOutputStream(encryptedFile));
    InputStream in = new BufferedInputStream(new FileInputStream(plainTextFile));
    while (in.available() > 0) {
        // Read the next chunk of bytes...
        byte[] cleartextBytes = new byte[in.available()];
        in.read(cleartextBytes);
        // Now, encrypt them and write them to the encrypted file...
        byte[] encryptedBytes = desCipher.update(cleartextBytes);
        out.write(encryptedBytes, 0, encryptedBytes.length);
    }
    // Take care of any pending padding operations
    out.write(desCipher.doFinal());
    in.close();
    out.flush();
    out.close();

    System.out.println("Encrypted to " + encryptedFile);
}

但是无论我使用什么算法字符串,我都无法让我的 JCE 实用程序像 bouncyCastle 实用程序那样加密。

我得到的最深入的是使用 "IDEA/PGP/NoPadding",它允许我在自身内部加密和解密,但 BC 实用程序不会解密它们,说流中有一个未知对象。

Here是我的源码

你们知道为此我需要使用什么算法、模式和填充的组合吗?我还需要以某种方式应用其他选项吗?我想我需要使用 BC 版本的 AlgorithmParametersSpi,但我还没有弄清楚如何创建它

你不能。虽然 OpenPGP 使用“普通”public/private 和对称加密算法,但问题始于模式。 OpenPGP 使用它自己的模式 (a modified CFB mode),并且 Java 的默认库不支持整个 OpenPGP 数据包语法。

您至少需要在 Java 中重新实现 OpenPGP CFB 模式,或者以某种方式依赖 Bouncy Castle 的实现。

OpenPGP CFB 模式已经包含初始化向量的替换;没有额外的填充是 used/required.