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);
  }
}

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
BouncyCastle 是 Java 平台上的一个加解密库,支持多种加密算法,包括 PGP解密。以下是使用 BouncyCastle 实现 PGP 加密解密文件的示例代码: 1. 加载 BouncyCastle Provider: ``` Security.addProvider(new BouncyCastleProvider()); ``` 2. 生成 PGP 密钥对: ``` PGPKeyPairGenerator kpg = new JcaPGPKeyPairGenerator().setProvider("BC").setAlgorithm(AsymmetricAlgorithmTags.RSA_GENERAL).setKeySize(2048); PGPKeyPair kp = kpg.generate(); ``` 3. 导出公钥和私钥: ``` PGPPublicKeyRing publicKeyRing = new PGPPublicKeyRing(kp.getPublicKey().getEncoded(), new JcaKeyFingerprintCalculator()); PGPPublicKey publicKey = publicKeyRing.getPublicKey(); PGPPrivateKey privateKey = kp.getPrivateKey(); ``` 4. 加密文件: ``` // 创建加密PGPEncryptorBuilder builder = new JcePGPEncryptorBuilder(SymmetricKeyAlgorithmTags.AES_256).setSecureRandom(new SecureRandom()); builder.setProvider("BC"); PGPEncryptor encryptor = builder.build(publicKey); // 创建输出流 File outputFile = new File("encrypted.pgp"); OutputStream outputStream = new FileOutputStream(outputFile); // 创建压缩器 PGPCompressedDataGenerator compressor = new PGPCompressedDataGenerator(CompressionAlgorithmTags.ZIP); OutputStream compressedOutputStream = compressor.open(outputStream); // 创建签名器 PGPSignatureGenerator signatureGenerator = new PGPSignatureGenerator(new JcaPGPContentSignerBuilder(PublicKeyAlgorithmTags.RSA_GENERAL, HashAlgorithmTags.SHA256).setProvider("BC")); signatureGenerator.init(PGPSignature.BINARY_DOCUMENT, privateKey); signatureGenerator.generateOnePassVersion(false).encode(compressedOutputStream); // 创建字节流加密PGPLiteralDataGenerator literalDataGenerator = new PGPLiteralDataGenerator(); OutputStream literalOutputStream = literalDataGenerator.open(compressedOutputStream, PGPLiteralData.BINARY, "filename", new Date(), new byte[1024]); // 加密文件内容 File inputFile = new File("input.txt"); InputStream inputStream = new FileInputStream(inputFile); byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) != -1) { literalOutputStream.write(buffer, 0, length); } inputStream.close(); // 关闭流 literalDataGenerator.close(); signatureGenerator.generate().encode(compressedOutputStream); compressor.close(); encryptor.close(); outputStream.close(); ``` 5. 解密文件: ``` // 创建解密PGPObjectFactory factory = new JcaPGPObjectFactory(new FileInputStream("encrypted.pgp")); PGPEncryptedDataList encryptedDataList = (PGPEncryptedDataList) factory.nextObject(); PGPPBEEncryptedData pbeEncryptedData = (PGPPBEEncryptedData) encryptedDataList.get(0); PGPPrivateKey privateKey = findPrivateKey("userid", "password".toCharArray()); InputStream decryptedInputStream = pbeEncryptedData.getDataStream(new JcePBEDataDecryptorFactoryBuilder(new JcaPGPDigestCalculatorProviderBuilder().setProvider("BC").build()).setProvider("BC").build(privateKey)); // 创建签名校验器 PGPObjectFactory plainFactory = new JcaPGPObjectFactory(decryptedInputStream); PGPOnePassSignatureList signatureList = (PGPOnePassSignatureList) plainFactory.nextObject(); PGPOnePassSignature signature = signatureList.get(0); PGPPublicKey publicKey = findPublicKey(signature.getKeyID()); signature.init(new JcaPGPContentVerifierBuilderProvider().setProvider("BC"), publicKey); PGPLiteralData literalData = (PGPLiteralData) plainFactory.nextObject(); InputStream literalInputStream = literalData.getInputStream(); // 校验签名 byte[] buffer = new byte[1024]; int length; while ((length = literalInputStream.read(buffer)) != -1) { signature.update(buffer, 0, length); } if (signature.verify(((PGPSignatureList) plainFactory.nextObject()).get(0))) { System.out.println("Signature verified"); } else { System.out.println("Signature not verified"); } // 读取文件内容 while ((length = literalInputStream.read(buffer)) != -1) { // 处理文件内容 } literalInputStream.close(); decryptedInputStream.close(); ``` 其中,`findPrivateKey` 和 `findPublicKey` 方法根据指定的用户 ID 查找对应的私钥和公钥。在实际使用时,需要将用户 ID 和密钥信息存储在合适的位置,例如文件或数据库中,然后在程序中进行读取。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值