2017-07-19 5 views
0

Obtention org.tukaani.xz.CorruptedInputException: données compressées est corrompu erreur lors de la tentative de décryptage d'un mot de passe protégé (AES 256) Fichier 7z. Considérant que le fichier 7z protégé par mot de passe se décompresser sans aucun problème. Les deux cas le même fichier xls étant compressé. J'utilise Apache commons compress et org.tukaani.xz.Problème avec le déballage/décryptage protégé par mot de passe (AES 256) 7z fichier en Java à l'aide d'apache compress/org.tukaani.xz

exemple de code pour référence.

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 avec succès dépaquetés mais StudentsWithPassAES256.7z lance une exception.

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) 

Quelque chose me manque? Y at-il un autre moyen que je peux extraire AES256 7z?

+0

Est-ce que cela fonctionne si vous utilisez "UTF-16LE" comme encodage? UTF16 utilise un grand ordre d'octets endian lors de l'encodage, 'SevenZFile' attend peu de l'endian. –

+0

Merci Stefan. Après avoir changé pour "UTF-16LE". Cela a fonctionné – Raj

+0

alors faisons une réponse à partir de ceci :-) –

Répondre

0

Votre code est correct, vous n'utilisez que le mauvais charset/codage lors de l'extraction d'octets à partir du mot de passe. La classe SevenZFile attend UTF-16 en petit boutiste donc vous devez utiliser UTF-16LE plutôt que UTF-16 (qui utilisera big endian lors de l'encodage des données).