AES 加密的一次问题排查
首先描述问题:因为和嵌入式设备通信,在数据在240个以内(包含)的时候,云端解密正常,但是超过240,在240以后有一段乱码。加密算法:AES/CBC/PKCS5Padding+iv
问题起因
嵌入式设备因为某种原因,加密使用的机器本身提供的加密程序,程序设计最大有效加密字段是:240,考虑填充16,最大256.
所以开发人员直接把数据拆开,拆成240段+…+240+…+n。
但是240加密没有填充。然后把加密合并提交,云端并不知道终端这样处理。
造成现象:240+乱码(16)+(240-16)正常+。。。。。。+乱码(16)+正常(n-16)
问题原因
从上面可以看出,都是首部出现的问题。终端开发对加密理解不熟,他理解为:240不填充,分段加密效果是一样的。这个主要是对cbc模式的iv理解不正确造成的。
什么是cbc模式
CBC模式的全称是Cipher Block Chaining模式(密文分组链接模式),之所以叫这个名字,是因为密文分组像链条一样相互连接在一起。
就是传入的iv参与第一个字块的加密,然后后续字块加密把前一个字块的加密结果当成iv。形成链条一样。
结论
所以如果要对cbc模式实现aes分段加密,那么必须遵守一下规则:
- 除最后一个长度外,其他字段的长度必须是16个字节(aes规范)
- 第一个iv使用传入的偏移,后续加密的iv,必须使用上一个数据段加密结果的最后16个字节作为偏移。
- 除最后一个长度外,其他字段加密使用nopadding的模式,不然中间会多出来很多无效字符。ascii 16(填充模式决定的)
遵循以上三个规则,云端就能当成整体来解密了。
完美解决。