一、问题说明

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

所以最终代码如下:

程序成功解密:

Android AES加密报错处理:javax.crypto.IllegalBlockSizeException: error:1e00007b:Cipher functions:OPENSSL_internal:WRONG_FINAL_BLOCK_LENGTH的更多相关文章

  1. 我的Android进阶之旅------>解决AES加密报错:java.security.InvalidKeyException: Unsupported key size: 18 bytes

    1.错误描述 今天使用AES进行加密时候,报错如下所示: 04-21 11:08:18.087 27501-27501/com.xtc.watch E/AESUtil.decryptAES:55: j ...

  2. JAVA实现AES 解密报错Input length must be multiple of 16 when decrypting with padded cipher

    加密代码 /**解密 * @param content 待解密内容 * @param password 解密密钥 * @return */ public static byte[] decrypt(b ...

  3. java对称加密报错:Input length must be multiple of 8 when decrypting with padded cipher

    HTTP Status 500 - Request processing failed; nested exception is javax.crypto.IllegalBlockSizeExcept ...

  4. javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher--转载

    原文地址:http://songjianyong.iteye.com/blog/1571029 /** * AESHelper.java * cn.com.songjy.test * * Functi ...

  5. RSA的JAVA实现 及javax.crypto.IllegalBlockSizeException

    一.背景 最近工作中涉及到RSA加密的相关需求任务,之前对加密算法了解不多,开发过程中遇到了一些坑记录一下. 二.RSA原理 RSA加密是非对称加密,公开私钥,保留私钥.通信时数据通过公开的公钥加密, ...

  6. spring security 5.0 密码未加密报错

    使用spring security5.0后,配置文件中直接写普通的密码如:123456,会报错: java.lang.IllegalArgumentException: There is no Pas ...

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

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

  8. Rsa2加密报错java.security.spec.InvalidKeySpecException的解决办法

    最近在和支付宝支付做个对接,Java项目中用到了RSA2进行加解密,在加密过程中遇到了错误: java.security.spec.InvalidKeySpecException: java.secu ...

  9. md5加密报错解决方法(TypeError: Unicode-objects must be encoded before hashing)

    update()必须指定要加密的字符串的字符编码

随机推荐

  1. 【Selenium2】【Shell】

    E:\test_object>Python all_test.py >> report/log.txt 2>&1

  2. oracle中索引的使用

    声明:以下内容是自己跟着教学视屏学习之后整理而来(主要是自用),如有侵权请告知,将尽快删除. 一.索引 1. 概述:数据库对象之一索引用于提高查询效率索引的内建工作对用户是透明的,由数据库自行维护,我 ...

  3. Eclispe中编辑xml配置文件时不会提示也不能自动调整格式

    创建了一个xml文件后,发现编辑起来和原来的那些有所不同,不会提示补全.也不能自动调整格式???woc? 哈哈哈哈哈,“我最恨你像个石头一样” 后来发现是编辑器被改了!!! 右键xml文件然后open ...

  4. Linux下HBase和Maven的环境搭建

    Maven环境部署如下: maven下载并进行环变量配置 export MAVEN_HOME=/home/hadoop/app/apache-maven-3.3.9export PATH=$MAVEN ...

  5. boke例子:用户登录

    boke例子:用户登录 1.首先创建user表,authority表(角色),user_authority,表(用户角色表) Authority实体类,需要继承:GrantedAuthority类, ...

  6. Django使用admin管理后台管理数据库表

    1.在admin.py文件中注册需要创建的表,例: from .models import * # Register your models here. admin.site.register(Use ...

  7. jquery函数加载及生成随机数

    $(document).ready(function () { var code ; //在全局定义验证码 1.将函数写好 function createCode(){ code = "&q ...

  8. 02 爬虫数据解析之re,xpath,beautifulsoup

    一.正则匹配 简单用法演示: 字符: print(re.findall(".","abccc31223dn哈哈")) ### . 匹配除了换行符以外的任意字符, ...

  9. python获取文件路径、文件名、后缀名的实例

    def jwkj_get_filePath_fileName_fileExt(filename): (filepath,tempfilename) = os.path.split(filename); ...

  10. 【Oracle】【5】主键、外键管理

    前言: 1,事实上我是不使用外键的,所以本文只介绍主键 正文: (1)创建表的同时创建主键约束 create table STUDENT ( ID int , NAME varchar(8), AGE ...