2014-02-10 64 views
0

嗨,我有一个加密字符串来获取用户的pdf的问题。它显示了一个错误,以下:加密的字符串长度

javax.crypto.IllegalBlockSizeException:带衬垫的密

代码解密时输入长度必须是多个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; 
} 

**我建立了encryptedObject ID有40个长度,但它没有解决问题jet。

错误的轨迹是:

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长度。这有些困惑,我认为这个问题可能与这个参数的加密/解密有关。 –

+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

我应该将一个byte []传递给cipher.encrypt吗?谢谢 –

+0

取决于API。我不知道类CipherHelper,它可能是,使用字节的十六进制表示,在这种情况下,我的答案是没有意义的,但“加密”通常应该接收文本(字符串)并产生二进制数据('byte []')和“解密”相反。 –