如何通过 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.
目前我正在使用 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.