Java 字符串的 PGP 加密



我需要使用 PGP 加密来加密 java 字符串(这是 JSON 文件的一部分(。我尝试了很多可以从谷歌搜索中挖掘出来的例子。所有这些例子都使用了bouncycastle openpgp方法,这些方法已被弃用。下面是我使用的代码:

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import java.security.Security;
import org.bouncycastle.bcpg.ArmoredOutputStream;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openpgp.PGPCompressedDataGenerator;
import org.bouncycastle.openpgp.PGPEncryptedDataGenerator;
import org.bouncycastle.openpgp.PGPException;
import org.bouncycastle.openpgp.PGPLiteralData;
import org.bouncycastle.openpgp.PGPPublicKey;
import org.bouncycastle.openpgp.PGPPublicKeyRing;
import org.bouncycastle.openpgp.PGPUtil;

public class BouncyCastlePGPTest {
public static void main(String[] args) {
// the keyring that holds the public key we're encrypting with
String publicKeyFilePath = "C:\pgp6.5.8\pubring.pkr";
// init the security provider
Security.addProvider(new BouncyCastleProvider());
try {
System.out.println("Creating a temp file...");
// create a file and write the string to it
File outputfile = File.createTempFile("pgp", null);
FileWriter writer = new FileWriter(outputfile);
writer.write("the message I want to encrypt".toCharArray());
writer.close();
System.out.println("Temp file created at ");
System.out.println(outputfile.getAbsolutePath());
System.out.println("Reading the temp file to make sure that the bits were writtenn----------------------------");
BufferedReader isr = new BufferedReader(new FileReader(outputfile));
String line = "";
while ((line = isr.readLine()) != null) {
System.out.println(line + "n");
}
// read the key 
FileInputStream in = new FileInputStream(publicKeyFilePath);
PGPPublicKey key = readPublicKey(in);
// find out a little about the keys in the public key ring
System.out.println("Key Strength = " + key.getBitStrength());
System.out.println("Algorithm = " + key.getAlgorithm());
int count = 0;
for (java.util.Iterator iterator = key.getUserIDs(); iterator.hasNext();) {
count++;
System.out.println((String)iterator.next());    
}
System.out.println("Key Count = " + count);
// create an armored ascii file
FileOutputStream out = new FileOutputStream(outputfile.getAbsolutePath() + ".asc");
// encrypt the file
encryptFile(outputfile.getAbsolutePath(), out, key);
System.out.println("Reading the encrypted filen----------------------------");
BufferedReader isr2 = new BufferedReader(new FileReader(new File(outputfile.getAbsolutePath() + ".asc")));
String line2 = "";
while ((line2 = isr2.readLine()) != null) {
System.out.println(line2);
}

} catch (PGPException e) {
System.out.println(e.toString());
System.out.println(e.getUnderlyingException().toString());
} catch (Exception e) {
System.out.println(e.toString());
}
}
private static PGPPublicKey readPublicKey(InputStream in) throws IOException {
try {
PGPPublicKeyRing pgpPub = new PGPPublicKeyRing(in);
return pgpPub.getPublicKey();
} catch (IOException io) {
System.out.println("readPublicKey() threw an IOException");
System.out.println(io.toString());
throw io;
}
}
private static void encryptFile(String fileName, OutputStream out, PGPPublicKey encKey)
throws IOException, NoSuchProviderException, PGPException  
{
out = new ArmoredOutputStream(out);
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
System.out.println("creating comData...");
// get the data from the original file 
PGPCompressedDataGenerator comData = new PGPCompressedDataGenerator(PGPCompressedDataGenerator.ZIP);
PGPUtil.writeFileToLiteralData(comData.open(bOut), PGPLiteralData.BINARY, new File(fileName));
comData.close();
System.out.println("comData created...");
System.out.println("using PGPEncryptedDataGenerator...");
// object that encrypts the data
PGPEncryptedDataGenerator cPk = new PGPEncryptedDataGenerator(PGPEncryptedDataGenerator.CAST5, new SecureRandom(), "BC");
cPk.addMethod(encKey);
System.out.println("used PGPEncryptedDataGenerator...");
// take the outputstream of the original file and turn it into a byte array
byte[] bytes = bOut.toByteArray();
System.out.println("wrote bOut to byte array...");
// write the plain text bytes to the armored outputstream
OutputStream cOut = cPk.open(out, bytes.length);
cOut.write(bytes);

// cOut.close();
cPk.close();
out.close();

}
}

以下是我的错误日志的快照:

BouncyCastlePGPTest.java:96: cannot find symbol                            
symbol  : constructor PGPPublicKeyRing(java.io.InputStream)                
location: class org.bouncycastle.openpgp.PGPPublicKeyRing                  
PGPPublicKeyRing pgpPub = new PGPPublicKeyRing(in);
BouncyCastlePGPTest.java:126: cannot find symbol                             
symbol  : constructor PGPEncryptedDataGenerator(int,java.security.SecureRandom,java.lang.String)                                                          
location: class org.bouncycastle.openpgp.PGPEncryptedDataGenerator           
PGPEncryptedDataGenerator cPk = new PGPEncryptedDataGenerator(PGPEncryptedDataGenerator.CAST5, new SecureRandom(), "BC");                 
^                            
BouncyCastlePGPTest.java:127: addMethod(org.bouncycastle.openpgp.operator.PGP
KeyEncryptionMethodGenerator) in org.bouncycastle.openpgp.PGPEncryptedDataGen
erator cannot be applied to (org.bouncycastle.openpgp.PGPPublicKey)          
cPk.addMethod(encKey);                                       
^                    

有人可以指出我可以与 https://www.bouncycastle.org/latest_releases.html 的最新jar一起使用的工作示例代码吗?

除了充气城堡,还有其他选择吗?我相信这是人们会遇到的一个非常常见的用例。现在正在使用什么,如果不是充气堡openpgp?

Bouncy Castle是一个Java轻量级加密API和一个Java安全提供程序。它还为特定功能提供了单独的库,主要是CMS(加密消息语法(和PGP(相当好的隐私(。

这些库可以单独下载,也可以在完整的加密发行版中下载。它们分别命名为bcpkix-jdk15on-159.jarbcpg-jdk15on-159.jar(对于版本 1.59(。您需要将这些库包含在类路径或 Maven 设置中才能执行编译。

实际上,如果您的项目不使用扩展 API,而是通过标准 Java API 访问所有内容,则实际上可以在编译期间省略 Bouncy Castle提供程序bcprov-...。但是,您只能通过Bouncy Castle本身的PGP API使用PGP功能,因此不适用于PGP。

最新更新