Java:使用 Bouncy Castle 的 PGP 加密
Java: PGP Encryption using Bouncy Castle
我正在尝试使用 PGP 实现加密,我的加密方法成功地加密了输入字符串,但是当我尝试解密它以验证加密是否正确完成时,该字符串没有被解密。
我尝试了两种方法:
第一种方法使用 FileOutputStream 写入加密字符串,第二种方法使用 ByteArrayOutputStream。
FileOutputStream 创建了一个文件,我可以使用 Kleopatra 对其进行解密。但是我的要求是只获得一个加密的字符串(不写在文件中)。因此,当我尝试解密加密字符串(使用 ByteArrayOutputStream 后收到)时,它不起作用。我尝试复制字符串并通过 Kleopatra 中的工具>>剪贴板对其进行解密,但 decrypt/verify 选项被禁用。我尝试通过 FileWriter class 手动将字符串写入文件,但解密失败并显示错误 File contains certificate & cannot be decrypted or verified.
我假设只有由 OutputStream 直接创建的文件才能成功解密。
但我必须真正检查加密字符串。
非常感谢任何帮助。
以下完整示例摘自"Java Cryptography: Tools and Techniques by David Hook & Jon Eaves"一书的源代码。
包含所有示例的完整源代码可在此处获得:https://www.bouncycastle.org/java-crypto-tools-src.zip
示例显示了 private-/public 使用 El Gamal 或椭圆曲线创建密钥以及使用 AES-256 加密。
在 ecExample-method 中,我添加了两行以将加密的字符串保存到文件 "pgp-encrypted-string.dat" 中,然后
重新加载数据以解密文件并显示解密的字符串。
import org.bouncycastle.bcpg.SymmetricKeyAlgorithmTags;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openpgp.*;
import org.bouncycastle.openpgp.jcajce.JcaPGPObjectFactory;
import org.bouncycastle.openpgp.operator.PublicKeyDataDecryptorFactory;
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPKeyPair;
import org.bouncycastle.openpgp.operator.jcajce.JcePGPDataEncryptorBuilder;
import org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyDataDecryptorFactoryBuilder;
import org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyKeyEncryptionMethodGenerator;
import org.bouncycastle.util.Strings;
import org.bouncycastle.util.io.Streams;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.security.Security;
import java.security.spec.ECGenParameterSpec;
import java.util.Date;
public class PGPEncryptionExampleForSO
{
/**
* Create an encrypted data blob using an AES-256 session key and the
* passed in public key.
*
* @param encryptionKey the public key to use.
* @param data the data to be encrypted.
* @return a PGP binary encoded version of the encrypted data.
*/
public static byte[] createEncryptedData(
PGPPublicKey encryptionKey,
byte[] data)
throws PGPException, IOException
{
PGPEncryptedDataGenerator encGen = new PGPEncryptedDataGenerator(
new JcePGPDataEncryptorBuilder(SymmetricKeyAlgorithmTags.AES_256)
.setWithIntegrityPacket(true)
.setSecureRandom(new SecureRandom()).setProvider("BC"));
encGen.addMethod(
new JcePublicKeyKeyEncryptionMethodGenerator(encryptionKey)
.setProvider("BC"));
ByteArrayOutputStream encOut = new ByteArrayOutputStream();
// create an indefinite length encrypted stream
OutputStream cOut = encGen.open(encOut, new byte[4096]);
// write out the literal data
PGPLiteralDataGenerator lData = new PGPLiteralDataGenerator();
OutputStream pOut = lData.open(
cOut, PGPLiteralData.BINARY,
PGPLiteralData.CONSOLE, data.length, new Date());
pOut.write(data);
pOut.close();
// finish the encryption
cOut.close();
return encOut.toByteArray();
}
/**
* Extract the plain text data from the passed in encoding of PGP
* encrypted data. The routine assumes the passed in private key
* is the one that matches the first encrypted data object in the
* encoding.
*
* @param privateKey the private key to decrypt the session key with.
* @param pgpEncryptedData the encoding of the PGP encrypted data.
* @return a byte array containing the decrypted data.
*/
public static byte[] extractPlainTextData(
PGPPrivateKey privateKey,
byte[] pgpEncryptedData)
throws PGPException, IOException
{
PGPObjectFactory pgpFact = new JcaPGPObjectFactory(pgpEncryptedData);
PGPEncryptedDataList encList = (PGPEncryptedDataList)pgpFact.nextObject();
// find the matching public key encrypted data packet.
PGPPublicKeyEncryptedData encData = null;
for (PGPEncryptedData pgpEnc: encList)
{
PGPPublicKeyEncryptedData pkEnc
= (PGPPublicKeyEncryptedData)pgpEnc;
if (pkEnc.getKeyID() == privateKey.getKeyID())
{
encData = pkEnc;
break;
}
}
if (encData == null)
{
throw new IllegalStateException("matching encrypted data not found");
}
// build decryptor factory
PublicKeyDataDecryptorFactory dataDecryptorFactory =
new JcePublicKeyDataDecryptorFactoryBuilder()
.setProvider("BC")
.build(privateKey);
InputStream clear = encData.getDataStream(dataDecryptorFactory);
byte[] literalData = Streams.readAll(clear);
clear.close();
// check data decrypts okay
if (encData.verify())
{
// parse out literal data
PGPObjectFactory litFact = new JcaPGPObjectFactory(literalData);
PGPLiteralData litData = (PGPLiteralData)litFact.nextObject();
byte[] data = Streams.readAll(litData.getInputStream());
return data;
}
throw new IllegalStateException("modification check failed");
}
private static void elgamalExample()
throws Exception
{
byte[] msg = Strings.toByteArray("Hello, world!");
KeyPairGenerator kpGen = KeyPairGenerator.getInstance("DH", "BC");
kpGen.initialize(2048);
KeyPair kp = kpGen.generateKeyPair();
PGPKeyPair elgKp = new JcaPGPKeyPair(
PGPPublicKey.ELGAMAL_ENCRYPT, kp, new Date());
byte[] encData = createEncryptedData(elgKp.getPublicKey(), msg);
byte[] decData = extractPlainTextData(elgKp.getPrivateKey(), encData);
System.out.println("elgamal encryption msg length: " + msg.length + " enc.length: " + encData.length + " dec.length: " + decData.length);
System.out.println(Strings.fromByteArray(decData));
}
private static void ecExample()
throws Exception
{
byte[] msg = Strings.toByteArray("Hello, world!");
KeyPairGenerator kpGen = KeyPairGenerator.getInstance("EC", "BC");
kpGen.initialize(new ECGenParameterSpec("P-256"));
KeyPair kp = kpGen.generateKeyPair();
PGPKeyPair ecdhKp = new JcaPGPKeyPair(PGPPublicKey.ECDH, kp, new Date());
byte[] encData = createEncryptedData(ecdhKp.getPublicKey(), msg);
// save encrypted string
Files.write(Paths.get("pgp-encrypted-string.dat"), encData);
// load encrypted string
byte[] encDataLoad = Files.readAllBytes(Paths.get("pgp-encrypted-string.dat"));
byte[] decData = extractPlainTextData(ecdhKp.getPrivateKey(), encDataLoad);
System.out.println("ec encryption msg length: " + msg.length + " enc.length: " + encData.length + " dec.length: " + decData.length);
System.out.println(Strings.fromByteArray(decData));
}
public static void main(String[] args)
throws Exception
{
Security.addProvider(new BouncyCastleProvider());
// you need the two files bcpg-jdk15on-165.jar and bcprov-jdk15to18-165.jar to run the example
System.out.println("Example from Java Cryptography: Tools and Techniques by David Hook & Jon Eaves");
System.out.println("get source files: https://www.bouncycastle.org/java-crypto-tools-src.zip");
elgamalExample();
ecExample();
}
}
这是短输出:
Example from Java Cryptography: Tools and Techniques by David Hook & Jon Eaves
get source files: https://www.bouncycastle.org/java-crypto-tools-src.zip
elgamal encryption msg length: 13 enc.length: 601 dec.length: 13
Hello, world!
ec encryption msg length: 13 enc.length: 200 dec.length: 13
Hello, world!
已添加: 据我所知,您的字符串类似于
This string needs an encryption
并且您想使用 rsa pgp public 密钥对其进行加密:
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: BCPG v1.65
mI0EXr/nDgEEAKhB6ufAB954aBIlNjPCsryzUVLu0qkC/1RtnFHf+J6IVegV8Wi7
28V074inQcw6o6FTLtFTaLRP4+3eXNATdjGSjrvcP7k+nu50vydugHv43fPuCiZ7
6gbbMTE9gPiLPA2pS+SmQJnr9hOrD5rzwYP1yNNIsRJ9qmU5NeZyu+szABEBAAG0
DHRlc3RpZGVudGl0eYicBBABAgAGBQJev+cOAAoJEPBDuyqTbz/gY0YD/R+gDkfe
qPgNuk6iI2wLSGEeZRXr6Ru1cyG73CRvz7BjCpwWx039AdQzP9gkeo6MEj8Z0c73
obqEP8NtvvOcwC7+/QiGLTR2mgCsNhk54+iCGsvNbkpkr/rRoYZGyvb+rxui0A61
DCB1w5hdnyMg2OglFNrkaPfpNjMsTebfF5eS
=h1+m
-----END PGP PUBLIC KEY BLOCK-----
并得到加密后的字符串
-----BEGIN PGP MESSAGE-----
Version: BCPG v1.65
hIwD8EO7KpNvP+ABA/9JkOE9PDyS/kr/lZ1Uz+NCSe1JiNcKCXjbsUbvP8CT7Tf1
cKlgzIz1mQjdpkBtVpVhEnEjmUzFy2UCRKr4b4Wx7/1UL+370CICW5HgMoi5TgTg
MYRy5I9Uba/+JxcusjWB1JJHP4ofULziXRKLWAoSPLlglZDzSmV88hNo19rl39JZ
AbMhIS2edM9hHICefL/Yaiq90hGjKMRReVopu2tPUjNLGYP7QABAvWb3WQJMZoYT
HEsyjHxeyYQylAdYB7pWQA0++Z803iclvM3skN8FBt64ebDkqfxgbhs=
=je0r
-----END PGP MESSAGE-----
现在您想使用 Kleoptatra 在线(例如 https://sela.io/pgp-en/)或在 Java 中使用 RSA pgp 私钥和密码 123456 解密此消息:
-----BEGIN PGP PRIVATE KEY BLOCK-----
Version: BCPG v1.65
lQH+BF6/5w4BBACoQernwAfeeGgSJTYzwrK8s1FS7tKpAv9UbZxR3/ieiFXoFfFo
u9vFdO+Ip0HMOqOhUy7RU2i0T+Pt3lzQE3Yxko673D+5Pp7udL8nboB7+N3z7gom
e+oG2zExPYD4izwNqUvkpkCZ6/YTqw+a88GD9cjTSLESfaplOTXmcrvrMwARAQAB
/gMDAhhcE1oF/u8YYExKGLgriK5JpUUSsMFU0AOHP9/zZQr09437V0f/F4J87+9s
G30lDRikGwynEGRnAvIVwqq2F+iarKGGHCZCRgbyufXS7VK6wE/43lR0kSwA2VIM
ll/KbQKP1cSZv0rqtJ1tGL7cDHFEwq10gM4Bn75HOKyBzE9oERRKz37noAECsAZn
xuXGlEB5noqTT00RxsHjBA5Os04CtEz9N+OMrg47IR7AzSQUe90lG2F6W71dhJ6V
jQaf7D6JFU3dOWPW1eBb5FQhgYF92CFRizJ42lDCiTfl2FQU49MlwLd2ofNneuPo
aVuPoYUNKwbasyx4fo2vh6rrMyxmncCizMExvh6GIVgYd7EK9s6Gxq/duuOvly4O
ZAyIY2MOon0bDXxAYR2q/wdQLamnP7rAR4uMu24m/iOuBj6wwTR8v8hhsFFTp/4u
tebwWzLnPyyBYStnTF5IZ9ZJeVl5S3zdzNcrP9g8yXtItAx0ZXN0aWRlbnRpdHmI
nAQQAQIABgUCXr/nDgAKCRDwQ7sqk28/4GNGA/0foA5H3qj4DbpOoiNsC0hhHmUV
6+kbtXMhu9wkb8+wYwqcFsdN/QHUMz/YJHqOjBI/GdHO96G6hD/Dbb7znMAu/v0I
hi00dpoArDYZOePoghrLzW5KZK/60aGGRsr2/q8botAOtQwgdcOYXZ8jINjoJRTa
5Gj36TYzLE3m3xeXkg==
=y/tQ
-----END PGP PRIVATE KEY BLOCK-----
并得到解密后的字符串:
This string needs an encryption
到 Java 中的 encrypt/decrypt 幸运的是,BouncyCastle Github-Repo 中有可用的示例文件:https://github.com/bcgit/bc-java/blob/master/pg/src/main/java/org/bouncycastle/openpgp/examples/。您可能需要使用 RSA (RSAKeyPairGenerator.java) 或 ElGamal 创建新的 PGP 密钥对
(DSAElGamalKeyRingGenerator.java)。使用生成的密钥,您可以使用 KeyBasedFileProcessor.java 和必要的 PGPExampleUtil.java.
进行加密或解密
我使用“-a testidentity 123456”作为参数创建了 RSA 密钥文件,使用“-e -ai plaintext.txt rsa_pub.asc”进行加密,使用“-d”进行解密plaintext.txt.asc rsa_secret.asc 123456”。
我正在尝试使用 PGP 实现加密,我的加密方法成功地加密了输入字符串,但是当我尝试解密它以验证加密是否正确完成时,该字符串没有被解密。
我尝试了两种方法:
第一种方法使用 FileOutputStream 写入加密字符串,第二种方法使用 ByteArrayOutputStream。 FileOutputStream 创建了一个文件,我可以使用 Kleopatra 对其进行解密。但是我的要求是只获得一个加密的字符串(不写在文件中)。因此,当我尝试解密加密字符串(使用 ByteArrayOutputStream 后收到)时,它不起作用。我尝试复制字符串并通过 Kleopatra 中的工具>>剪贴板对其进行解密,但 decrypt/verify 选项被禁用。我尝试通过 FileWriter class 手动将字符串写入文件,但解密失败并显示错误 File contains certificate & cannot be decrypted or verified.
我假设只有由 OutputStream 直接创建的文件才能成功解密。 但我必须真正检查加密字符串。
非常感谢任何帮助。
以下完整示例摘自"Java Cryptography: Tools and Techniques by David Hook & Jon Eaves"一书的源代码。 包含所有示例的完整源代码可在此处获得:https://www.bouncycastle.org/java-crypto-tools-src.zip
示例显示了 private-/public 使用 El Gamal 或椭圆曲线创建密钥以及使用 AES-256 加密。 在 ecExample-method 中,我添加了两行以将加密的字符串保存到文件 "pgp-encrypted-string.dat" 中,然后 重新加载数据以解密文件并显示解密的字符串。
import org.bouncycastle.bcpg.SymmetricKeyAlgorithmTags;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openpgp.*;
import org.bouncycastle.openpgp.jcajce.JcaPGPObjectFactory;
import org.bouncycastle.openpgp.operator.PublicKeyDataDecryptorFactory;
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPKeyPair;
import org.bouncycastle.openpgp.operator.jcajce.JcePGPDataEncryptorBuilder;
import org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyDataDecryptorFactoryBuilder;
import org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyKeyEncryptionMethodGenerator;
import org.bouncycastle.util.Strings;
import org.bouncycastle.util.io.Streams;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.security.Security;
import java.security.spec.ECGenParameterSpec;
import java.util.Date;
public class PGPEncryptionExampleForSO
{
/**
* Create an encrypted data blob using an AES-256 session key and the
* passed in public key.
*
* @param encryptionKey the public key to use.
* @param data the data to be encrypted.
* @return a PGP binary encoded version of the encrypted data.
*/
public static byte[] createEncryptedData(
PGPPublicKey encryptionKey,
byte[] data)
throws PGPException, IOException
{
PGPEncryptedDataGenerator encGen = new PGPEncryptedDataGenerator(
new JcePGPDataEncryptorBuilder(SymmetricKeyAlgorithmTags.AES_256)
.setWithIntegrityPacket(true)
.setSecureRandom(new SecureRandom()).setProvider("BC"));
encGen.addMethod(
new JcePublicKeyKeyEncryptionMethodGenerator(encryptionKey)
.setProvider("BC"));
ByteArrayOutputStream encOut = new ByteArrayOutputStream();
// create an indefinite length encrypted stream
OutputStream cOut = encGen.open(encOut, new byte[4096]);
// write out the literal data
PGPLiteralDataGenerator lData = new PGPLiteralDataGenerator();
OutputStream pOut = lData.open(
cOut, PGPLiteralData.BINARY,
PGPLiteralData.CONSOLE, data.length, new Date());
pOut.write(data);
pOut.close();
// finish the encryption
cOut.close();
return encOut.toByteArray();
}
/**
* Extract the plain text data from the passed in encoding of PGP
* encrypted data. The routine assumes the passed in private key
* is the one that matches the first encrypted data object in the
* encoding.
*
* @param privateKey the private key to decrypt the session key with.
* @param pgpEncryptedData the encoding of the PGP encrypted data.
* @return a byte array containing the decrypted data.
*/
public static byte[] extractPlainTextData(
PGPPrivateKey privateKey,
byte[] pgpEncryptedData)
throws PGPException, IOException
{
PGPObjectFactory pgpFact = new JcaPGPObjectFactory(pgpEncryptedData);
PGPEncryptedDataList encList = (PGPEncryptedDataList)pgpFact.nextObject();
// find the matching public key encrypted data packet.
PGPPublicKeyEncryptedData encData = null;
for (PGPEncryptedData pgpEnc: encList)
{
PGPPublicKeyEncryptedData pkEnc
= (PGPPublicKeyEncryptedData)pgpEnc;
if (pkEnc.getKeyID() == privateKey.getKeyID())
{
encData = pkEnc;
break;
}
}
if (encData == null)
{
throw new IllegalStateException("matching encrypted data not found");
}
// build decryptor factory
PublicKeyDataDecryptorFactory dataDecryptorFactory =
new JcePublicKeyDataDecryptorFactoryBuilder()
.setProvider("BC")
.build(privateKey);
InputStream clear = encData.getDataStream(dataDecryptorFactory);
byte[] literalData = Streams.readAll(clear);
clear.close();
// check data decrypts okay
if (encData.verify())
{
// parse out literal data
PGPObjectFactory litFact = new JcaPGPObjectFactory(literalData);
PGPLiteralData litData = (PGPLiteralData)litFact.nextObject();
byte[] data = Streams.readAll(litData.getInputStream());
return data;
}
throw new IllegalStateException("modification check failed");
}
private static void elgamalExample()
throws Exception
{
byte[] msg = Strings.toByteArray("Hello, world!");
KeyPairGenerator kpGen = KeyPairGenerator.getInstance("DH", "BC");
kpGen.initialize(2048);
KeyPair kp = kpGen.generateKeyPair();
PGPKeyPair elgKp = new JcaPGPKeyPair(
PGPPublicKey.ELGAMAL_ENCRYPT, kp, new Date());
byte[] encData = createEncryptedData(elgKp.getPublicKey(), msg);
byte[] decData = extractPlainTextData(elgKp.getPrivateKey(), encData);
System.out.println("elgamal encryption msg length: " + msg.length + " enc.length: " + encData.length + " dec.length: " + decData.length);
System.out.println(Strings.fromByteArray(decData));
}
private static void ecExample()
throws Exception
{
byte[] msg = Strings.toByteArray("Hello, world!");
KeyPairGenerator kpGen = KeyPairGenerator.getInstance("EC", "BC");
kpGen.initialize(new ECGenParameterSpec("P-256"));
KeyPair kp = kpGen.generateKeyPair();
PGPKeyPair ecdhKp = new JcaPGPKeyPair(PGPPublicKey.ECDH, kp, new Date());
byte[] encData = createEncryptedData(ecdhKp.getPublicKey(), msg);
// save encrypted string
Files.write(Paths.get("pgp-encrypted-string.dat"), encData);
// load encrypted string
byte[] encDataLoad = Files.readAllBytes(Paths.get("pgp-encrypted-string.dat"));
byte[] decData = extractPlainTextData(ecdhKp.getPrivateKey(), encDataLoad);
System.out.println("ec encryption msg length: " + msg.length + " enc.length: " + encData.length + " dec.length: " + decData.length);
System.out.println(Strings.fromByteArray(decData));
}
public static void main(String[] args)
throws Exception
{
Security.addProvider(new BouncyCastleProvider());
// you need the two files bcpg-jdk15on-165.jar and bcprov-jdk15to18-165.jar to run the example
System.out.println("Example from Java Cryptography: Tools and Techniques by David Hook & Jon Eaves");
System.out.println("get source files: https://www.bouncycastle.org/java-crypto-tools-src.zip");
elgamalExample();
ecExample();
}
}
这是短输出:
Example from Java Cryptography: Tools and Techniques by David Hook & Jon Eaves
get source files: https://www.bouncycastle.org/java-crypto-tools-src.zip
elgamal encryption msg length: 13 enc.length: 601 dec.length: 13
Hello, world!
ec encryption msg length: 13 enc.length: 200 dec.length: 13
Hello, world!
已添加: 据我所知,您的字符串类似于
This string needs an encryption
并且您想使用 rsa pgp public 密钥对其进行加密:
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: BCPG v1.65
mI0EXr/nDgEEAKhB6ufAB954aBIlNjPCsryzUVLu0qkC/1RtnFHf+J6IVegV8Wi7
28V074inQcw6o6FTLtFTaLRP4+3eXNATdjGSjrvcP7k+nu50vydugHv43fPuCiZ7
6gbbMTE9gPiLPA2pS+SmQJnr9hOrD5rzwYP1yNNIsRJ9qmU5NeZyu+szABEBAAG0
DHRlc3RpZGVudGl0eYicBBABAgAGBQJev+cOAAoJEPBDuyqTbz/gY0YD/R+gDkfe
qPgNuk6iI2wLSGEeZRXr6Ru1cyG73CRvz7BjCpwWx039AdQzP9gkeo6MEj8Z0c73
obqEP8NtvvOcwC7+/QiGLTR2mgCsNhk54+iCGsvNbkpkr/rRoYZGyvb+rxui0A61
DCB1w5hdnyMg2OglFNrkaPfpNjMsTebfF5eS
=h1+m
-----END PGP PUBLIC KEY BLOCK-----
并得到加密后的字符串
-----BEGIN PGP MESSAGE-----
Version: BCPG v1.65
hIwD8EO7KpNvP+ABA/9JkOE9PDyS/kr/lZ1Uz+NCSe1JiNcKCXjbsUbvP8CT7Tf1
cKlgzIz1mQjdpkBtVpVhEnEjmUzFy2UCRKr4b4Wx7/1UL+370CICW5HgMoi5TgTg
MYRy5I9Uba/+JxcusjWB1JJHP4ofULziXRKLWAoSPLlglZDzSmV88hNo19rl39JZ
AbMhIS2edM9hHICefL/Yaiq90hGjKMRReVopu2tPUjNLGYP7QABAvWb3WQJMZoYT
HEsyjHxeyYQylAdYB7pWQA0++Z803iclvM3skN8FBt64ebDkqfxgbhs=
=je0r
-----END PGP MESSAGE-----
现在您想使用 Kleoptatra 在线(例如 https://sela.io/pgp-en/)或在 Java 中使用 RSA pgp 私钥和密码 123456 解密此消息:
-----BEGIN PGP PRIVATE KEY BLOCK-----
Version: BCPG v1.65
lQH+BF6/5w4BBACoQernwAfeeGgSJTYzwrK8s1FS7tKpAv9UbZxR3/ieiFXoFfFo
u9vFdO+Ip0HMOqOhUy7RU2i0T+Pt3lzQE3Yxko673D+5Pp7udL8nboB7+N3z7gom
e+oG2zExPYD4izwNqUvkpkCZ6/YTqw+a88GD9cjTSLESfaplOTXmcrvrMwARAQAB
/gMDAhhcE1oF/u8YYExKGLgriK5JpUUSsMFU0AOHP9/zZQr09437V0f/F4J87+9s
G30lDRikGwynEGRnAvIVwqq2F+iarKGGHCZCRgbyufXS7VK6wE/43lR0kSwA2VIM
ll/KbQKP1cSZv0rqtJ1tGL7cDHFEwq10gM4Bn75HOKyBzE9oERRKz37noAECsAZn
xuXGlEB5noqTT00RxsHjBA5Os04CtEz9N+OMrg47IR7AzSQUe90lG2F6W71dhJ6V
jQaf7D6JFU3dOWPW1eBb5FQhgYF92CFRizJ42lDCiTfl2FQU49MlwLd2ofNneuPo
aVuPoYUNKwbasyx4fo2vh6rrMyxmncCizMExvh6GIVgYd7EK9s6Gxq/duuOvly4O
ZAyIY2MOon0bDXxAYR2q/wdQLamnP7rAR4uMu24m/iOuBj6wwTR8v8hhsFFTp/4u
tebwWzLnPyyBYStnTF5IZ9ZJeVl5S3zdzNcrP9g8yXtItAx0ZXN0aWRlbnRpdHmI
nAQQAQIABgUCXr/nDgAKCRDwQ7sqk28/4GNGA/0foA5H3qj4DbpOoiNsC0hhHmUV
6+kbtXMhu9wkb8+wYwqcFsdN/QHUMz/YJHqOjBI/GdHO96G6hD/Dbb7znMAu/v0I
hi00dpoArDYZOePoghrLzW5KZK/60aGGRsr2/q8botAOtQwgdcOYXZ8jINjoJRTa
5Gj36TYzLE3m3xeXkg==
=y/tQ
-----END PGP PRIVATE KEY BLOCK-----
并得到解密后的字符串:
This string needs an encryption
到 Java 中的 encrypt/decrypt 幸运的是,BouncyCastle Github-Repo 中有可用的示例文件:https://github.com/bcgit/bc-java/blob/master/pg/src/main/java/org/bouncycastle/openpgp/examples/。您可能需要使用 RSA (RSAKeyPairGenerator.java) 或 ElGamal 创建新的 PGP 密钥对 (DSAElGamalKeyRingGenerator.java)。使用生成的密钥,您可以使用 KeyBasedFileProcessor.java 和必要的 PGPExampleUtil.java.
进行加密或解密我使用“-a testidentity 123456”作为参数创建了 RSA 密钥文件,使用“-e -ai plaintext.txt rsa_pub.asc”进行加密,使用“-d”进行解密plaintext.txt.asc rsa_secret.asc 123456”。