title: PGP Encryption of Java String
body: <p>I have a requirement to encrypt a java string (which is part of a JSON file) using PGP encryption. I tried out quite a lot of examples which I could mine out from Google searches. All of these examples were making use of bouncycastle openpgp methods, which are deprecated. Below is the code I used:</p>
  
  <pre><code>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();
  
  
      }
  
  }
  </code></pre>
  
  <p>Below is a snapshot of my error log:</p>
  
  <pre><code>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);                                       
                     ^                    
  </code></pre>
  
  <p>Can someone point me out to a working sample code which I can use with the latest jars from <a href="https://www.bouncycastle.org/latest_releases.html" rel="nofollow noreferrer">https://www.bouncycastle.org/latest_releases.html</a> ?</p>
  
  <p>Apart from bouncycastle, are there other alternatives? I'm sure it's a very common use case people would come across. What is being used these days, if not bouncycastle openpgp?</p>