PGP Encryption using Bouncy Castle

http://cephas.net/blog/2004/04/01/pgp-encryption-using-bouncy-castle/

 

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 written\n----------------------------");
   
   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 file\n----------------------------");
   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();
  
  
 }

 


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值