JAVA:如果我没有在同一时间加密它,则无法解密加密文件

时间:2016-02-24 16:52:38

标签: java encryption cryptography aes

好的伙计们!我有麻烦。

我想从加密文件中读取数据并将解密后的数据存储在本地变量中(不将其保存在文件中)。

所以,当我进行操作时(在同一个类中)cryptingFile - > DecryptFile - >存储:没关系。 但是,当我尝试直接使用加密文件再次运行代码时,我得到了错误" BadPaddingException"。

我不知道发生了什么......

下面是工作代码:

    public static void main(String[] args) throws Exception {
    // TODO Auto-generated method stub
    generateKey(clef);

    CryptingWithSave(Cipher.ENCRYPT_MODE,"db/db.csv",publicKey,"db/db.csv_encrypted");
    decrypt_file("db/db.csv_encrypted",publicKey);
    System.out.println(tab);
}


    public static void generateKey (String clef) throws NoSuchAlgorithmException{
     final KeyGenerator keyGen = KeyGenerator.getInstance("AES");
     keyGen.init(128);
     final SecretKey key = keyGen.generateKey();

    publicKey= new SecretKeySpec(key.getEncoded(),"AES");
}

    public static void CryptingWithSave (int Crypting_METHOD,String inputFile, SecretKeySpec clef, String outputFile) throws NoSuchAlgorithmException, NoSuchPaddingException, BadPaddingException, Exception{
   Cipher cipher = Cipher.getInstance("AES");
   cipher.init(Crypting_METHOD, clef);

        FileInputStream fis = new FileInputStream(inputFile);
        FileOutputStream fos = new FileOutputStream(outputFile);

        byte[] input = new byte[64];
        int bytesRead;

        while ((bytesRead = fis.read(input)) != -1) {
            byte[] output = cipher.update(input, 0, bytesRead);
            if (output != null)
                fos.write(output);
        }

        byte[] output = cipher.doFinal();
        if (output != null)
            fos.write(output);

        fis.close();
        fos.flush();
        fos.close();
}

public static void decrypt_file (String inputFile, SecretKeySpec clef) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException, IllegalBlockSizeException, BadPaddingException{
    Cipher cipher2 = Cipher.getInstance("AES");
       cipher2.init(Cipher.DECRYPT_MODE, clef);
        FileInputStream fis = new FileInputStream(inputFile);
        byte[] input = new byte[64];
        int bytesRead;

        while ((bytesRead = fis.read(input)) != -1) {
            byte[] output = cipher2.update(input, 0, bytesRead);
            if (output != null)
                tab=tab.concat(new String(output));
        }

        byte[] output = cipher2.doFinal();
        if (output != null)
            tab=tab.concat(new String(output));
        fis.close();
}

在那里,非工作代码(唯一的变化是被注释的CryptingWithSave):

    public static void main(String[] args) throws Exception {
    // TODO Auto-generated method stub
    generateKey(clef);

    //CryptingWithSave(Cipher.ENCRYPT_MODE,"db/db.csv",publicKey,"db/db.csv_encrypted");
    decrypt_file("db/db.csv_encrypted",publicKey);
    System.out.println(tab);
}


    public static void generateKey (String clef) throws NoSuchAlgorithmException{
     final KeyGenerator keyGen = KeyGenerator.getInstance("AES");
     keyGen.init(128);
     final SecretKey key = keyGen.generateKey();

    publicKey= new SecretKeySpec(key.getEncoded(),"AES");
}

    public static void CryptingWithSave (int Crypting_METHOD,String inputFile, SecretKeySpec clef, String outputFile) throws NoSuchAlgorithmException, NoSuchPaddingException, BadPaddingException, Exception{
   Cipher cipher = Cipher.getInstance("AES");
   cipher.init(Crypting_METHOD, clef);

        FileInputStream fis = new FileInputStream(inputFile);
        FileOutputStream fos = new FileOutputStream(outputFile);

        byte[] input = new byte[64];
        int bytesRead;

        while ((bytesRead = fis.read(input)) != -1) {
            byte[] output = cipher.update(input, 0, bytesRead);
            if (output != null)
                fos.write(output);
        }

        byte[] output = cipher.doFinal();
        if (output != null)
            fos.write(output);

        fis.close();
        fos.flush();
        fos.close();
}

public static void decrypt_file (String inputFile, SecretKeySpec clef) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException, IllegalBlockSizeException, BadPaddingException{
    Cipher cipher2 = Cipher.getInstance("AES");
       cipher2.init(Cipher.DECRYPT_MODE, clef);
        FileInputStream fis = new FileInputStream(inputFile);
        byte[] input = new byte[64];
        int bytesRead;

        while ((bytesRead = fis.read(input)) != -1) {
            byte[] output = cipher2.update(input, 0, bytesRead);
            if (output != null)
                tab=tab.concat(new String(output));
        }

        byte[] output = cipher2.doFinal();
        if (output != null)
            tab=tab.concat(new String(output));
        fis.close();
}

1 个答案:

答案 0 :(得分:3)

这是因为下次运行它时会生成一个与前一个不同的新密钥。尝试使用那个旧密钥。