2017-01-05 12 views
1

Java 응용 프로그램에서 JDK JCA API를 사용하여 암호화 된 zip을 만듭니다. 사용 된 알고리즘은 암호 기반 암호화 PBEWithMD5AndDES입니다. 우리가 직면 한 문제는 압축을 풀 때입니다. 간헐적으로 예외없이 압축을 풀지 못했습니다.Java - 암호화/암호 해독 오류

Caused by: `java.lang.IllegalArgumentException: MALFORMED;` 
`java.util.zip.ZipCoder.toString(ZipCoder.java:58);` 
`java.util.zip.ZipCoder.toStringUTF8(ZipCoder.java:117);` 
`java.util.zip.ZipInputStream.readLOC(ZipInputStream.java:297);` 
`java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:121);` 

대부분의 경우 ZipFile에서 해독 중에 ZipEntry 유틸리티 클래스가 실패합니다.

위의 문제에 대한 의견을 제공해주십시오.

우리가 사용하는 인코딩 용 문자 세트는 Charset.forName ("US-ASCII")입니다. 위의 스택 추적과 관련된 오류가 java.util.zip.ZipCoder.toStringUTF8 (ZipCoder.java:117)로 표시되므로이 문제에 기여합니까?

charset이 설정되지 않았습니다. 여기 우리가 어떻게 읽었 는가입니다.

그러나 이것은 설정되지 않은 경우에도 다른 암호화 된 zip에서 작동합니다. 모든 zip이 제대로 작동하는 것은 아닙니다.이 문제는 간헐적으로 발생합니다.

도움이 될 것입니다?

감사합니다.

+2

문제는 분명히 제공 한 코드의 세부 사항을 중심으로 이루어집니다. 우리는이 종류의 질문에 대한 유용한 답을 얻기 위해 문제를 시연하는 [mcve]를 준비하고 발표 할 것을 기대합니다. 보너스로, MCVE를 준비하는 과정 자체가 당신을 하나의 해결책으로 이끌 수 있습니다. –

답변

0

문자 세트가 전에 설정되지 않았습니다. 여기 우리가 어떻게 읽었는지입니다.

try { 
    zipFileInputStream = new ZipInputStream(new FileInputStream(zipFile)); 
    ZipEntry zipEntry = null; 

    while ((zipEntry = zipFileInputStream.getNextEntry()) != null) { 
     String zipEntryFileName = zipEntry.getName(); 
     if (StringUtils.isExactMatch(fileHasWeekNumberRegEx, zipEntryFileName)) { 
      //do something 
      break; 
     } 
    } 
} catch (IOException e) { 
} finally { 
    zipFileInputStream.close(); 
} 

그러나 이것은 설정되지 않은 경우에도 다른 암호화 된 zip에 대해 작동합니다. 모든 zip이 제대로 작동하는 것은 아닙니다.이 문제는 간헐적으로 발생합니다.

+0

이렇게해도 문제가 해결되지 않았습니다. 다른 생각? –

0

인코딩에 대한 사과 Charset.forName("US-ASCII");. 코드는 인코딩을 설정하지 않지만 대신 내 경우에는 windows-1252 인 기본 인코딩을 사용합니다. windows-1252이지만 아직 행운이 아닌 문자셋을 설정하려고 시도했습니다. 입력 및 출력 스트림 객체가 열려 있는지 확인하고 모든 스트림 객체가 제대로 닫혔는지 확인했습니다. 문제를 일으킬 수있는 다른 원인에 대한 제안?