windows上加解密正常,linux上加密正常,解密时发生如下异常:

javax.crypto.BadPaddingException: Given

final block not properly padded

at

com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)

at

com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)

at

com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA13*..)

at

at chb.test.crypto.AESUtils.crypt(AESUtils.

at

chb.test.crypto.AESUtils.AesDecrypt(AESUtils.

at

chb.test.crypto.AESUtils.main(AESUtils.

解决方法:

经过检查之后,定位在生成KEY的方法上,如下:

public static SecretKey getKey (String strKey)

{ try

{ KeyGenerator _generator = KeyGenerator.getInstance( "AES"

); _generator.init(128, new

SecureRandom(strKey.getBytes())); return _generator.generateKey(); } catch (Exception e) { throw new RuntimeException( " 初始化密钥出现异常 "

); } } 修改到如下方式,问题解决:

public static SecretKey getKey(String strKey)

{ try

{ KeyGenerator _generator = KeyGenerator.getInstance( "AES"

); SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"

); secureRandom.setSeed(strKey.getBytes()); _generator.init(128,secureRandom); return _generator.generateKey(); } catch (Exception e) { throw new RuntimeException( " 初始化密钥出现异常 "

); } }

解决问题。原因分析:

在做加密解密过程中,报错了: javax.crypto.BadPaddingException: Given final

block not properly padded

怎么回事,怎么会不对呢?仔细分析一下,不难发现,该异常是在解密的时候抛出的,加密的方法没有问题。

但是两个方法的唯一差别是Cipher对象的模式不一样,这就排除了程序写错的可能性。再看一下异常的揭示信息,大概的意思是:提供的字块不符合填补的。什么意思???

SecureRandom 实现完全隨操作系统本身的內部狀態,除非調用方在調用 getInstance 方法之後又調用了

setSeed 方法;该实现在 windows 上每次生成的 key 都相同,但是在 solaris 或部分 linux

系统上则不同。

另外在用DES/AES加密的时候,最后一位长度不足64的,它会自动填补到64,那么在我们进行字节数组到字串的转化过程中,可以把它填补的不可见字符改变了,所以引发系统抛出异常。问题找到,怎么解决呢?大家还记得邮件传输通常会把一些信息编码保存,对了,就是Base64,那样保证了信息的完整性,所以我们就是利用一下下了。

可考虑使用base64参与加解密过程,处理字符串和字节数组:

1、加密完byte[] 后,需要将加密了的byte[] 转换成base64保存,如:

BASE64Encoder base64encoder = new BASE64Encoder();

String encode=base64encoder.encode(bytes);

2、解密前,需要将加密后的字符串从base64转回来再解密,如:

BASE64Decoder base64decoder = new BASE64Decoder();

byte[] encodeByte = base64decoder.decodeBuffer(str);

完整写法:

Java代码 package com.travelsky.tdp.pkgStock.util; import java.io.IOException; 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.SecretKeySpec; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; public class SecurityAES { private

final static String encoding =

"UTF-8"; public

static String encryptAES(String content, String password)

{ byte[] encryptResult = encrypt(content,

password); String encryptResultStr =

parseByte2HexStr(encryptResult); // BASE64位加密 encryptResultStr =

ebotongEncrypto(encryptResultStr); return encryptResultStr; } public

static String decrypt(String encryptResultStr, String password)

{ // BASE64位解密 String decrpt =

ebotongDecrypto(encryptResultStr); byte[] decryptFrom =

parseHexStr2Byte(decrpt); byte[] decryptResult = decrypt(decryptFrom,

password); return new String(decryptResult); } public

static String ebotongEncrypto(String str) { BASE64Encoder base64encoder = new

BASE64Encoder(); String result = str; if (str != null && str.length() > 0)

{ try { byte[] encodeByte = str.getBytes(encoding); result = base64encoder.encode(encodeByte); } catch (Exception e) {

aes linux加密 windows解密,解决Linux操作系统下DES、AES解密失败的问题相关推荐

  1. 操作系统原理,系统调用,系统调用与库函数API等函数之间的调用关系,功能与机制设计,系统调用的执行过程与Linux系统调用执行示例,不同操作系统下的PCB

    操作系统原理,系统调用,功能与机制设计,系统调用的执行过程与Linux系统调用执行示例,不同操作系统下的PCB 一.系统调用:操作系统功能调用,用户在编程时可以调用的操作系统功能. 1.系统调用是操作 ...

  2. WSL安装Oracle,折腾记录:WSL(Windows Subsystem for Linux,Windows上的Linux子系统)安装后的环境配置-Go语言中文社区...

    WSL(Windows Subsystem for Linux,Windows上的Linux子系统)的安装比较简单,教程网上较多,此处略过.安装后须要进行一系列配置(如软件源配置.中文配置.图形化配置 ...

  3. 解决不同操作系统下git换行符一致性问题

    解决不同操作系统下git换行符一致性问题 参考文章: (1)解决不同操作系统下git换行符一致性问题 (2)https://www.cnblogs.com/warking/p/5718648.html ...

  4. (转)解决在firefox下js调用as失败问题

    解决在firefox下js调用as失败问题 自:http://www.cnblogs.com/mfryf/archive/2012/04/17/2453024.html 问题描述:写了一个js与as的 ...

  5. linux系统灾难恢复,轻松解决 Linux操作系统故障恢复技巧

    轻松解决 Linux操作系统故障恢复技巧 更新时间:2006年10月24日 00:00:00   作者: 不论你在运行什么操作系统,在很多情况下,你会面对灾难恢复操作.你的主引导区被覆盖,你的硬盘不能 ...

  6. 安装Linux后windows在哪启动,在Linux下安装windows后解决Linux不能启动能问题

    我的机器是Windows和Linux双系统,那天由于Windows用就了比较卡,就重装了一下Windows,结果导致重启后linux系统不知道到哪去了.懒得去重装Linux了,于是查找了一下资料,经过 ...

  7. windows启动linux系统,windows 10 启动linux系统

    windows 10 启动linux系统 [2021-02-18 21:26:20]  简介: 系统运维 Windows中tocmat设置为服务开机启动一 安装Java,tomcat安装jdk,解压t ...

  8. linux arp防火墙关闭,解决linux下arp攻击的方法

    一般Windows用户可以使用antiArp防火墙,但是有些计算专业的朋友们由于工作或其他原因使用的是linux系统,那么linux下arp攻击怎么办呢?下面就是一位高手解决linux下arp攻击的方 ...

  9. linux打开word乱码,解决linux下openoffice word文件转PDF中文乱码的问题

    网上很多介绍是由于jdk中的没有字体导致乱码,而我遇到的是转换过程并未报错,但转换后的PDF中是乱码,尝试在jre/lib/fonts/中增加字体,还是不能解决问题,因此可以判断非jre字体问题,是l ...

最新文章

  1. php ci 处理图片 裁剪,Codeigniter实现智能裁剪图片的方法
  2. Linux移植之内核启动过程引导阶段分析
  3. C# 数据类型及相互转换及常用基础
  4. 51单片机智能小车循迹完整程序_电气与信息工程学院双创协会开展循迹小车培训...
  5. C++_IO类型_文件输入输出流_字符串流
  6. Jmeter打开url时提示“请在微信客户端打开链接问题”
  7. C# 计算程序运行耗时的方法
  8. 彩虹六号按键精灵挂机脚本制作教程
  9. 部分 MP4 视频在谷歌浏览器无法播放
  10. 如何根据电脑显卡选择CUDA版本及显卡驱动
  11. Floating point exception
  12. ELF文件格式, ELF文件是什么,里面包含什么内容
  13. Vue之如何动态渲染.vue文件
  14. 哈工大人工智能暑期课实践项目——手写体识别四则运算(项目计划)
  15. Python实现输出电话号码对应的字母组合
  16. 【关于memset和0x3f3f3f3f】
  17. python自动聊天机器人_用python实现的一个自动聊天的机器人
  18. php 解析pathinfo 类
  19. vue中v-for和v-if不能一起使用
  20. 健身体测微信小程序,新手上路

热门文章

  1. tensorflow2数据读取P3: tf.data.Dataset.from_generator通过preprocessing.image.ImageDataGenerator构造Dataset
  2. 设计师2大必备HTML动画工具
  3. 【鸿蒙开发】hpm-cli的安装避坑、详细使用教程
  4. 解决输入法遮挡布局和华为手机底部虚拟按键遮挡底部界面的方法
  5. 【洛谷】P1164 小A点菜
  6. CPI与PPI剪刀差是什么意思||底层逻辑
  7. 在jmeter5.4版本下成功运行jp@gc - PerfMon Metrics Collector
  8. Get请求与URL编码解码
  9. 中国浏览器市场份额状况(2010年4月)360浏览器对IE构成最大威胁
  10. 苹果手机照片怎么转换成jpg格式?思路提供