zoukankan      html  css  js  c++  java
  • 解决:扰人的报错 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加密多了“ ”,在接收的时候被转义了,解密的时候也出现了 Input length must be multiple of 8 。

    解决办法,在发送请求之前把多生成的“ ”,处理掉就OK了。

  • 相关阅读:
    用于重启Greenbrowser的插件[V1.3]
    奥运开幕式没有八卦
    头像和Karma汽车
    ScribeFire试用
    人生三宝
    月光:一个漂亮的flash
    google chromium浏览器绿色版+升级器+启动器
    firefox 缓存问题导致“载入页面时到服务器的连接被重置”
    生命的使命和程序(V2)
    性,野心和梦
  • 原文地址:https://www.cnblogs.com/xr210/p/13253422.html
Copyright © 2011-2022 走看看