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

酷酷小鱼 2014-09-24 10:32:43
解密的时候报出这个异常,求大神指导啊!!


...全文
3405 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
在解密前,log记录所有的url, 然后看看出问题的是那几个,然后本地测一下
酷酷小鱼 2014-09-24
  • 打赏
  • 举报
回复
引用 4 楼 shijing266 的回复:
[quote=引用 3 楼 zhangheng1633 的回复:] 这两篇我都看过 , 和我的情况不太一样 ,我的程序本地调试没遇见过这个问题 ,这是代码放到服务器上后报出的错 !
本地没错? 服务器报错? 你本地和服务器用的是同一个容器么 是不是jar包问题[/quote] 本地请求的时候,用的固定的 url , 同时也换了其他的 url 都是有加密的 , 但是从来没出现这个错误, 放到服务器上就会偶尔跳出一个来. 不是必出的 是偶尔出现 .
  • 打赏
  • 举报
回复
引用 3 楼 zhangheng1633 的回复:
这两篇我都看过 , 和我的情况不太一样 ,我的程序本地调试没遇见过这个问题 ,这是代码放到服务器上后报出的错 !
本地没错? 服务器报错? 你本地和服务器用的是同一个容器么 是不是jar包问题
酷酷小鱼 2014-09-24
  • 打赏
  • 举报
回复
引用 2 楼 shijing266 的回复:
http://blog.csdn.net/zbz0425/article/details/14223537 http://bbs.csdn.net/topics/390442626?page=1
这两篇我都看过 , 和我的情况不太一样 ,我的程序本地调试没遇见过这个问题 ,这是代码放到服务器上后报出的错 !
酷酷小鱼 2014-09-24
  • 打赏
  • 举报
回复
跪求大神指点啊!!
ghx287524027 2014-09-24
  • 打赏
  • 举报
回复
一、 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); } } 如果加密/解密时不指定填充方式,则加密/解密的数据必需是块长度的整数倍,否则会出现你遇到的错误。
酷酷小鱼 2014-09-24
  • 打赏
  • 举报
回复
引用 6 楼 shijing266 的回复:
在解密前,log记录所有的url, 然后看看出问题的是那几个,然后本地测一下
嗯 ,有道理 是要详细测试一下

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧