2017-07-19 1 views
0

Getting org.tukaani.xz.CorruptedInputException: Komprimierte Daten sind beschädigt Fehler beim Versuch, ein Passwort geschützt zu entschlüsseln (AES 256) 7z-Datei. Während ohne passwortgeschützte 7z-Datei ohne Problem auspacken. In beiden Fällen wird dieselbe xls-Datei komprimiert.Problem mit entpacken/entschlüsseln kennwortgeschützt (AES 256) 7z-Datei in Java mit Apache compress/org.tukaani.xz

Ich verwende Apache Commons komprimieren und org.tukaani.xz.

Beispielcode als Referenz.

package com.concept.utilities.zip; 

import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.lang.reflect.Field; 

import org.apache.commons.compress.archivers.sevenz.SevenZArchiveEntry; 
import org.apache.commons.compress.archivers.sevenz.SevenZFile; 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.apache.poi.ss.usermodel.Workbook; 

public class DecryptionUtil { 


    static { 
     try { 
      Field field = Class.forName("javax.crypto.JceSecurity").getDeclaredField("isRestricted"); 
      field.setAccessible(true); 
      field.set(null, java.lang.Boolean.FALSE); 
     } catch (Exception ex) { 
     } 
    } 


    public void SevenZFile(String directory, String encryptCompressFileName, String password) { 

     SevenZFile sevenZFile = null; 
     SevenZArchiveEntry entry = null; 

     try { 

      File file = new File(directory+encryptCompressFileName); 
      byte[] inputData = new byte[(int) file.length()]; 
      FileInputStream fis = new FileInputStream(file); 
      fis.read(inputData); 
      fis.close(); 

      // SeekableInMemoryByteChannel inMemoryByteChannel = new SeekableInMemoryByteChannel(inputData); 
      if(null != password){ 
       byte[] pass = password.getBytes("UTF16"); 
       sevenZFile = new SevenZFile(file, pass); 
      }else{ 
       sevenZFile = new SevenZFile(file); 
      } 

      // Go through all entries 
      while (null != (entry = sevenZFile.getNextEntry())) { 

       // Maybe filter by name. Name can contain a path. 
       String processingFileName = entry.getName(); 
       if (entry.isDirectory()) { 
        System.out.println(String.format("Found directory entry %s", processingFileName)); 

       } else { 

        // If this is a file, we read the file content into a ByteArrayOutputStream ... 
        System.out.println(String.format("Unpacking start %s ...", processingFileName)); 
        ByteArrayOutputStream contentBytes = new ByteArrayOutputStream(); 

        // ... using a small buffer byte array. 
        byte[] buffer = new byte[2048]; 
        int bytesRead; 

        while ((bytesRead = sevenZFile.read(buffer)) != -1) { 
         contentBytes.write(buffer, 0, bytesRead); 
        } 


        if (processingFileName.endsWith("xls")) { 
         // Writing into xls 
         Workbook wb = new HSSFWorkbook(); 
         //String safeName = WorkbookUtil.createSafeSheetName(processingFileName); 
         //Sheet sheet = wb.createSheet(safeName); 
         FileOutputStream fileOut = new FileOutputStream(directory+processingFileName); 
         fileOut.write(contentBytes.toByteArray()); 
         fileOut.flush(); 
         wb.write(fileOut); 
         fileOut.close(); 
         wb.close(); 
        }else{ //regular file 
         System.out.println(contentBytes.toString("UTF-8")); 
        } 
        System.out.println(String.format("Unpacking finish %s ...", processingFileName)); 
       } 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       sevenZFile.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

    } 


    public static void main(String[] args) { 

     DecryptionUtil decrypt = new DecryptionUtil(); 
     decrypt.SevenZFile("H:\\archives\\", "StudentsWoPassword.7z", null); 
     decrypt.SevenZFile("H:\\archives\\", "StudentsWithPassAES256.7z", "test"); 

    } 

} 

StudentsWoPassword.7z erfolgreich entpackt aber StudentsWithPassAES256.7z wirft Ausnahme.

Unpacking start Students.xls ... 
Unpacking finish Students.xls ... 
org.tukaani.xz.CorruptedInputException: Compressed data is corrupt 
    at org.tukaani.xz.rangecoder.RangeDecoderFromStream.<init>(Unknown Source) 
    at org.tukaani.xz.LZMAInputStream.initialize(Unknown Source) 
    at org.tukaani.xz.LZMAInputStream.initialize(Unknown Source) 
    at org.tukaani.xz.LZMAInputStream.<init>(Unknown Source) 
    at org.apache.commons.compress.archivers.sevenz.LZMADecoder.decode(LZMADecoder.java:43) 
    at org.apache.commons.compress.archivers.sevenz.Coders.addDecoder(Coders.java:76) 
    at org.apache.commons.compress.archivers.sevenz.SevenZFile.buildDecoderStack(SevenZFile.java:933) 
    at org.apache.commons.compress.archivers.sevenz.SevenZFile.buildDecodingStream(SevenZFile.java:909) 
    at org.apache.commons.compress.archivers.sevenz.SevenZFile.getNextEntry(SevenZFile.java:222) 
    at com.concept.utilities.zip.DecryptionUtil.SevenZFile(DecryptionUtil.java:50) 
    at com.concept.utilities.zip.DecryptionUtil.main(DecryptionUtil.java:107) 

Fehle ich etwas? Gibt es eine andere Möglichkeit, AES256 7z zu extrahieren?

+0

Funktioniert es, wenn Sie "UTF-16LE" als Codierung verwenden? UTF16 verwendet Big-Endian-Byte-Reihenfolge beim Kodieren, 'SevenZFile' erwartet Little Endian. –

+0

Danke Stefan. Nach dem Wechsel zu "UTF-16LE". Es hat funktioniert – Raj

+0

also lasst uns eine Antwort daraus machen :-) –

Antwort

0

Ihr Code ist in Ordnung, Sie verwenden nur den falschen Zeichensatz/Codierung beim Extrahieren von Bytes aus dem Passwort. Die SevenZFile Klasse erwartet UTF-16 in Little Endian, also müssen Sie UTF-16LE anstelle von UTF-16 verwenden (das Big Endian beim Codieren von Daten verwenden wird).

Verwandte Themen