今天写AES加/解密功能的apk,设想是四个控件(测试用的,界面丑这种东西请忽略)html
一个编缉框----用于输入要加密的字符串java
一个文本框----用于输出加密后的字符串,和加密后点击解密按钮时解密后的字符串算法
一个加密按钮----点击后进行加密网络
一个解密按钮----点击后进行解密测试
界面以下:编码
点击加密没有问题,但再点击解密的时候一直报错:“W/System.err: javax.crypto.IllegalBlockSizeException: error:1e00007b:Cipher functions:OPENSSL_internal:WRONG_FINAL_BLOCK_LENGTH”加密
由于用于加解密的类是大学时密码学大做业用过的,基本肯定不会有问题,因此将问题肯定在传过去的参数有问题上。.net
首先观察发现不管加密字符串内容和长度如何改变,加密的结果老是"[B@xxxxxx"的形式,以下图所示调试
这确定是有问题的----AES做为高强度的加密算法加密内容改变后加密结果开头仍是同样这是不可能的,对称加密加密结果长度不随加密内容长短变化这也是不可能的。htm
加解密按钮点击事件响应代码以下:
调试能够看到"[B@xxxxxx"更相似于byte[]的id,而不是其内容
也就是说,想使用byte_encrypt_result.toString()将byte[]转成String,虽然看起来本该如此但其实是行不通的。
toString()不能用,而后看到这位小哥哥说能够经过new String(byte[]),文章写得很清晰一看就是高手我是很相信他的。因此代码就改为了下边这个样子
加密结果是一堆乱码,很好,这就是咱们想要的
可是点击解密,依然同样报错“W/System.err: javax.crypto.IllegalBlockSizeException: error:1e00007b:Cipher functions:OPENSSL_internal:WRONG_FINAL_BLOCK_LENGTH”
代码逻辑看起来彻底没有问题,怎么还会报错呢。通过反复调试观察到,解密时获取的byte_encrypt_result内容和长度彻底不同(在前面是byte[16]这里变成了byte[28])
也就是说,在new String(byte[])到toString().getBytes()再取回byte[]这个过程当中,byte[]内容发生了变化
百度“byte[]转string再转回byte[]”,看到好像说new String()默认使用UTF-8编码getBytes()默认使用ISO8859-1编码引起了问题,指定new String()和getBytes()统一使用ISO8859-1便可解决问题。(我以为java的编码问题是至关使人头疼的,尤为在读写文件和网络通讯上,问题能解决就好实在不想深究)
因此最终代码以下:
程序成功解密: