解決:擾人的報錯 Input length must be multiple of 8 when decrypting with padded cipher


轉載自  https://www.lanhusoft.com/Article/655.html

 

最近在做token用DES加密解密的時候遇到擾人的報錯 。

加密沒有問題,解密有時候會出現下面問題:

Input length must be multiple of 8 when decrypting with padded cipher
 javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:750)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)
at com.sun.crypto.provider.DESCipher.engineDoFinal(DESCipher.java:314)
at javax.crypto.Cipher.doFinal(Cipher.java:2087)
at com.zst.cloudzst.util.DesHelper.decrypt(DesHelper.java:130)
at com.zst.cloudzst.util.DesHelper.decrypt(DesHelper.java:68)

網上找了很多文章,試了都沒有解決問題。后來自己發現了問題原因,在此分享出來。

我加密后的token經過base64后,是通過url參數傳遞。仔細對比了后台接收到的參數值和前台傳遞過來的有出入。

加密后的字符串
woO3dhpyc2AivXGew+S0pgspoCtGo+jp


作為參數值通過url地址傳遞,后台接收的值為:
woO3dhpyc2AivXGew S0pgspoCtGo jp

對比后發現"+"沒有了。因為符號“+”和符號“/”是不允許出現在URL中的
於是采用“-”和“_”符號取代。

這下明白了是Base64的問題,我使用的是包org.apache.commons.codec.binary中的類Base64,它構造函數可以傳一個參數urlSafe。

 

  1. Base64 base64 = new Base64(true);//url安全的Base64編碼
  2. return base64.encodeAsString(pasByte);

加密和解密urlSafe都傳true,問題解決了。

 

 

ps:

最近遇到一個坑,在用json字符串加密的過程用DES加密多了“\r\n”,在接收的時候被轉義了,解密的時候也出現了 Input length must be multiple of 8 。

解決辦法,在發送請求之前把多生成的“\r\n”,處理掉就OK了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM