一、问题说明

今天写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. React native中的组建通知通信:

    有这么一个需求,在B页面pop()回到A页面,需要A页面执行刷新,那么我们可以采用以下方法: 1:在A页面Push到B页面中,加上一个A页面中的刷新函数做为参数,然后在B页面中在pop()函数封装后通 ...

  2. BZOJ 2754 【SCOI2012】 喵星球上的点名

    题目链接:喵星球上的点名 首先可以发现姓和名两个串就是逗你玩的.在两个串中间插入一个\(10001\),当成一个串做就可以了. 于是我们的问题转化为了: 有\(n\)个串\(A_1,A_2,\dots ...

  3. Ubuntu ls: cannot open directory .: Permission denied

    把该目录赋予权限: sudo chmod xxx

  4. java GUI 返回图片源码

    返回图片源码,重开一个类粘贴即可 package cn.littlepage.game; import java.awt.Image; import java.awt.image.BufferedIm ...

  5. ASP.net MVC模式介绍(一)

    一.ASP.NET 支持三种不同的开发模式:Web Pages(Web 页面).MVC(Model View Controller 模型-视图-控制器)表现层.Web Forms(Web 窗体) mv ...

  6. @@identity与SCOPE_IDENTITY的区别

    @@identity与SCOPE_IDENTITY的区别 共同点: SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值. 不同处:SCOPE_ID ...

  7. C# txt文件的读取与写入

    C#创建记事本方法一://创建对象 FileStream stream = new FileStream(@"d:\aa.txt",FileMode.Create);//fileM ...

  8. try catch对Spring事务的影响

    一.Spring 的默认事务机制,当出现unchecked异常时候回滚,checked异常的时候不会回滚. 异常中unchecked异常包括error和runtime异常.需要try catch或向上 ...

  9. vue中兄弟组件间通讯

    vue2.0中兄弟组件间的通讯是通过eventBus(事件发布订阅)实现的. eventBus.js import Vue from 'vue' const eventBus = new Vue() ...

  10. 认识flask框架

    1.框架的基本认识: 特点:用Python语言实现的轻量.简洁.扩展性强. 核心:werkzeug和Jinja2 2.虚拟环境: 创建:mkvirtualenv -p python3 名称 进入:wo ...