Использование PBEFileProcessor для расшифровки файла, предоставленного bouncycastle - PullRequest
0 голосов
/ 28 июня 2019

У меня возникла проблема с расшифровкой зашифрованного файла pgp. У меня есть фаза прохождения и файл со мной. Теперь, чтобы расшифровать его, мне нужно использовать класс PBEFileProcessor (наилучшее предположение), предоставленный bouncycastle в их банке. Я включил jar в свой проект eclipse и создал новый класс, который вызывает этот класс для расшифровки файла. Но мне трудно отладить его.

Код для того же:

import java.io.BufferedInputStream;import java.io.BufferedOutputStream;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 org.bouncycastle.bcpg.ArmoredOutputStream;import org.bouncycastle.bcpg.CompressionAlgorithmTags;import org.bouncycastle.bcpg.SymmetricKeyAlgorithmTags;import org.bouncycastle.jce.provider.BouncyCastleProvider;import org.bouncycastle.openpgp.PGPCompressedData;import org.bouncycastle.openpgp.PGPEncryptedDataGenerator;import org.bouncycastle.openpgp.PGPEncryptedDataList;import org.bouncycastle.openpgp.PGPException;import org.bouncycastle.openpgp.PGPLiteralData;import org.bouncycastle.openpgp.PGPPBEEncryptedData;import org.bouncycastle.openpgp.PGPUtil;import org.bouncycastle.openpgp.jcajce.JcaPGPObjectFactory;import rg.bouncycastle.openpgp.operator.jcajce.JcaPGPDigestCalculatorProviderBuilder;import org.bouncycastle.openpgp.operator.jcajce.JcePBEDataDecryptorFactoryBuilder;import org.bouncycastle.openpgp.operator.jcajce.JcePBEKeyEncryptionMethodGenerator;import org.bouncycastle.openpgp.operator.jcajce.JcePGPDataEncryptorBuilder;import org.bouncycastle.util.io.Streams; 

открытый класс PBEFileProcessor1 { закрытая статическая пустота decryptFile (String inputFileName, char [] passPhrase) выдает IOException, NoSuchProviderException, PGPException { InputStream in = new BufferedInputStream (new FileInputStream (inputFileName)); decryptFile (in, passPhrase); in.close (); }

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

    JcaPGPObjectFactory        pgpF = new JcaPGPObjectFactory(in);
    PGPEncryptedDataList    enc;
    Object                  o = pgpF.nextObject();

    if (o instanceof PGPEncryptedDataList)
    {
        enc = (PGPEncryptedDataList)o;
    }
    else
    {
        enc = (PGPEncryptedDataList)pgpF.nextObject();
    }

    PGPPBEEncryptedData pbe = (PGPPBEEncryptedData)enc.get(0);

    InputStream clear = pbe.getDataStream(new JcePBEDataDecryptorFactoryBuilder(new JcaPGPDigestCalculatorProviderBuilder().setProvider("BC").build()).setProvider("BC").build(passPhrase));

    JcaPGPObjectFactory        pgpFact = new JcaPGPObjectFactory(clear);

    //
    // if we're trying to read a file generated by someone other than us
    // the data might not be compressed, so we check the return type from
    // the factory and behave accordingly.
    //
    o = pgpFact.nextObject();
    if (o instanceof PGPCompressedData)
    {
        PGPCompressedData   cData = (PGPCompressedData)o;

        pgpFact = new JcaPGPObjectFactory(cData.getDataStream());

        o = pgpFact.nextObject();
    }

    PGPLiteralData ld = (PGPLiteralData)o;
    InputStream unc = ld.getInputStream();

    OutputStream fOut = new BufferedOutputStream(new FileOutputStream(ld.getFileName()));

    Streams.pipeAll(unc, fOut);

    fOut.close();

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

private static void encryptFile(
    String          outputFileName,
    String          inputFileName,
    char[]          passPhrase,
    boolean         armor,
    boolean         withIntegrityCheck)
    throws IOException, NoSuchProviderException
{
    OutputStream out = new BufferedOutputStream(new FileOutputStream(outputFileName));
    encryptFile(out, inputFileName, passPhrase, armor, withIntegrityCheck);
    out.close();
}

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

    try
    {
        byte[] compressedData = BouncyCastlePGPExampleUtil.compressFile(fileName, CompressionAlgorithmTags.ZIP);

        PGPEncryptedDataGenerator encGen = new PGPEncryptedDataGenerator(new JcePGPDataEncryptorBuilder(SymmetricKeyAlgorithmTags.CAST5)
            .setWithIntegrityPacket(withIntegrityCheck).setSecureRandom(new SecureRandom()).setProvider("BC"));

        encGen.addMethod(new JcePBEKeyEncryptionMethodGenerator(passPhrase).setProvider("BC"));

        OutputStream encOut = encGen.open(out, compressedData.length);

        encOut.write(compressedData);
        encOut.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[0].equals("-e"))
    {
        if (args[1].equals("-a") || args[1].equals("-ai") || args[1].equals("-ia"))
        {
            encryptFile(args[2] + ".asc", args[2], args[3].toCharArray(), true, (args[1].indexOf('i') > 0));
        }
        else if (args[1].equals("-i"))
        {
            encryptFile(args[2] + ".bpg", args[2], args[3].toCharArray(), false, true);
        }
        else
        {
            encryptFile(args[1] + ".bpg", args[1], args[2].toCharArray(), false, false);
        }
    }
    else if (args[0].equals("-d"))
    {
        decryptFile(args[1], args[2].toCharArray());
    }
    else
    {
        System.err.println("usage: PBEFileProcessor -e [-ai]|-d file passPhrase");
    }
}

}

Команда терминала java: C:\Users\anirudgu\eclipse-workspace\Decryptfile\bin>java PBEFileProcessor1 -d C:\Users\anirudgu\eclipse-workspace\Decryptfile\bin\PTO_data_26_06_2019_16_04.csv Passphase

Но я получаю ошибку

Исключение в потоке "main" java.lang.ClassCastException: org.bouncycastle.openpgp.PGPPublicKeyEncryptedData нельзя преобразовать в org.bouncycastle.openpgp.PGPPB EEncryptedData в PBEFileProcessor1.decryptFile (PBEFileProcessor1.java:90) в PBEFileProcessor1.decryptFile (PBEFileProcessor1.java:60) на PBEFileProcessor1.main (PBEFileProcessor1.java:215)

Но я могу зашифровать этот файл с помощью того же кода. Используемый файл JAR доступен здесь

...