JAVA 下的 pgp加密解密示例

 

main类

 

public class Main
{
  public static void main(String[] args)
    throws Exception
  {
    try
    {

        encryptFile("公钥", "待加密文件路径", "加密结果路径");
    }
    catch (Exception e)
    {
      e.printStackTrace();
      showHelp();
    }
  }
  
  private static void decryptFile(String secretasc, String password, String decryFile, String decryedFile)
    throws IOException, NoSuchProviderException
  {
    Security.addProvider(new BouncyCastleProvider());
    OpenPGPUtil.decryptFile(decryFile, secretasc, password.toCharArray(), decryedFile);
  }
  
  private static void encryptFile(String publicasc, String encrypFile, String outFile)
    throws NoSuchProviderException, IOException, PGPException
  {
    Security.addProvider(new BouncyCastleProvider());
    OpenPGPUtil.encryptFile(outFile, encrypFile, publicasc, false, true);
  }
  

}
 

 

 

 


public class OpenPGPUtil
{
  public static void decryptFile(String inputFileName, String keyFileName, char[] passwd, String defaultFileName)
    throws IOException, NoSuchProviderException
  {
    InputStream in = new BufferedInputStream(new FileInputStream(inputFileName));
    InputStream keyIn = new BufferedInputStream(new FileInputStream(keyFileName));
    decryptFile(in, keyIn, passwd, defaultFileName);
    keyIn.close();
    in.close();
  }
  
  public static void decryptFile(InputStream in, InputStream keyIn, char[] passwd, String defaultFileName)
    throws IOException, NoSuchProviderException
  {
    in = PGPUtil.getDecoderStream(in);
    try
    {
      JcaPGPObjectFactory pgpF = new JcaPGPObjectFactory(in);
      
      Object o = pgpF.nextObject();
      PGPEncryptedDataList enc;
      PGPEncryptedDataList enc;
      if ((o instanceof PGPEncryptedDataList)) {
        enc = (PGPEncryptedDataList)o;
      } else {
        enc = (PGPEncryptedDataList)pgpF.nextObject();
      }
      Iterator it = enc.getEncryptedDataObjects();
      PGPPrivateKey sKey = null;
      PGPPublicKeyEncryptedData pbe = null;
      PGPSecretKeyRingCollection pgpSec = new PGPSecretKeyRingCollection(
        PGPUtil.getDecoderStream(keyIn), new JcaKeyFingerprintCalculator());
      while ((sKey == null) && (it.hasNext()))
      {
        pbe = (PGPPublicKeyEncryptedData)it.next();
        sKey = PGPExampleUtil.findSecretKey(pgpSec, pbe.getKeyID(), passwd);
      }
      if (sKey == null) {
        throw new IllegalArgumentException("secret key for message not found.");
      }
      InputStream clear = pbe.getDataStream(new JcePublicKeyDataDecryptorFactoryBuilder().setProvider("BC").build(sKey));
      
      JcaPGPObjectFactory plainFact = new JcaPGPObjectFactory(clear);
      
      Object message = plainFact.nextObject();
      for (;;)
      {
        if ((message instanceof PGPCompressedData))
        {
          PGPCompressedData cData = (PGPCompressedData)message;
          JcaPGPObjectFactory pgpFact = new JcaPGPObjectFactory(cData.getDataStream());
          message = pgpFact.nextObject();
        }
        if ((message instanceof PGPLiteralData))
        {
          PGPLiteralData ld = (PGPLiteralData)message;
          String outFileName = defaultFileName;
          InputStream unc = ld.getInputStream();
          OutputStream fOut = new BufferedOutputStream(new FileOutputStream(outFileName));
          Streams.pipeAll(unc, fOut);
          fOut.close();
          break;
        }
        if ((message instanceof PGPOnePassSignatureList)) {
          System.out.println("encrypted message contains a signed message - not literal data.");
        } else if ((message instanceof PGPSignatureList)) {
          System.out.println("encrypted message contains a signed message - not literal data.");
        } else {
          throw new PGPException("message is not a simple encrypted file - type unknown.");
        }
        message = plainFact.nextObject();
      }
      if (pbe.isIntegrityProtected())
      {
        if (!pbe.verify()) {
          System.err.println("message failed integrity check");
        } else {
          System.err.println("message integrity check passed");
        }
      }
      else {
        System.err.println("no message integrity check");
      }
    }
    catch (PGPException e)
    {
      System.err.println(e);
      if (e.getUnderlyingException() != null) {
        e.getUnderlyingException().printStackTrace();
      }
    }
  }
  
  public static void encryptFile(String outputFileName, String inputFileName, String encKeyFileName, boolean armor, boolean withIntegrityCheck)
    throws IOException, NoSuchProviderException, PGPException
  {
    OutputStream out = new BufferedOutputStream(new FileOutputStream(outputFileName));
    PGPPublicKey encKey = PGPExampleUtil.readPublicKey(encKeyFileName);
    encryptFile(out, inputFileName, encKey, armor, withIntegrityCheck);
    out.close();
  }
  
  public static void encryptFile(OutputStream out, String fileName, PGPPublicKey encKey, boolean armor, boolean withIntegrityCheck)
    throws IOException, NoSuchProviderException
  {
    if (armor) {
      out = new ArmoredOutputStream(out);
    }
    try
    {
      byte[] bytes = PGPExampleUtil.compressFile(fileName, 1);
      PGPEncryptedDataGenerator encGen = new PGPEncryptedDataGenerator(
        new JcePGPDataEncryptorBuilder(3).setWithIntegrityPacket(withIntegrityCheck).setSecureRandom(new SecureRandom()).setProvider("BC"));
      
      encGen.addMethod(new JcePublicKeyKeyEncryptionMethodGenerator(encKey).setProvider("BC"));
      
      OutputStream cOut = encGen.open(out, bytes.length);
      
      cOut.write(bytes);
      cOut.close();
      if (armor) {
        out.close();
      }
    }
    catch (PGPException e)
    {
      System.err.println(e);
      if (e.getUnderlyingException() != null) {
        e.getUnderlyingException().printStackTrace();
      }
    }
  }
}
 

 

 

 


class PGPExampleUtil
{
  static byte[] compressFile(String var0, int var1)
    throws IOException
  {
    ByteArrayOutputStream var2 = new ByteArrayOutputStream();
    PGPCompressedDataGenerator var3 = new PGPCompressedDataGenerator(var1);
    PGPUtil.writeFileToLiteralData(var3.open(var2), 'b', new File(var0));
    var3.close();
    return var2.toByteArray();
  }
  
  static PGPPrivateKey findSecretKey(PGPSecretKeyRingCollection var0, long var1, char[] var3)
    throws PGPException, NoSuchProviderException
  {
    PGPSecretKey var4 = var0.getSecretKey(var1);
    return var4 == null ? null : var4.extractPrivateKey(new JcePBESecretKeyDecryptorBuilder().setProvider("BC").build(var3));
  }
  
  static PGPPublicKey readPublicKey(String var0)
    throws IOException, PGPException
  {
    BufferedInputStream var1 = new BufferedInputStream(new FileInputStream(var0));
    PGPPublicKey var2 = readPublicKey(var1);
    var1.close();
    return var2;
  }
  
  static PGPPublicKey readPublicKey(InputStream var0)
    throws IOException, PGPException
  {
    PGPPublicKeyRingCollection var1 = new PGPPublicKeyRingCollection(PGPUtil.getDecoderStream(var0), new JcaKeyFingerprintCalculator());
    Iterator var2 = var1.getKeyRings();
    Iterator var4;
    for (; var2.hasNext(); var4.hasNext())
    {
      PGPPublicKeyRing var3 = (PGPPublicKeyRing)var2.next();
      var4 = var3.getPublicKeys();
      
      continue;
      PGPPublicKey var5 = (PGPPublicKey)var4.next();
      if (var5.isEncryptionKey()) {
        return var5;
      }
    }
    throw new IllegalArgumentException("Can't find encryption key in key ring.");
  }
  
  static PGPSecretKey readSecretKey(String var0)
    throws IOException, PGPException
  {
    BufferedInputStream var1 = new BufferedInputStream(new FileInputStream(var0));
    PGPSecretKey var2 = readSecretKey(var1);
    var1.close();
    return var2;
  }
  
  static PGPSecretKey readSecretKey(InputStream var0)
    throws IOException, PGPException
  {
    PGPSecretKeyRingCollection var1 = new PGPSecretKeyRingCollection(PGPUtil.getDecoderStream(var0), new JcaKeyFingerprintCalculator());
    Iterator var2 = var1.getKeyRings();
    Iterator var4;
    for (; var2.hasNext(); var4.hasNext())
    {
      PGPSecretKeyRing var3 = (PGPSecretKeyRing)var2.next();
      var4 = var3.getSecretKeys();
      
      continue;
      PGPSecretKey var5 = (PGPSecretKey)var4.next();
      if (var5.isSigningKey()) {
        return var5;
      }
    }
    throw new IllegalArgumentException("Can't find signing key in key ring.");
  }
}
 

 

 

 

 


public class PgpKeyUtil
{
  private static PGPKeyBundle complexPublicKey;
  private static PGPKeyBundle complexPrivateKey;
  
  public static void genKey(String recipientName, String Passphrase, String publicAscAddr, String secretAscAddr)
  {
    Security.addProvider(new CryptixCrypto());
    
    Security.addProvider(new CryptixOpenPGP());
    
    generateComplexKey(recipientName, Passphrase);
    
    writeKeys(publicAscAddr, secretAscAddr);
  }
  
  public static void generateComplexKey(String recipientName, String Passphrase)
  {
    SecureRandom sr = new SecureRandom();
    try
    {
      KeyBundleFactory kbf = KeyBundleFactory.getInstance("OpenPGP");
      complexPublicKey = (PGPKeyBundle)kbf.generateEmptyKeyBundle();
      complexPrivateKey = (PGPKeyBundle)kbf.generateEmptyKeyBundle();
      
      KeyPairGenerator kpg = KeyPairGenerator.getInstance("OpenPGP/Signing/DSA");
      kpg.initialize(1024, sr);
      
      KeyPair kp = kpg.generateKeyPair();
      PublicKey pubkey = kp.getPublic();
      PrivateKey privkey = kp.getPrivate();
      
      PrincipalBuilder princbuilder = 
        PrincipalBuilder.getInstance("OpenPGP/UserID");
      
      Principal userid = princbuilder.build(recipientName);
      
      CertificateBuilder certbuilder = 
        CertificateBuilder.getInstance("OpenPGP/Self");
      Certificate cert = 
        certbuilder.build(pubkey, userid, privkey, sr);
      
      complexPublicKey.addCertificate(cert);
      complexPrivateKey.addCertificate(cert);
      
      complexPrivateKey.addPrivateKey(privkey, pubkey, 
        Passphrase.toCharArray(), sr);
    }
    catch (Exception e)
    {

      e.printStackTrace();
    }
    KeyPairGenerator kpg = null;
    try
    {
      kpg = KeyPairGenerator.getInstance("OpenPGP/Encryption/ElGamal");
    }
    catch (NoSuchAlgorithmException nsae)
    {
     
      nsae.printStackTrace();
    }
    kpg.initialize(1024, sr);
    KeyPair kp = kpg.generateKeyPair();
    
    PublicKey pubsubkey = kp.getPublic();
    PrivateKey privsubkey = kp.getPrivate();
    
    PublicKey pubmainkey = null;
    PrivateKey privmainkey = null;
    try
    {
      pubmainkey = (PublicKey)complexPrivateKey.getPublicKeys().next();
      privmainkey = complexPrivateKey.getPrivateKey(pubmainkey, 
        Passphrase.toCharArray());
    }
    catch (UnrecoverableKeyException uke)
    {
      uke.printStackTrace();
    }
    try
    {
      complexPublicKey.addPublicSubKey(pubsubkey, privmainkey);
    }
    catch (KeyBundleException kbe)
    {
      System.err.println("Adding the subkey and/or generating the blinding signature failed.");
      
      kbe.printStackTrace();
    }
    try
    {
      complexPrivateKey.addPublicSubKey(pubsubkey, complexPublicKey);
    }
    catch (KeyBundleException kbe)
    {
      kbe.printStackTrace();
    }
    try
    {
      complexPrivateKey.addPrivateSubKey(privsubkey, pubsubkey, 
        Passphrase.toCharArray(), sr);
    }
    catch (KeyBundleException kbe)
    {
      kbe.printStackTrace();
    }
    try
    {
      PrincipalBuilder princbuilder = 
        PrincipalBuilder.getInstance("OpenPGP/UserID");
      Principal userid = princbuilder.build(recipientName);
      
      CertificateBuilder certbuilder = 
        CertificateBuilder.getInstance("OpenPGP/Self");
      Certificate cert = certbuilder.build(pubmainkey, userid, 
        privmainkey, sr);
      
      complexPublicKey.addCertificate(cert);
      complexPrivateKey.addCertificate(cert);
    }
    catch (NoSuchAlgorithmException nsae)
    {
      nsae.printStackTrace();
    }
    catch (PrincipalException pe)
    {
      pe.printStackTrace();
    }
    catch (CertificateException ce)
    {
      ce.printStackTrace();
    }
    catch (KeyBundleException kbe)
    {
      kbe.printStackTrace();
    }
  }
  
  /* Error */
  public static void writeKeys(String publicAscAddr, String secretAscAddr)
  {

  }
  
  public static void main(String[] args)
    throws Exception
  {
    genKey("aaaaaaaa", "123456", "公约路径", "私钥路径");
  }
}

 

 

 

 

 

 

public class PgpTools
{
  public void decryptFile(String secretasc, String password, String decryFile, String decryedFile)
    throws IOException, NoSuchProviderException
  {
    Security.addProvider(new BouncyCastleProvider());
    OpenPGPUtil.decryptFile(decryFile, secretasc, password.toCharArray(), decryedFile);
  }
  
  public void encryptFile(String publicasc, String encrypFile, String outFile)
    throws NoSuchProviderException, IOException, PGPException
  {
    Security.addProvider(new BouncyCastleProvider());
    OpenPGPUtil.encryptFile(outFile, encrypFile, publicasc, false, true);
  }
}

 

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值