java关于pgp解密的问题,急。。。。

问题描述

java关于pgp解密的问题,急。。。。

之前测试是使用 pgpe -r minzheng jm.txt -o jm1.txt -a 加密方式加密的,可以直接解密
,但是去银行联调后发现银行使用的是pgpe –r AAA –s –u BBB FILE1 –o FILE2 方式加密的,然后就不能解密了。。。纠结。。。我是找了一段代码用代码解密的,

正常情况下不会进去下面这个判断
} else if (message instanceof PGPOnePassSignatureList) {
throw new PGPException(
"encrypted message contains a signed message - not literal data.");
}

以下是代码

package com.hunger;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
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 java.util.Iterator;

import org.bouncycastle.bcpg.ArmoredOutputStream;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openpgp.PGPCompressedData;
import org.bouncycastle.openpgp.PGPCompressedDataGenerator;
import org.bouncycastle.openpgp.PGPEncryptedData;
import org.bouncycastle.openpgp.PGPEncryptedDataGenerator;
import org.bouncycastle.openpgp.PGPEncryptedDataList;
import org.bouncycastle.openpgp.PGPException;
import org.bouncycastle.openpgp.PGPLiteralData;
import org.bouncycastle.openpgp.PGPOnePassSignatureList;
import org.bouncycastle.openpgp.PGPPrivateKey;
import org.bouncycastle.openpgp.PGPPublicKey;
import org.bouncycastle.openpgp.PGPPublicKeyEncryptedData;
import org.bouncycastle.openpgp.PGPSecretKeyRingCollection;
import org.bouncycastle.openpgp.PGPUtil;
import org.bouncycastle.openpgp.jcajce.JcaPGPObjectFactory;
import org.bouncycastle.openpgp.operator.jcajce.JcaKeyFingerprintCalculator;
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.io.Streams;

public class PgpOperation {

public static void decryptFile(String inputFileName, String keyFileName,
        char[] passwd, String defaultFileName) throws IOException,
        NoSuchProviderException {
    Security.addProvider(new BouncyCastleProvider());
    InputStream in = new BufferedInputStream(new FileInputStream(
            inputFileName));
    InputStream keyIn = new BufferedInputStream(new FileInputStream(
            keyFileName));
    decryptFile(in, keyIn, passwd, defaultFileName);
    keyIn.close();
    in.close();
}

/**
 * decrypt the passed in message stream
 */
private static void decryptFile(InputStream in, InputStream keyIn,
        char[] passwd, String defaultFileName) throws IOException,
        NoSuchProviderException {
    in = PGPUtil.getDecoderStream(in);

    try {
        JcaPGPObjectFactory pgpF = new JcaPGPObjectFactory(in);
        PGPEncryptedDataList enc;

        Object o = pgpF.nextObject();
        //
        // the first object might be a PGP marker packet.
        //
        if (o instanceof PGPEncryptedDataList) {
            enc = (PGPEncryptedDataList) o;
        } else {
            enc = (PGPEncryptedDataList) pgpF.nextObject();
        }

        //
        // find the secret key
        //
        @SuppressWarnings("rawtypes")
        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);

        PGPCompressedData cData = (PGPCompressedData) plainFact
                .nextObject();

        InputStream compressedStream = new BufferedInputStream(
                cData.getDataStream());
        JcaPGPObjectFactory pgpFact = new JcaPGPObjectFactory(
                compressedStream);

        Object message = pgpFact.nextObject();

        if (message instanceof PGPLiteralData) {
            PGPLiteralData ld = (PGPLiteralData) message;

            String outFileName = ld.getFileName();
            // if (outFileName.length() == 0)
            // {
            outFileName = defaultFileName;
            // }

            InputStream unc = ld.getInputStream();
            OutputStream fOut = new BufferedOutputStream(
                    new FileOutputStream(outFileName));

            Streams.pipeAll(unc, fOut);

            fOut.close();
        } else if (message instanceof PGPOnePassSignatureList) {
            throw new PGPException(
                    "encrypted message contains a signed message - not literal data.");
        } else {
            throw new PGPException(
                    "message is not a simple encrypted file - type unknown.");
        }

        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 {
    Security.addProvider(new BouncyCastleProvider());
    OutputStream out = new BufferedOutputStream(new FileOutputStream(
            outputFileName));
    PGPPublicKey encKey = PGPExampleUtil.readPublicKey(encKeyFileName);
    encryptFile(out, inputFileName, encKey, armor, withIntegrityCheck);
    out.close();
}

private static void encryptFile(OutputStream out, String fileName,
        PGPPublicKey encKey, boolean armor, boolean withIntegrityCheck)
        throws IOException, NoSuchProviderException {
    if (armor) {
        out = new ArmoredOutputStream(out);
    }

    try {
        PGPEncryptedDataGenerator cPk = new PGPEncryptedDataGenerator(
                new JcePGPDataEncryptorBuilder(PGPEncryptedData.CAST5)
                        .setWithIntegrityPacket(withIntegrityCheck)
                        .setSecureRandom(new SecureRandom())
                        .setProvider("BC"));

        cPk.addMethod(new JcePublicKeyKeyEncryptionMethodGenerator(encKey)
                .setProvider("BC"));

        OutputStream cOut = cPk.open(out, new byte[1 << 16]);

        PGPCompressedDataGenerator comData = new PGPCompressedDataGenerator(
                PGPCompressedData.ZIP);

        PGPUtil.writeFileToLiteralData(comData.open(cOut),
                PGPLiteralData.BINARY, new File(fileName),
                new byte[1 << 16]);

        comData.close();

        cOut.close();

        if (armor) {
            out.close();
        }
    } catch (PGPException e) {
        System.err.println(e);
        if (e.getUnderlyingException() != null) {
            e.getUnderlyingException().printStackTrace();
        }
    }
}

public static void main(String[] args) throws Exception {
    Security.addProvider(new BouncyCastleProvider());

    if (args.length == 0) {
        System.err
                .println("usage: KeyBasedLargeFileProcessor -e|-d [-a|ai] file [secretKeyFile passPhrase|pubKeyFile]");
        return;
    }

    if (args[0].equals("-e")) {
        if (args[1].equals("-a") || args[1].equals("-ai")
                || args[1].equals("-ia")) {
            encryptFile(args[2] + ".asc", args[2], args[3], true,
                    (args[1].indexOf('i') > 0));
        } else if (args[1].equals("-i")) {
            encryptFile(args[2] + ".bpg", args[2], args[3], false, true);
        } else {
            encryptFile(args[1] + ".bpg", args[1], args[2], false, false);
        }
    } else if (args[0].equals("-d")) {
        decryptFile(args[1], args[2], args[3].toCharArray(), args[4]);
    } else {
        System.err
                .println("usage: KeyBasedLargeFileProcessor -d|-e [-a|ai] file [secretKeyFile passPhrase|pubKeyFile]");
    }
}

}

解决方案

就这样沉了吗?????????

解决方案二:

不能解密了,是解密的结果不符合预期?还是出异常了?

解决方案三:

您好,我想问一下你这个问题解决了没有,最近我也是出现了这个问题,比较着急。能否说一下你的解决思路?非常感谢!

解决方案四:

能否留下你的邮箱,邮件沟通一下zongxin.xzx@alibaba-inc.com

时间: 2024-11-08 21:15:00

java关于pgp解密的问题,急。。。。的相关文章

PHP、Java des加密解密实例

  这篇文章主要介绍了PHP.Java des加密解密实例,des加密是对称加密中在互联网应用的比较多的一种加密方式,本文分别给出了PHP和JAVA版本的实现代码,需要的朋友可以参考下 des加密是对称加密中在互联网应用的比较多的一种加密方式,php 通过mcrypt扩展库来支持des加密,要在Php中使用des加密,需要先安装mcrypt扩展库 下面是加密解密的实例 代码如下: $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_

java怎么实现跑批,急急急,在线等

问题描述 java怎么实现跑批,急急急,在线等 有一个需求.外系统上传一份.xml文件,我们需要定时跑批去ftp上拿到这个文件并且解析插入数据库表 解决方案 这个很简单, 解决方案二: 急急急急急急 谢谢急急急 解决方案三: 写一个java脚本程序,定时的获取xml文件解析 解决方案四: java定时任务,springbacth 都可以实现 解决方案五: 弄一个定时器,通过文件流定时找到xml文件.然后解析插入到数据库就行了 解决方案六: 弄一个定时器,通过文件流定时找到xml文件.然后解析插入

c# java des 互通-(C#转JAVA)DES加密解密问题 。带入整8B加密数据, JAVA写的总是比C#写的多出来8B

问题描述 (C#转JAVA)DES加密解密问题 .带入整8B加密数据, JAVA写的总是比C#写的多出来8B 1C C# private byte[] CSharpEncryptByte(byte[] InputByte byte[] sKey) { DESCryptoServiceProvider DES = new DESCryptoServiceProvider(); DES.Padding = PaddingMode.Zeros; DES.Key = sKey; DES.IV = new

java用openoffice报错!急求。

问题描述 java用openoffice报错!急求. 下面这是报错内容在线等解决.哪位大神帮忙看看.下午就要交任务了~ 解决方案 求解答啊...... 解决方案二: 难道没人知道?????? 解决方案三: 让java与OpenOffice调情-结晶 (转载)

java中socket通信问题,急急急

问题描述 java中socket通信问题,急急急 客户端和服务端用socket建立通信进行文件传输,客户端用outputstream将文件写入流中,在服务端用输入流读取.这时候客户端不想传了,断开连接并告知服务器.服务端如何获知客户端已经断开连接了. 解决方案 你客户端断开连接的时候进行了哪些操作?想想这些操作会对服务器端产生什么影响呗· 解决方案二: 服务端一直在循环监听是否有客户端连接,并不会知道某个客户端已经断开.建议客户端断开之前先执行某条协议,服务器收到这条协议便知道你要断开咯

程序代码-JAVA公交线路查询系统,急!!

问题描述 JAVA公交线路查询系统,急!! 我在网上下载的JAVA的公交线路查询系统程序代码,用eclipse执行的,可是执行不出来,有错误而且按运行就出现AST JTREE EXAMPLE的窗口上面写着ROOT,下面有C1C2C3,运行JAVA都需要下载什么软件呀,我感觉我下了呀,请哪位高人指点一下,JAVA的怎么才能运行呀?急呀!! 解决方案 JAVA运行需要安装JRE. 解决方案二: http://www.java.com/en/download/manual.jsp

java大神,求教,急提问

问题描述 java大神,求教,急提问 两个html页面,a和b,a里面有您好两个字和登录按钮,b里面有返回按钮,我想点击登录按钮跳转到b里面,再点击返回按钮,跳转到a里面,但是,a里面的内容为"您好,***",就没有登录按钮了,原理和登陆之后跳转到当前页的原理一样,求代码编写,java代码,真心请教大神!!! 解决方案 http://blog.csdn.net/lee353086/article/details/8080933 解决方案二: http://www.cnblogs.com

flash的加密过程如何用java实现加密解密

问题描述 flash的加密过程如何用java实现加密解密 解决方案 flash快完了,还是学学HTML5吧!

java继承问题求解答,急急急

问题描述 java继承问题求解答,急急急 为什么下面的代码,当子类与父类有相同成员变量时,创建子类对象子类引用出现空指针异常,求大神解答 class Cell{ int row; int col; Cell(int row,int col){ this.row=row; this.col=col; } String getCellInfo(){ return row+","+col; } } class Tetromino{ Cell[]cells; Tetromino(){ cell