• Android AES加密报错处理:javax.crypto.IllegalBlockSizeException: error:1e00007b:Cipher functions:OPENSSL_internal:WRONG_FINAL_BLOCK_LENGTH


    一、问题说明

    今天写AES加/解密功能的apk,设想是四个控件(测试用的,界面丑这种东西请忽略)

    一个编缉框----用于输入要加密的字符串

    一个文本框----用于输出加密后的字符串,和加密后点击解密按钮时解密后的字符串

    一个加密按钮----点击后进行加密

    一个解密按钮----点击后进行解密

    界面如下:

    点击加密没有问题,但再点击解密的时候一直报错:“W/System.err: javax.crypto.IllegalBlockSizeException: error:1e00007b:Cipher functions:OPENSSL_internal:WRONG_FINAL_BLOCK_LENGTH”

    二、报错追踪

    因为用于加解密的类是大学时密码学大作业用过的,基本确定不会有问题,所以将问题确定在传过去的参数有问题上。

    2.1 toString()错误使用

    首先观察发现无论加密字符串内容和长度如何改变,加密的结果总是"[B@xxxxxx"的形式,如下图所示

    这肯定是有问题的----AES作为高强度的加密算法加密内容改变后加密结果开头还是一样这是不可能的,对称加密加密结果长度不随加密内容长短变化这也是不可能的。

    加解密按钮点击事件响应代码如下:

    调试可以看到"[B@xxxxxx"更类似于byte[]的id,而不是其内容

    也就是说,想使用byte_encrypt_result.toString()将byte[]转成String,虽然看起来本该如此但实际上是行不通的。

     

    2.2 byte[]转String再转byte[]内容发生改变引起错误

    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的编码问题是相当令人头疼的,尤其在读写文件和网络通信上,问题能解决就好实在不想深究)

    所以最终代码如下:

    程序成功解密:

  • 相关阅读:
    IOS开发之──应用之间调用(2)
    IOS开发之──应用之间调用(1)
    iOS中Cell高度如何能够自动适应需要显示的内容
    IOS仿Android九宫格解锁效果[转]
    开发一个iOS应用没有那么容易
    iOS的动画效果类型及实现方法
    IOS开发一些资源收集
    10大iOS开发者最喜爱的类库
    IOS键盘样式风格有关设置
    Ios拦截手机短信程序
  • 原文地址:https://www.cnblogs.com/lsdb/p/9324372.html
Copyright © 2020-2023  润新知