报错的意思的是使用该种解密方式出入长度应为16bit的倍数,但实际的错误却不是这个,错误原因根本上是因为在http请求是特殊字符编码错误,具体就是base64生成的+号,服务器接收时成了空格,然后导致base64解码出的字节数组有改变。

下面来还原并分析一下具体原因:

请求代码:

  1. @Test
  2. public void testHttp() throws Exception {
  3. //16进制字节数组,单纯的为了生成含有+的base64位字符串,是在试了好多遍都没试到+,只能把我错误例子的byte数组转成16进制,为我的机智点个赞
  4. String src = "34aa8bc0adaccbe45ac8c7e43d25955f4d3b51a189339af3d5b968b49764f4def4b81ab285a461504a5cb930c08055f96e875e2b4be390f6708ae686b13e8ff3bed9e9455c638c3809e4c51db05ac3f496be28772829270998eddb9ec6c08c4a0cc1d23e59c6ebe8b73b75013ba9eee5";
  5. byte[] bytes = Hex.decodeHex(src);
  6. String base64Str = Base64.encodeBase64String(bytes);
  7. System.out.println("发送时的字符串:"+base64Str);
  8. for(int i=0;i<bytes.length;i++) {
  9. System.out.println(bytes[i]);
  10. }
  11. String httpUrl = "http://10.20.20.184:10086/dbzx/hello?src="+base64Str;
  12. HttpRequest.doGet(httpUrl);
  13. }

打印结果(部分结果):

  1. 发送时的字符串:NKqLwK2sy+RayMfkPSWVX007UaGJM5rz1blotJdk9N70uBqyhaRhUEpcuTDAgFX5bodeK0vjkPZwiuaGsT6P877Z6UVcY4w4CeTFHbBaw/SWvih3KCknCZjt257GwIxKDMHSPlnG6+i3O3UBO6nu5Q==
  2. 52
  3. -86
  4. -117
  5. -64
  6. -83
  7. -84
  8. -53
  9. -28
  10. 90
  11. -56
  12. -57
  13. -28

服务端代码:

  1. package com.dbzx.controller;
  2.  
  3. import org.apache.commons.codec.binary.Base64;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6.  
  7. import com.dbzx.common.ResultModel;
  8.  
  9. @RestController
  10. @RequestMapping("dbzx")
  11. public class HelloController {
  12.  
  13. @RequestMapping("/hello")
  14. public ResultModel hello(String src) {
  15. System.out.println("接收到的字符串:"+src);
  16. byte[] bytes = Base64.decodeBase64(src);
  17. for(int i=0;i<bytes.length;i++) {
  18. System.out.println(bytes[i]);
  19. }
  20. return ResultModel.ok();
  21. }
  22. }

打印结果(部分结果):

  1. 接收到的字符串:NKqLwK2sy RayMfkPSWVX007UaGJM5rz1blotJdk9N70uBqyhaRhUEpcuTDAgFX5bodeK0vjkPZwiuaGsT6P877Z6UVcY4w4CeTFHbBaw/SWvih3KCknCZjt257GwIxKDMHSPlnG6 i3O3UBO6nu5Q==
  2. 52
  3. -86
  4. -117
  5. -64
  6. -83
  7. -84
  8. -55
  9. 22
  10. -78
  11. 49
  12. -7
  13. 15

通过两端的结果对比可以发现发送前是+,服务器接收的是空格,这是因为有些特殊字符在http请求时是无法编码的,其实base64就是解决类似问题得,只是越来越多的特殊字符,导致它出错。

有些人说base64会把+和空格转成相同的字节码,不会出错,但是我们来对比一下字节码。

可以看到,在第7行开始不对照。

而原本字符串(NKqLwK2sy+)+在第10个位置,跟据base64的规则,4个base64转成的字符串,代表3个原本的字符串,而上图第七个字节,需要"y+"共同构造,这就是出错的原因。既是aes解码出错的原因。

至于16的倍数,理论上只用是偶数位的字节数都满足,显示错误出在其他方面,这个例子就是字节码出错了。

解决的方法有多种:

一、最直接的解决方式,把字符串中的空格,转化成+

  1. str = str.replace(" ", "+");

二、换一种传递参数的方式,保证没有特殊字符,只有数字和字母。

  在我的项目里是为了保aes加密后的数据传输,加密后是byte[],所以我把结果变成16进制的字符串输出,这样接收参数没有改变。

  

  1. String token = Hex.encodeHexString(resultBytes);//发送方转成16进制字符串
  2.  
  3. byte[] tokenBytes = Hex.decodeHex(token);//接收方16进制解码

三、发送发url编码,接收方直接接收不用url解码。

  其实最开始我是用了url编码的,但是结果也是空格,我就放弃了,后来偶然发现,可以直接接收单无需解码。当然,服务端不同可能结果不一样。

  1. token = URLEncoder.encode(token,"utf-8");//发送方Url编码

url请求时,参数中的+在服务器接收时为空格,导致AES加密报出javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher的更多相关文章

  1. ajax请求在参数中添加时间戳

    ajax请求在参数中添加时间戳 参考网址

  2. Objective-C中把URL请求的参数转换为字典

    上一篇博客中是把URL转换为字典,那么我们如何把URL请求中的参数封装成字典,然后再封装成数组呢?对OC中字符串操作熟练的小伙伴们应该觉得这是一个a+b的问题,没错把URL中的参数转换为字典主要是对字 ...

  3. SQL Injection-Http请求的参数中对特殊字符的处理

    1.背景:最近学习webgoat到了SQL Injection的这一课,要完成这一课需要拦截Http请求,修改参数,不过在修改的参数中加入特殊字符才能完成.下面让我们一起来学习吧. 2.题目: 大致翻 ...

  4. RESTFUL风格的URL请求及参数接收

    RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义.RESTFUL适用于移动互联网厂商作为业务使能接口的场景,实现第三方OTT调用移动网络资源 ...

  5. Retrofit2.0+OkHttp打印Request URL(请求地址参数)

    学习了Retrofit中的拦截器功能:实现日志中打印请求头内容 Retrofit 2+ 是基于OKHttp进行封装的,那么也就是说想进行请求拦截然后进行打印出来的话,就必须要从OkHttp进行入手. ...

  6. 在请求的参数中设置可选值列表为当前职责可访问的所有OU

    方法一: 实现此需求的前提之一是为该请求开启多业务实体访问,开启方法 系统管理员->系统管理->并发->程序,进入OAF页面,查询你的并发,然后点更新,选择请求,在业务实体模式下选择 ...

  7. windows系统作为客户端时,linux中本地yum源挂载时,如何同时挂载DVD1和DVD2?

    这里以CentOS6.5为例.他的镜像有两个DVD1和DVD2.DVD1中是系统和主要的安装包,DVD2中是剩下的安装包 当挂载时如果要同时挂载DVD1和DVD2.需要这样做: 1)在虚拟机的设置中选 ...

  8. java 发送post请求参数中含有+会转化为空格的问题

    如题 原因分析:参数在传递过程中经历的几次编码和解码标准不同,导致加号.空格等字符的错误. 解决方案:将post请求的参数中 ,含有+号的,统统采用%2B 去替换,这是URL的协议问题.

  9. BASE64-客户端(js)加码-服务器端(c#)解码,URL传递“汉字参数”解决方法

    HttpUtility.UrlEncode 在 Encode 的时候, 将空格转换成加号('+'), 在 Decode 的时候将加号转为空格, 但是浏览器是不能理解加号为空格的, 所以如果文件名包含了 ...

随机推荐

  1. ABP 从core降到级.net framework

    后台: Application层得先写接口 再写实现,不然 abp.services.app 这个里面就没有该service.并且service保留的接口,就是interface里面定义的接口. 文件 ...

  2. ESA2GJK1DH1K基础篇: 测试APP使用SmartConfig绑定Wi-Fi 设备并控制设备

    前言 实现功能概要 STM32控制WI-Fi模块以AT指令TCP透传方式连接MQTT服务器, 实现MQTT通信控制. 测试准备工作(详细下载步骤请参考 硬件使用说明 ) 一,下载单片机程序 二,安装A ...

  3. vue之父子组件通信

    一. 父-子组件间通信 let children={    template:`<div><h1>{{send}}</h1></div>`,  # 将传 ...

  4. haproxy 配置文件详解 之 listen

    配置示例: listen admin_stats bind mode http log 127.0.0.1 local0 err stats refresh 30s stats uri /haprox ...

  5. mac 下使用nasm

    #安装nasm brew install nasm #创建文件 vi hello.asm 写入如下内容 msg: db "hello world!", 0x0a len: equ ...

  6. Java 集合系列之三:Set基本操作

    1. Java Set 1. Java Set 重要观点 Java Set接口是Java Collections Framework的成员. Set不允许出现重复元素-----------无重复 Se ...

  7. caffe解析

    Caffe支持CUDA,Caffe和TensorFlow没有给出分布式的版本, 可以使用多gpu,Caffe通过直接在执行指令后面加上-gpu 0,1

  8. 【技术博客】利用Python将markdown文档转为html文档

    利用Python将markdown文档转为html文档 v1.0 作者:FZK 元素简单的md文件 Python中自带有一个markdown库,你可以直接这样使用 md_file = open(&qu ...

  9. mysql5.7报错ERROR 1819解决办法

    MySQL5.6.6版本之后增加了密码强度验证插件validate_password,相关参数设置的较为严格. 使用了该插件会检查设置的密码是否符合当前设置的强度规则,若不满足则拒绝设置.影响的语句和 ...

  10. hanlp添加词典不起作用

    不起作用的原因很多,这里列举几个 这里的hanlp我虽然用的maven建立的但是要添加自定义词典,所以没有用maven引入的方式,而是下载了data+hanlp.jar文件          data ...