0

请帮我。我在线程“main”java.lang.NoSuchMethodError 中收到错误消息异常

请帮助我,因为这是我在工作世界中的第一个项目

public static void decrypt() {
        logger.info("Start decrypt");
        PGPLib pgp = new PGPLib();
        String privateKeyFile = prop.getProperty("app.privatekey");
        String privateKeyPass = prop.getProperty("app.passphrase");
        String publicKeyFile = prop.getProperty("app.publickey");
        String[] pass = new String[0];
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(privateKeyPass), StandardCharsets.UTF_8));
             CSVReader csvReader = new CSVReaderBuilder(reader).build()){
            List<String[]> records= csvReader.readAll();
            pass= records.get(0);
        } catch (IOException e) {
            e.printStackTrace();
        }

        if(!checkConfig(privateKeyFile, publicKeyFile, privateKeyPass))
            return;

        File dir = new File(prop.getProperty("app.pathIn"));

        if (!dir.exists()) {
            logger.severe("Folder IN not found");
            return;
        }

        String[] fileList = dir.list();

        if (fileList.length==0) {
            logger.warning("Nothing file to decrypt");
            return;
        }

        // verify and extract the signed content
        boolean status= false;

        for (String name:fileList) {
            File fileName = new File(name);

            if (fileName.getName().contains(".asc") || fileName.getName().contains(".gpg") || fileName.getName().contains(".pub")) {

                SignatureCheckResult signatureCheck = null;
                try {
                    logger.info("Starting decrypt file "+ name);
                    String[] outname= name.split("\\.");
                    signatureCheck = pgp.decryptAndVerify(prop.getProperty("app.pathIn")+name,
                            privateKeyFile,
                            pass[0],
                            publicKeyFile,
                            prop.getProperty("app.pathDecrypt")+outname[0]+".txt");

                    logger.info("File "+name+" decrypted.");
                    try {
                        Files.move(Paths.get(prop.getProperty("app.pathIn") + name),
                                Paths.get(prop.getProperty("app.pathBackup") + name), StandardCopyOption.REPLACE_EXISTING);
                        logger.info("File " + name + " moved");
                    }catch (IOException e){
                        logger.warning(e.toString());
                        logger.warning("Failed to move file.");
                    }

                } catch (NoSuchFileException | FileNotFoundException | PGPException e) {
                    logger.warning(e.toString());
                    System.exit(0);
                } catch (IOException e) {
                    logger.warning(e.toString());
                    return;
                }

                if (signatureCheck == SignatureCheckResult.SignatureVerified) {
                    status= true;
                    logger.info("The signature is valid");
                } else if (signatureCheck == SignatureCheckResult.SignatureBroken) {
                    status= true;
                    logger.warning("Message corrupted or signature forged");
                } else if (signatureCheck == SignatureCheckResult.PublicKeyNotMatching) {
                    status= true;
                    logger.warning("Signature not matching provided public key (the message is from another sender)");
                } else {
                    status= false;
                    logger.warning("No signature found in message");
                }
            }else{
                logger.warning("Please check input file.");
            }
        }

        if (status) {
            convert();
        }
    }

错误信息

Exception in thread "main" java.lang.NoSuchMethodError: 'lw.bouncycastle.openpgp.PGPEncryptedData lw.bouncycastle.openpgp.PGPEncryptedDataList.get(int)'
    at com.didisoft.pgp.PGPLib.a(Unknown Source)
    at com.didisoft.pgp.PGPLib.decryptAndVerify(Unknown Source)
    at com.didisoft.pgp.PGPLib.decryptAndVerify(Unknown Source)
    at converter.ConverterMT940.decrypt(ConverterMT940.java:436)
    at converter.ConverterMT940.main(ConverterMT940.java:106)
C:\Users\wangu\AppData\Local\NetBeans\Cache\12.2\executor-snippets\run.xml:111: The following error occurred while executing this line:
C:\Users\wangu\AppData\Local\NetBeans\Cache\12.2\executor-snippets\run.xml:68: Java returned: 1enter code here

我的源代码

import org.joda.time.LocalDate;
//import java.time.LocalDate;
//import java.time.temporal.ChronoUnit;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;

import com.didisoft.pgp.PGPException;
import com.didisoft.pgp.PGPLib;
import com.didisoft.pgp.SignatureCheckResult;

import javax.swing.*;

public class ConverterMT940 {
    public JPanel panel;
    public JPasswordField passphraseText;
    public JButton submit;

    private static Logger logger;
    private static String passphrase;
    private static JFrame frame;

    private static Properties prop;
    private static String configFile;

    private ConverterMT940(){
        submit.setText("Decrypt");

        Action action = new AbstractAction()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                passphrase= new String(passphraseText.getPassword());
                if(!passphrase.equals("")) {
                    frame.setVisible(false);
                    decrypt();
                }
            }
        };
        passphraseText.addActionListener(action);

//        submit.getInputMap().put(KeyStroke.getKeyStroke("ENTER"));
        submit.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                passphrase= new String(passphraseText.getPassword());
                if(!passphrase.equals("")) {
                    frame.setVisible(false);
                    decrypt();
                }
//                System.out.println(passphrase);
            }
        });
    }

    public static void main(String[] args) throws IOException {
        File folderLog = new File("Log");
        if (!folderLog.exists()) {
            folderLog.mkdir();
        }

        prop = new Properties();
        configFile= "app.config";

        InputStream is= null;
        try {
            is = new FileInputStream(configFile);
            prop.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }

        FileHandler fh = new FileHandler("Log/ConverterLog.log", true);
        logger = Logger.getLogger("Log");
        logger.addHandler(fh);
        logger.setLevel(Level.ALL);
        SimpleFormatter formatter = new SimpleFormatter();
        fh.setFormatter(formatter);

        if(!checkFolder()) {
            System.exit(0);
        }

        decrypt();
//        convert();
    }

    private static boolean checkFolder(){
        File folderDecrypt= new File(prop.getProperty("app.pathDecrypt"));
        File folderIN= new File(prop.getProperty("app.pathIn"));
        File folderBackup= new File(prop.getProperty("app.pathBackup"));
        File folderMT= new File(prop.getProperty("app.pathMt"));

        boolean status= true;

        if (!folderDecrypt.exists()){
            logger.severe("Folder DECRYPT not found.");
            status= false;
        }

        if(!folderBackup.exists()){
            logger.severe("Folder BACKUP not found.");
            status= false;
        }

        if(!folderIN.exists()){
            logger.severe("Folder IN not found.");
            status= false;
        }

        if(!folderMT.exists()){
            logger.severe("Folder MT not found.");
            status= false;
        }
        return status;
    }

    private static String getCurrency(String code){
        ArrayList<String[]> currency= new ArrayList<>();
        currency.add(new String[]{"AUD","036"});
        currency.add(new String[]{"NZD","554"});
        currency.add(new String[]{"EUR","978"});
        currency.add(new String[]{"GBP","826"});
        currency.add(new String[]{"JPY","392"});
        currency.add(new String[]{"SGD","702"});
        currency.add(new String[]{"HKD","344"});
        currency.add(new String[]{"CAD","124"});
        currency.add(new String[]{"CHF","756"});
        currency.add(new String[]{"IDR","360"});

        for (String[] data:currency) {
            if(data[1].equals(code)){
                logger.info("Currency found");
                return data[0];
            }
        }
        logger.warning("Currenct not found");
        return "";
    }

    private static String dateConverter(String stringDate){
        String tempDate= "";
        for(int i=0; i<stringDate.length(); i++){
            tempDate= tempDate+stringDate.charAt(i);
            if (i==3)
                tempDate= tempDate+"-";

            if (i==5)
                tempDate= tempDate+"-";
//            System.out.println(stringDate.charAt(i));
        }
//        System.out.println(tempDate);

        return tempDate;
    }

    private static boolean checkConfig(String privatekey, String publickey, String passphrase){
        logger.info("Reading configuration file.");
        boolean status= true;

        if (privatekey==null){
            status=false;
            logger.warning("Private key not found,");
        }

        if (publickey==null){
            status=false;
            logger.warning("Public key not found.");
        }

        if (passphrase==null){
            status=false;
            logger.warning("Passphrase null");
        }

        return status;
    }

    public static void convert() {
        String fileMnemonic = "MNEMONIC/MT9xx Mnemonic - Agung.csv";

        ArrayList<String> codeName1 = new ArrayList<>();
        List<List<String>> dataFileMnemonic = new ArrayList<>();

        try (BufferedReader reader = new BufferedReader(new InputStreamReader(ConverterMT940.class.getResourceAsStream(fileMnemonic)));
             CSVReader csvReader = new CSVReaderBuilder(reader).withSkipLines(1).build()) {
            logger.info("Start mapping file mnemonic");
            List<String[]> records = csvReader.readAll();
            for (String[] record : records) {
                codeName1.add(record[0]);
                dataFileMnemonic.add(Arrays.asList(record));
            }
            logger.info("Mapping file mnemonic done");
        } catch (RuntimeException | IOException e) {
//                e.printStackTrace();
            logger.severe(e.toString());
            logger.severe("File mnemonic not found");
            System.exit(0);
        }

        File dir = new File(prop.getProperty("app.pathDecrypt"));
        if (!dir.exists()) {
            logger.severe("Folder DECRYPT not found");
            System.exit(0);
        }
        String[] fileList = dir.list();
        if (fileList.length==0){
            logger.warning("Nothing file to convert");
        }

        for(String name:fileList) {
            String fileIn = prop.getProperty("app.pathDecrypt") + name;
            String[] outName= name.split("\\.");
            String fileOut = prop.getProperty("app.pathMt")+outName[0]+"_Converted.txt";

            File file = new File(fileIn);
            String fileInName = file.getName();
//        System.out.println(fileInName);

            boolean status = false;
            try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileIn), StandardCharsets.UTF_8));
                 CSVReader csvReader = new CSVReaderBuilder(reader).withSkipLines(1).build();
                 OutputStream outputStream = new FileOutputStream(fileOut);
                 Writer writer = new OutputStreamWriter(outputStream);
                 CSVWriter csvWriter = new CSVWriter(writer,'\u0000', '\u0000','\u0000', "");
            ) {
                logger.info("Starting convert file "+name);

                String[] fileName = fileInName.split("_");
                String[] date = fileName[2].split("\\.");

                String dateBeforeString = "2020-01-01";
                String dateAfterString= dateConverter(date[0]);
                LocalDate dateBefore = LocalDate.parse(dateBeforeString);
                LocalDate dateAfter= LocalDate.parse(dateAfterString);
                long days = Days.daysBetween(dateBefore, dateAfter).getDays()+1;

                List<String[]> records = csvReader.readAll();

                boolean convertStatus= true;
//                Checking date
                for(String[] record:records){
                    String[] trxDate= record[0].split(" ");
                    if (!date[0].equals(trxDate[0]) && convertStatus) {
                        logger.severe("Transaction date file "+name+" not same");
                        logger.severe("Failed converting file "+ name);
//                        System.exit(0);
                        convertStatus= false;
                    }

                    if (record.length!=14 && convertStatus){
                        logger.severe("Error file structure "+name);
                        logger.severe("Failed converting file "+name);
//                        System.exit(0);
                        convertStatus= false;
                    }
                }

                if(convertStatus) {

                    List<String[]> data = new ArrayList<String[]>();
                    data.add(new String[]{"\u0001{1:F01BANK DANAMON}{2:" + fileName[0] + "}{4:"+"\r\n"});
                    data.add(new String[]{":20:" + date[0].substring(2,8)+"\r\n"});
                    data.add(new String[]{":25:" + fileName[1]+"\r\n"});
                    data.add(new String[]{":28C:" + String.format("%05d", Integer.parseInt(String.valueOf(days)))+"\r\n"});

//                    csvWriter.writeNext(new String[]{"\u0001{1:F01BANK DANAMON}{2:" + fileName[0] + "}{4:"+"\r\n"});
//                    csvWriter.writeNext(new String[]{":20:" + date[0].substring(2,8)+"\r\n"});
//                    csvWriter.writeNext(new String[]{":25:" + fileName[1]+"\r\n"});
//                    csvWriter.writeNext(new String[]{":28C:" + String.format("%05d", Integer.parseInt(String.valueOf(days)))+"\r\n"});

                    String[] firstElement = records.get(0);
//            System.out.println(firstElement[1]);
                    String currency = getCurrency(firstElement[7]);
                    if (currency == null) {
                        logger.warning("Currency mot found "+ name);
                    }

                    Double tempAmount= Double.parseDouble(firstElement[12]);
                    String amount= df.format(tempAmount).replace(".", ",");
                    if (currency.equals("IDR") || currency.equals("JPY")) {
                        amount = getAmount(firstElement[12]);
                    }

                    data.add(new String[]{":60F:" + firstElement[9] + date[0].substring(2,8) + currency + amount+"\r\n"});
//                    csvWriter.writeNext(new String[]{":60F:" + firstElement[9] + date[0].substring(2,8) + currency + String.format("%015.2f",
//                            Float.parseFloat(firstElement[12])).replace(".", ",")+"\r\n"});

                    for (String[] record : records) {
                        String[] code = record[4].split(":");
                        int indexCodeName = codeName1.indexOf(code[0]);
                        List<String> dataMnemonic = dataFileMnemonic.get(indexCodeName);
                        String codeName = dataMnemonic.get(1);

                        tempAmount= Double.parseDouble(record[8]);
                        amount = df.format(tempAmount).replace(".", ",");
                        if (currency.equals("IDR") || currency.equals("JPY")) {
                            amount = getAmount(record[8]);
                        }

                        String[] dateTrx= record[0].split(" ");

                        data.add(new String[]{":61:" + dateTrx[0].substring(2,8) + record[9] +
                                amount + codeName + record[11]+"\r\n"});
                        data.add(new String[]{":86:" + record[10]+"\r\n"});
//                        csvWriter.writeNext(new String[]{":61:" + dateTrx[0].substring(2,8) + record[9] +
//                                amount + codeName + record[11]+"\r\n"});
//                        csvWriter.writeNext(new String[]{":86:" + record[10]+"\r\n"});

                    }

                    String[] lastElement = records.get(records.size() - 1);
                    currency = getCurrency(lastElement[7]);

                    tempAmount= Double.parseDouble(lastElement[13]);
                    amount= df.format(tempAmount).replace(".", ",");
                    if (currency.equals("IDR") || currency.equals("JPY")) {
                        amount = getAmount(lastElement[13]);
                    }

                    data.add(new String[]{":62F:" + lastElement[9] + date[0].substring(2,8) + currency + amount+"\r\n"});
                    data.add(new String[]{"-}"+"\u0003\r\n"});
//                    csvWriter.writeNext(new String[]{":62F:" + lastElement[9] + date[0].substring(2,8) + currency + String.format("%015.2f",
//                            Float.parseFloat(lastElement[13])).replace(".", ",")+"\r\n"});
//                    csvWriter.writeNext(new String[]{"-}"+"\u0003\r\n"});

                    for (int i=0; i<2; i++){
                        data.add(new String[]{"\r\n"});
//                        csvWriter.writeNext(new String[]{"\r\n"});
                    }

//            System.out.println("File converted");
                    csvWriter.writeAll(data, true);
                    csvWriter.flush();
                    logger.info("File " + name + " converted");
                    status = true;
                }
            } catch (IOException e) {
                e.printStackTrace();
                logger.severe(e.toString());
                logger.severe("Failed converting file "+name);
                status= false;
                System.exit(0);
            }


            if(status) {
                try {
//            Move In file to History
                    Files.move(Paths.get(prop.getProperty("app.pathDecrypt") + name),
                            Paths.get(prop.getProperty("app.pathBackup")+ name),StandardCopyOption.REPLACE_EXISTING);
                    logger.info("File " + name + " moved to BACKUP");
                }catch (IOException e){
                    logger.severe(e.toString());
                    logger.severe("Failed to move file");
                    System.exit(0);
                }
            }
        }
    }

    private static String getAmount(String record) {
        Double tempAmount = Double.parseDouble(record);
        String[] tempDecimal = df.format(Math.round(tempAmount)).split("\\.");
        return tempDecimal[0];
    }

    private static DecimalFormat df = new DecimalFormat("000000000000.00");

    public static void decrypt() {
        logger.info("Start decrypt");
        // initialize the library instance
        PGPLib pgp = new PGPLib();

        String privateKeyFile = prop.getProperty("app.privatekey");
        String privateKeyPass = prop.getProperty("app.passphrase");
//        String privateKeyPass= passphrase;
        String publicKeyFile = prop.getProperty("app.publickey");
        String[] pass = new String[0];
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(privateKeyPass), StandardCharsets.UTF_8));
             CSVReader csvReader = new CSVReaderBuilder(reader).build()){
            List<String[]> records= csvReader.readAll();
            pass= records.get(0);
        }catch (IOException e) {
            e.printStackTrace();
        }

        if(!checkConfig(privateKeyFile, publicKeyFile, privateKeyPass))
            return;

        File dir = new File(prop.getProperty("app.pathIn"));
        if (!dir.exists()) {
            logger.severe("Folder IN not found");
//            System.exit(0);
            return;
        }
        String[] fileList = dir.list();
        if (fileList.length==0){
            logger.warning("Nothing file to decrypt");
            return;
        }
        // verify and extract the signed content
        boolean status= false;

        for (String name:fileList) {
            File fileName = new File(name);

            if (fileName.getName().contains(".asc") || fileName.getName().contains(".gpg") || fileName.getName().contains(".pub")) {

                SignatureCheckResult signatureCheck = null;
                try {
                    logger.info("Starting decrypt file "+ name);
                    String[] outname= name.split("\\.");
                    signatureCheck = pgp.decryptAndVerify(prop.getProperty("app.pathIn")+name,
                            privateKeyFile,
                            pass[0],
                            publicKeyFile,
                            prop.getProperty("app.pathDecrypt")+outname[0]+".txt");

                    logger.info("File "+name+" decrypted.");

//            Move In file to History
                    try {
                        Files.move(Paths.get(prop.getProperty("app.pathIn") + name),
                                Paths.get(prop.getProperty("app.pathBackup") + name), StandardCopyOption.REPLACE_EXISTING);
                        logger.info("File " + name + " moved");
                    }catch (IOException e){
                        logger.warning(e.toString());
                        logger.warning("Failed to move file.");
                    }

                } catch (NoSuchFileException | FileNotFoundException | PGPException e) {
//            e.printStackTrace();
                    logger.warning(e.toString());
                    System.exit(0);
//                    return;
                } catch (IOException e) {
                    logger.warning(e.toString());
//                    System.exit(0);
                    return;
//            e.printStackTrace();
                }

                if (signatureCheck == SignatureCheckResult.SignatureVerified) {
                    status= true;
//                    System.out.println("The signature is valid.");
                    logger.info("The signature is valid");
                } else if (signatureCheck == SignatureCheckResult.SignatureBroken) {
                    status= true;
//                    System.out.println("Message corrupted or signature forged");
                    logger.warning("Message corrupted or signature forged");
                } else if (signatureCheck == SignatureCheckResult.PublicKeyNotMatching) {
                    status= true;
//                    System.out.println("Signature not matching provided public key (the message is from another sender)");
                    logger.warning("Signature not matching provided public key (the message is from another sender)");
                } else {
                    status= false;
//                    System.out.println("No signature found in message");
                    logger.warning("No signature found in message");
                }
            }else{
                logger.warning("Please check input file.");
            }
        }

        if (status) {
            convert();
        }
//        System.exit(0);
    }
}

这是日志

2021 年 4 月 9 日 2:58:11 PM 转换器。ConverterMT940 解密

信息:开始解密

2021 年 4 月 9 日 2:58:12 PM 转换器。ConverterMT940 checkConfig

INFO:读取配置文件。

2021 年 4 月 9 日 2:58:12 PM 转换器。ConverterMT940 解密

信息:开始解密文件 KAI001_007700096295_20200722.txt.gpg

4

0 回答 0