ase加密放linux报错_解决Linux下AES解密失败

前段时间,用了个AES加密解密的方法,详见上篇博客AES加密解密。

加解密方法在window上測试的时候没有出现不论什么问题。将加密过程放在安卓上。解密公布到Linuxserver的时候,安卓将加密的结果传到Linux上解密的时候却总是失败,让用户不能成功登录。经过检查,測试后。发现AES在Linux上解密失败,出现错误:

javax.crypto.BadPaddingException: Given final block not properly padded

如今来回想下自己的解决思路:

加密过程是在安卓上,解密是在Linu上,会不会是由于环境的不同,在加密过程中产生的二进制和在解密过程中产生的二进制不一样呢?但是在经过联调后,比对二进制。发现没有问题。那问题是在哪里呢?

继续联调, 细致比对加密和解密过程中每一步产生的结果。发现了问题:

Linux解密端:

发现这里的cipher下的 firstService是有值的。

安卓加密端:

发现这里的cipher下的 firstService是没有值的。

百度后发现:

加密解密方法的唯一区别是Cipher对象的模式不一样,这就排除了程序写错的可能性。

由于错误信息是在宜昌中出现的。其大概意思是:提供的字块不符合填补的。什么意思呢?原来在用加密的时候,最后一位长度不足,它会自己主动补足,那么在我们进行字节数组到字串的转化过程中,能够把它填补的不可见字符改变了。所以系统抛出异常。

问题找到,怎么解决呢?方式例如以下:

package ICT.base.rest.services.app;

import java.io.UnsupportedEncodingException;

import java.security.InvalidKeyException;

import java.security.NoSuchAlgorithmException;

import java.security.SecureRandom;

import javax.crypto.BadPaddingException;

import javax.crypto.Cipher;

import javax.crypto.IllegalBlockSizeException;

import javax.crypto.KeyGenerator;

import javax.crypto.NoSuchPaddingException;

import javax.crypto.SecretKey;

import javax.crypto.spec.IvParameterSpec;

import javax.crypto.spec.SecretKeySpec;

public class AESDecodeUtils {

public static void main(String[] args) {

String content = "g25";

String pwd = "8182838485";

String addPwd = "123456";

// 加密

System.out.println("加密前content:" + content);

byte[] enAccount = encrypt(content, addPwd);

byte[] enPwd = encrypt(pwd, addPwd);

String encryptResultStr = parseByte2HexStr(enAccount);

String parseByte2HexStr2 = parseByte2HexStr(enPwd);

System.out.println("加密后content:" + encryptResultStr);

// 解密 ——账号/身份证号

byte[] accountFrom = AESDecodeUtils.parseHexStr2Byte(encryptResultStr);

byte[] deAccount = AESDecodeUtils.decrypt(accountFrom, addPwd);

String userAccount = new String(deAccount);

System.out.println("解密后content:" + userAccount);

// 解密——密码

byte[] pwdFrom = AESDecodeUtils.parseHexStr2Byte(parseByte2HexStr2);

byte[] deUserPwd = AESDecodeUtils.decrypt(pwdFrom, addPwd);

String userPwd = new String(deUserPwd);

// System.out.println(userPwd);

}

/**

* AES加密

*

* @param content

* 要加密的内容

* @param password

* 加密使用的密钥

* @return 加密后的字节数组

*/

public static byte[] encrypt(String content, String password) {

SecureRandom random = null;

try {

random = SecureRandom.getInstance("SHA1PRNG");

random.setSeed(password.getBytes());

} catch (NoSuchAlgorithmException e1) {

e1.printStackTrace();

}

try {

KeyGenerator kgen = KeyGenerator.getInstance("AES");

// kgen.init(128, new SecureRandom(password.getBytes()));

kgen.init(128, random);

SecretKey secretKey = kgen.generateKey();

byte[] enCodeFormat = secretKey.getEncoded();

SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");

Cipher cipher = Cipher.getInstance("AES");// 创建密码器

byte[] byteContent = content.getBytes("utf-8");

cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化

byte[] result = cipher.doFinal(byteContent);

return result; // 加密

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (NoSuchPaddingException e) {

e.printStackTrace();

} catch (InvalidKeyException e) {

e.printStackTrace();

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

} catch (IllegalBlockSizeException e) {

e.printStackTrace();

} catch (BadPaddingException e) {

e.printStackTrace();

}

return null;

}

/**

* 将二进制转换成16进制 加密

*

* @param buf

* @return

*/

public static String parseByte2HexStr(byte buf[]) {

StringBuffer sb = new StringBuffer();

for (int i = 0; i < buf.length; i++) {

String hex = Integer.toHexString(buf[i] & 0xFF);

if (hex.length() == 1) {

hex = '0' + hex;

}

sb.append(hex.toUpperCase());

}

return sb.toString();

}

/**

* 解密

*

* @param content

* 待解密内容

* @param password

* 解密密钥

* @return

*/

public static byte[] decrypt(byte[] content, String password) {

SecureRandom random = null;

try {

random = SecureRandom.getInstance("SHA1PRNG");

random.setSeed(password.getBytes());

} catch (NoSuchAlgorithmException e1) {

e1.printStackTrace();

}

try {

KeyGenerator kgen = KeyGenerator.getInstance("AES");

// kgen.init(128, new SecureRandom(password.getBytes()));

kgen.init(128, random);

SecretKey secretKey = kgen.generateKey();

byte[] enCodeFormat = secretKey.getEncoded();

SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");

Cipher cipher = Cipher.getInstance("AES");// 创建密码器

cipher.init(Cipher.DECRYPT_MODE, key);// 初始化

byte[] result = cipher.doFinal(content);

return result; // 加密

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (NoSuchPaddingException e) {

e.printStackTrace();

} catch (InvalidKeyException e) {

e.printStackTrace();

} catch (IllegalBlockSizeException e) {

e.printStackTrace();

} catch (BadPaddingException e) {

e.printStackTrace();

}

return null;

}

/**

* 将16进制转换为二进制

*

* @param hexStr

* @return

*/

public static byte[] parseHexStr2Byte(String hexStr) {

if (hexStr.length() < 1)

return null;

byte[] result = new byte[hexStr.length() / 2];

for (int i = 0; i < hexStr.length() / 2; i++) {

int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);

int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2),

16);

result[i] = (byte) (high * 16 + low);

}

return result;

}

}

执行结果:

将加密放到安卓端。解密放大Linux上后,例如以下:

此时cipher下的 firstService不再是Null,都有了值

安卓加密端:

Linux解密端:

总结:

AES是对称加密,解密端改变解密过程。相同,加密端的加密过程也会改变。无论怎么着,调程序还是得要有耐心。用一个东西,其简单主要的原理还是要知道的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机专业接本应用心理学,专接本接应用心理学但遇到阻挠?

沫沫累计帮助了30人我也是学心理的&#xff0c;学姐你好选专业这件事情&#xff0c;有的放弃自己的意愿&#xff0c;走上了不喜欢的那条路&#xff0c;最后结果对自己来说无论如何都是苦的。有的人跟随了自己的意愿&#xff0c;最后结果不好的 又会埋怨父母当初为什么不加以阻拦…

大学计算机一级word,大学计算机基础一级考试复习资料

大学计算机基础一级考试复习资料判断题1. 在Word字体对话框中&#xff0c;选择中文字号越大&#xff0c;实际的字就越大。 答案&#xff1a;错2. 在Excel中&#xff0c;一个工作表可以包含多个工作簿。 答案&#xff1a;错3. 在Word中&#xff0c;图像只能从系统内置的剪辑库中…

计算机程序大赛编程,【小学组】海淀区第三届“智慧杯”中小学生计算机程序设计大赛编程思维类初赛...

强密码描述我们称一个密码是强密码&#xff0c;当且仅当它满足以下所有条件&#xff1a;由 8 − 16 个字符组成至少包含一个大写字母 (A-Z)至少包含一个小写字母 (a-z)至少包含一个数字 (0-9)至少包含一个特殊符号 (! # $ % & * _ )娇娇发现她现在的密码好像不是强密码&am…

linux send 失败_Epoll学习服务器的实现-Linux内核原始Epoll结构

1.Begins~有的人学习linux编程很久&#xff0c;只知道网络编程是socket&#xff0c;bind&#xff0c; listen。。。&#xff0c;然而这些都是网络通信软件最基本的接口。在某网络公司待了y&#xff0c;也了解到公司的基础就是网络转发 &#xff0c;然而网络转发实现并非我们平时…

卫生系统计算机考试内容,2021年卫生资格考试题型是什么样的?一篇搞懂!

根据中国卫生人才网发布的考试通知可知&#xff0c;2021年卫生资格考试除护理学初级(师)专业采用纸笔作答方式进行考试外&#xff0c;其余116个专业均采用人机对话方式进行。那么&#xff0c;什么是人机考试呢&#xff1f;能提前练习吗&#xff1f;为了解决大家的疑惑&#xff…

市面上有哪几种门_选择 low-e门窗玻璃,你想知道的都在这了

最近系统门窗群里&#xff0c;不少读者粉丝在咨询关于Low-e玻璃的问题&#xff0c;大家越来越重视好的门窗对于隔热、隔音、隔辐射的作用。我汇总了群里大家咨询最多的20个问题&#xff0c;希望对大家在挑选门窗玻璃时起到一些帮助。在介绍low-e玻璃前&#xff0c;大家先跟着我…

计算机进制简称,NO.A.0007——二进制;计算机容量单位B、KB、MB、GB和TB关系

一、字节(Byte,简称B)与K、KB、M、MB的关系1、计算机中各种存储容量的单位都是用字节(Byte简为B)来表示&#xff0c;此外还有KB、MB、GB和TB&#xff0c;他们的关系是&#xff1a;1KB1024Bytes2的10次方Bytes1MB1024KB2的20次方Bytes1GB1024MB2的30次方Bytes1TB1024GB2的40次方…

arm中断保护和恢复_嵌入式ARM系统异常和中断处理知识总结

关于异常处理&#xff0c;分为三部分&#xff1a; 1. ARM异常和模式&#xff1a;core处理异常时的操作&#xff0c;几种模式介绍。 2. Vector table&#xff1a; 3. 异常优先级 4. lr偏移&#xff1a;几种异常如何返回异常和中断处理简介在嵌入式系统中异常处理是核心之一。高效…

计算机工作站 曙光,曙光桌面工作站解析

曙光桌面工作站内部架构从整个结构设计来看&#xff0c;整机采用10升小机箱设计&#xff0c;尺寸为326x90x333.4mm&#xff0c;重量在5KG左右&#xff1b;支持垂直放置或横置&#xff0c;节省办公空间。接口方面&#xff0c;整机在前面板提供了4个USB 3.0接口&#xff0c;后置接…

查看网卡命令 uefi_大神教你开机进入UEFI模式的方法,非常简单

启动电脑时&#xff0c;如果要更改启动优先级、启用或禁用安全启动或更改任何其他低级设置&#xff0c;则需要启动到UEFI模式。根据主板制造商的不同&#xff0c;必须按键盘上的特定键或组合键才能进入UEFI模式。尽管初始屏幕显示了需要按下的键&#xff0c;但对于初学者来说却…

计算机网络拓扑结构说课稿,计算机网络应用基础说课稿修稿稿

计算机网络应用基础说课稿修稿稿 (6页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;19.90 积分计算机网络的分类说课稿第1页共6页计算机网络的分类说课稿蓬溪县中等职业技术学校唐湘各位评委老师大家…

扩展源_瑞萨电子推出具备反向充电WattShare TRx模式的 15W无线充电电源P9415R接收器,扩展无线电源产品线...

News全球领先的半导体解决方案供应商瑞萨电子集团(TSE&#xff1a;6723)日前宣布推出采用瑞萨独有WattShareTM技术的P9415-R无线电源接收器&#xff0c;作为其无线电源解决方案的最新成员。新型15W无线电源接收器使智能手机、移动电源以及便携式工业和医疗设备能够对其它具有无…

香港大学计算机硕士一定要面试吗,大干货!!!香港硕士有哪些专业需要笔试面试...

和其它英联邦地区比&#xff0c;香港硕士申请复杂程度更高&#xff0c;除了香港地区不同专业在申请时间、流程及录取要求方面的复杂信息外&#xff0c;很多专业在录取时都有面试笔试也是很重要的原因。很多同学在收到面试笔试后也都会担心自己表现不好被拒。今天就来跟大家说说…

计算机上没有office2010,《我安装了office2010,为什么桌面-右键-新建中没有excel呢?》 excel文件找不到...

为什么在excel2007中新建文档&#xff0c;我的模板里找不到刚刚保存的模板&#xff1f;win10系统/华硕S CA400&#xff1a;C:\Users\Admin\AppData\Roaming\Microsoft\Templates我安装了office2010&#xff0c;为什么桌面-右键-新建中没有excel呢&#xff1f;这个office2010无关…

postgresql存图片字段类型_PostgreSQL 入门

安装、设置、创建和开始使用 PostgreSQL 数据库。-- Greg Pittman&#xff08;作者&#xff09;每个人或许都有需要在数据库中保存的东西。即使你执着于使用纸质文件或电子文件&#xff0c;它们也会变得很麻烦。纸质文档可能会丢失或混乱&#xff0c;你需要访问的电子信息可能会…

ibm服务器 p5 硬盘,IBM虚拟化实战之p5服务器逻辑分区解读

创建 AIX 分区现在您将创建一个 AIX 分区&#xff0c;它使用 VIO Server 的 SEA 来访问网络。它还将其 rootvg 寄宿在 VIO LPAR 上。创建 AIX 服务器分区和概要除了下面的变化以外&#xff0c;创建 AIX 分区和概要的步骤与创建VIO Server 分区和概要部分中的步骤完全相同。1. 在…

cad动态块制作翻转_装X必学,手把手教你做CAD动态属性块

最近很多粉丝后台问熊大&#xff0c;如何制作CAD动态属性块&#xff0c;这个问题把我难到了。因为这个不是一句两句话能够说得清楚的&#xff0c;于是我拿出珍藏的“西蜀鄙夫”写的教程&#xff0c;并通过与我们设计过程的实际需要给大家说说。干货文章&#xff0c;大家耐心看完…

云服务器怎么执行sql文件在哪里,总结帝国CMS下在PHP文件中怎么调用数据库类执行SQL语句实例...

总结帝国CMS下在PHP文件中怎么调用数据库类执行SQL语句实例发布时间&#xff1a;2020-10-19 14:58:08来源&#xff1a;亿速云阅读&#xff1a;83作者&#xff1a;小新这篇文章将为大家详细讲解有关总结帝国CMS下在PHP文件中怎么调用数据库类执行SQL语句实例&#xff0c;小编觉得…

网和aoe网的区别_运动内衣与普通内衣有什么区别?运动内衣里面还需要穿文胸吗? 小家生活网20201002 11:03:04...

阅读本文前&#xff0c;请您先点击上面的“蓝色字体可以说爱情就是他们最大的软肋。不会在双鱼女那出现。在对于周边的亲戚时。她们那种温柔大方的气势。更符合妈妈的需求。整双腿没有视觉连贯性。但唯独感情这件事一直是水瓶们的知识盲区。他们双商超高。可能最开始还是会去挽…

机器人无限火力无限e符文_LOL:无限火力开黑指南 三大玩法让你快乐加倍

无限火力上线以来受到大家的热烈追捧&#xff0c;今天给大家介绍几个主流的系列&#xff0c;让你在峡谷能够感受到双倍的快乐&#xff01;超强控制流这一类英雄都是带有强力控制的&#xff0c;无限火力的80%减CD&#xff0c;能够让女坦等英雄可以打出长达几秒的完美控制技能。首…