2014-02-10 5 views
0

안녕하십니까? 사용자의 pdf를 얻기 위해 crypto 문자열에 문제가 있습니다. 암호가 패딩암호화 된 문자열 길이

코드로 복호화 할 때 입력 길이는 8의 배수 여야 :

public void getPDF(WebRequest request, ResourceResponse response, Model model, 
        @RequestParam("cif") String cif, 
        @RequestParam("cuenta") String cuenta, 
        @RequestParam("objectId") String encryptedObjectId) throws Exception{ 

    log.info("Inicio metodo getPDF"); 

    OutputStream os = response.getPortletOutputStream(); 


    try { 

     CipherHelper cipher = new CipherHelper(CipherHelper.TRIPLE_DES_ALGORITHM, InterfazConstantes.ENCRYPTION_KEY, InterfazConstantes.ENCRYPTION_SHIFT); 
     String objectId = cipher.decrypt(encryptedObjectId, true); 

public String getEncryptedObjectID() { 
    try { 
     CipherHelper cipher = new CipherHelper(CipherHelper.TRIPLE_DES_ALGORITHM, InterfazConstantes.ENCRYPTION_KEY, InterfazConstantes.ENCRYPTION_SHIFT); 
     encryptedObjectID = cipher.encrypt(objectID, true); 
    } catch (Exception e) { 
    } 

    return encryptedObjectID; 
} 

에 javax.crypto.IllegalBlockSizeException : 이것은 아래에서 에러를 나타낸다

** encryptedObject id를 stablished했지만 길이가 40입니다. 문제는 제트로 해결되지 않습니다.

오류의 추적은 다음과 같습니다

javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher 
    at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..) ~[sunjce_provider.jar:1.6] 
    at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..) ~[sunjce_provider.jar:1.6] 

누군가가 나를 도울 수 있습니까?

감사

+1

'CipherHelper'의 역할을 모르는 경우 여기서는 도움을받을 수 없습니다. 자신의 문제를 나타내는 [최소 예제] (http://stackoverflow.com/help/mcve)로 코드를 게시하십시오. –

+0

내 문자열 encryptedObjectId에 8,16,32 또는 64 길이가 있더라도 항상이 오류가 표시됩니다. 그것은 혼란스럽고,이 문제는이 param의 encryp/decrypt와 관련 될 수 있다고 생각합니다. –

+0

나는 투표하기 위해 투표했습니다. 더 완벽한 코드 예제가 없으면 우리는 도움을 줄 수 없습니다. –

답변

0

문제 때문에 바이너리 데이터를 사용하여 문자열 (암호화 된 텍스트 = byte[])에 가능성이 높습니다. 그런 다음 기본 인코딩을 사용합니다.

String s = new String(bytes, StandardCharsets.ISO_8859_1);// Single byte encoding 
byte[] bytes = s.getBytes(StandardCharsets.ISO_8859_1); 
new OutputStreamWriter(outputStream, StandardCharsets.ISO_8859_1) 
new InputStreamReader(inputStream, StandardCharsets.ISO_8859_1) 
+0

바이트 []를 cipher.encrypt에 전달해야합니까? 덕분에 –

+0

API에 따라 다릅니다. 나는 CipherHelper라는 클래스를 모른다. 바이트로부터의 16 진수 표현이 사용된다. 나의 대답은 moot이지만,'encrypt'는 보통 text (String)을 받아서 바이너리 데이터 ('byte []')를 생성해야한다. 와'decrypt'가 반대가됩니다. –