代码加密解密报异常,Given final block not properly padded

J2EE 码拜 9年前 (2015-04-11) 1321次浏览 0个评论

解密的时候报出这个异常,求大神指导啊!!
代码加密解密报异常,Given final block not properly padded
代码加密解密报异常,Given final block not properly padded
代码加密解密报异常,Given final block not properly padded

代码加密解密报异常,Given final block not properly padded
跪求大神指点啊!!  
代码加密解密报异常,Given final block not properly padded
10分
http://blog.csdn.net/zbz0425/article/details/14223537

http://bbs.csdn.net/topics/390442626?page=1

代码加密解密报异常,Given final block not properly padded
引用 2 楼 shijing266 的回复:

http://blog.csdn.net/zbz0425/article/details/14223537

http://bbs.csdn.net/topics/390442626?page=1

这两篇我都看过 , 和我的情况不太一样 ,我的程序本地调试没遇见过这个问题 ,这是代码放到服务器上后报出的错 !  

代码加密解密报异常,Given final block not properly padded
引用 3 楼 zhangheng1633 的回复:

这两篇我都看过 , 和我的情况不太一样 ,我的程序本地调试没遇见过这个问题 ,这是代码放到服务器上后报出的错 !  

本地没错? 服务器报错?  你本地和服务器用的是同一个容器么  是不是jar包问题

代码加密解密报异常,Given final block not properly padded
引用 4 楼 shijing266 的回复:
Quote: 引用 3 楼 zhangheng1633 的回复:

这两篇我都看过 , 和我的情况不太一样 ,我的程序本地调试没遇见过这个问题 ,这是代码放到服务器上后报出的错 !  

本地没错? 服务器报错?  你本地和服务器用的是同一个容器么  是不是jar包问题

本地请求的时候,用的固定的 url ,  同时也换了其他的 url 都是有加密的 , 但是从来没出现这个错误, 放到服务器上就会偶尔跳出一个来. 不是必出的 是偶尔出现 .

代码加密解密报异常,Given final block not properly padded
10分
在解密前,log记录所有的url, 然后看看出问题的是那几个,然后本地测一下
代码加密解密报异常,Given final block not properly padded
引用 6 楼 shijing266 的回复:

在解密前,log记录所有的url, 然后看看出问题的是那几个,然后本地测一下

嗯 ,有道理 是要详细测试一下

代码加密解密报异常,Given final block not properly padded
10分
一、
DES加密的时候如果一位长度不足64的,它会自动填补到64。解密的时候,会解析你填补的不可见字符。所以就报“提供的字块不符合填补的”异常了。可以尝试用Base64包装一下。

http://stackoverflow.com/questions/8049872/given-final-block-not-properly-padded

http://hi.baidu.com/roadsea/item/ae8e801f5d540aca39cb30e7

二、
块加密算法有三个相关选项。
1、算法 AES/DES/DESede等
2、分组模式 ECB/CBC等。ECB模式每块单独加密,相同的明文会产生相同的密文,不安全。通常用CBC模式(其他模式也可选),CBC模式需要设置一个和块长度相等初始向量(数组)。该向量通常以明文的方式和密文一起给解密者,不同的初始向量可以使相同的明文每次都产生不同的密文。
3、填充模式。块加密时以块为单位的(ASE是128位,16个字节),加密数据最后要添加数据使长度是块长度的整数倍,并且在解密时根据填充的数据可计算出实际的数据长度。通常使用PKCS5PADDING填充算法(也有其他模式可选)。
以上内容如果想了解细节内容请自己百度,网上有许多相关文章。
简单的加密解密可参考如下代码
Java code
static byte[] wrap(String algo,byte[] key,byte[] iv,byte[] data,int mode) throws Exception
    {
        Cipher cipher = Cipher.getInstance(algo + “/CBC/PKCS5PADDING”);
        SecretKeySpec skey = new SecretKeySpec(key,0,Math.min(key.length,Cipher.getMaxAllowedKeyLength(algo)/8),algo);
        IvParameterSpec ivParam = new IvParameterSpec(iv,0,cipher.getBlockSize());
        cipher.init(mode,skey,ivParam);
        return cipher.doFinal(data);
    }
    static byte[] encrypt(String algo,byte[] key,byte[] iv,byte[] data) throws Exception
    {
        return wrap(algo,key,iv,data,Cipher.ENCRYPT_MODE);
    }
    static byte[] decrypt(String algo,byte[] key,byte[] iv,byte[] data) throws Exception
    {
        return wrap(algo,key,iv,data,Cipher.DECRYPT_MODE);
    }
    static byte[] key(String key) throws Exception
    {
        return MessageDigest.getInstance(“MD5”).digest(key.getBytes(“UTF-8”));
    }
    static byte[] iv(long iv)
    {
        byte[] b = new byte[32];
        ByteBuffer.wrap(b).putLong(iv);
        return b;
    }
    static byte[] encrypt(String algo,String key,long iv,String text) throws Exception
    {
        return encrypt(algo,key(key),iv(iv),text.getBytes(“UTF-8″));
    }
    static String decrypt(String algo,String key,long iv,byte[] data) throws Exception
    {
        return new String(decrypt(algo,key(key),iv(iv),data),”UTF-8″);
    }
    public static void main(String[] args) throws Exception
    {
        //初始向量需要明文传递给解密者,以使相同的明文每次都产生不同的密文。
        for(int i=0;i<8;i++)
        {
            String algo = i<4?”AES”:”DES”;
            //long iv = System.nanoTime();
            long iv = i; //每次运行都会输出相同结果
            byte[] data = encrypt(algo,”mypassword”,iv,algo +” encrypt/decrypt sample.”);
            System.out.print(“iv=” + Long.toHexString(iv) + “\t”);
            for(byte b:data)
                System.out.print(” ” + Integer.toHexString(0x100|(0xff&b)).substring(1));
            System.out.println();
            String text = decrypt(algo,”mypassword”,iv,data);
            System.out.println(text);
        }
    }

如果加密/解密时不指定填充方式,则加密/解密的数据必需是块长度的整数倍,否则会出现你遇到的错误。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明代码加密解密报异常,Given final block not properly padded
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!