写在前面

安全测试ECB模式过于简单需要改为CBC模式加密以下为工具类及测试

AESUtils.java

package com.sgcc.mobile.utils;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder; import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*; /**
* AES加密128位CBC模式工具类
*/
public class AESUtils { //算法/加密模式/填充方式
private static final String ALGORITHMSTR = "AES/CBC/PKCS5Padding";//"算法/模式/补码方式" //解密密钥(自行随机生成)
public static final String KEY = "qxhzngy266a186ke";//秘钥key
public static final String IV = "1ci5crnda6ojzgtr";//偏移量iv //认证密钥(自行随机生成)
public static final String AK = "s2ip9g3y3bjr5zz7ws6kjgx3ysr82zzw";//AccessKey
public static final String SK = "uv8zr0uen7aim8m7umcuooqzdv8cbvtf";//SecretKey //加密
public static String encrypt(String content) throws Exception {
byte[] raw = KEY.getBytes("utf-8");
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
//使用CBC模式,需要一个向量iv,可增加加密算法的强度
IvParameterSpec ips = new IvParameterSpec(IV.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ips);
byte[] encrypted = cipher.doFinal(content.getBytes());
return new BASE64Encoder().encode(encrypted);
} //解密
public static StringBuffer decrypt(String content) throws Exception {
try {
byte[] raw = KEY.getBytes("utf-8");
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
IvParameterSpec ips = new IvParameterSpec(IV.getBytes());
cipher.init(Cipher.DECRYPT_MODE, skeySpec, ips);
byte[] encrypted1 = new BASE64Decoder().decodeBuffer(content);
try {
byte[] original = cipher.doFinal(encrypted1);
StringBuffer originalString = new StringBuffer(new String(original));
return originalString;
} catch (Exception e) {
System.out.println(e.toString());
return null;
}
} catch (Exception ex) {
System.out.println(ex.toString());
return null;
}
} //获取认证签名(身份认证需要)
public static String getSign(String currentTime) throws Exception {
String sign = "";
Map<String, Object> map = new HashMap<String, Object>();
map.put("ak", AK);
map.put("sk", SK);
map.put("ts", currentTime);
//获取 参数字典排序后字符串
String decrypt = getOrderMap(map);
try {
//指定sha1算法
MessageDigest digest = MessageDigest.getInstance("SHA-1");
digest.update(decrypt.getBytes());
//获取字节数组
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexString = new StringBuffer();
// 字节数组转换为十六进制数
for (int i = 0; i < messageDigest.length; i++) {
String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
if (shaHex.length() < 2) {
hexString.append(0);
}
hexString.append(shaHex);
}
sign = hexString.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return sign;
} //获取参数的字典排序
private static String getOrderMap(Map<String, Object> maps) {
List<String> paramNames = new ArrayList<String>();
for (Map.Entry<String, Object> entry : maps.entrySet()) {
paramNames.add(entry.getValue().toString());
}
Collections.sort(paramNames);
StringBuilder paramStr = new StringBuilder();
for (String paramName : paramNames) {
paramStr.append(paramName);
}
return paramStr.toString();
} // public static void main(String[] args) {
//
// String mw = "123qwe!@#";
// StringBuffer stringBuffer = new StringBuffer();
//
// try {
// String en = encrypt(mw);
// StringBuffer append = stringBuffer.append(en);
// System.out.println("加密" + append.toString());//w8RzmA/N1zPTRBKCYjoJgQ==
// StringBuffer decrypt = decrypt(append.toString());
// System.out.println("解密" + decrypt);//123qwe!@#
// } catch (Exception e) {
// e.printStackTrace();
// }
//
// } }

注意事项

需要注意的是, 在获取解密后的内容后是由StringBuffer接收的, 解密内容使用完毕需要将StringBuffer清空, 不得不说也太安全了...

StringBuffer清空方式有三种, 可参考如下方式:

// 清空sb
sb.setLength(0);//或sb.delete(0,sb.length());或sb = new StringBuffer();

感谢

AES采用CBC模式128bit加密工具类的更多相关文章

  1. java 加密工具类(MD5、RSA、AES等加密方式)

    1.加密工具类encryption MD5加密 import org.apache.commons.codec.digest.DigestUtils; /** * MD5加密组件 * * @autho ...

  2. Java AES 加密工具类

    package com.microwisdom.utils; import java.security.NoSuchAlgorithmException; import java.security.S ...

  3. Python实现AES的CBC模式加密和解密过程详解 和 chr() 函数 和 s[a:b:c] 和函数lambda

    1.chr()函数 chr() 用一个范围在 range(256)内的(就是0-255)整数作参数,返回一个对应的字符. 2.s[a:b:c] s=(1,2,3,4,5) 1>. s[a]下标访 ...

  4. App开发流程之加密工具类

    科技优家 2016-09-08 18:10 从这篇记录开始,记录的都算是干货了,都是一些编程日常的积累. 我建议先将基础的工具加入项目,后续的开发效率会呈指数增长.如果在专注功能开发过程中,才发现缺少 ...

  5. c# 加密工具类

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Sec ...

  6. 加密工具类 - CryptoUtils.java

    加密工具类,包含MD5,BASE64,SHA,CRC32的加密与解密方法. 源码如下:(点击下载  - CryptoUtils.java.commons-io-2.4.jar.commons-code ...

  7. android开发MD5加密工具类(一)

    MD5加密工具类整理: package com.gzcivil.utils; import java.io.UnsupportedEncodingException; import java.secu ...

  8. wemall app商城源码android开发MD5加密工具类

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享android开发MD5加密工具类主要代码,供 ...

  9. java MD5Utils 加密工具类

    package com.sicdt.library.core.utils; import java.io.File; import java.io.FileInputStream; import ja ...

随机推荐

  1. windows 2003 windows 2008 windows 2012 导出域控hash的方法

    quarkspwdump作者介绍的用法: 1. Windows 2008       Microsoft recently implements VSS (Volume Shadow Copy Ser ...

  2. 医疗行业预测性产品的质量如何把关?MES系统帮大忙

    作为行业细分的医疗设备制造正在向工业4.0快速发展.它也可能仍然是世界上受监管最严格的行业之一,产品的个性化发展速度比其他行业更快. 在医疗设备行业中,由于需求或由于市场特定的规定,产品越来越多地定制 ...

  3. Hibernate 5.x 配置 C3P0 数据库连接池

    Hibernate 5.x 配置 C3P0 连接池 首先准备好需要的 jar 包,这里我准备的是 Hibernate 5.2.10 版本: hibernate-core-5.2.10.Final.ja ...

  4. JavaScript基础内容中的函数详解

    函数 函数:即方法 函数就是一段预先设置的功能代码块,可以反复调用,根据输入参数的不同,返回不同的值. 为什么使用函数: 1.方便调用 2.代码重用,利于维护 3.便于修改,便于重构 4.简化逻辑,利 ...

  5. pyechart基本使用大全

    charts_base 原文链接:https://blog.csdn.net/weixin_43735353/article/details/89328048 图表详细配置请参考 图表配置篇 基本图表 ...

  6. chrome开发者工具--使用 Network 面板测量您的网站网络性能。

    转自:Tools for Web Developers   Network 面板记录页面上每个网络操作的相关信息,包括详细的耗时数据.HTTP 请求与响应标头和 Cookie,等等. TL;DR 使用 ...

  7. Beta冲刺(5/7)——2019.5.26

    所属课程 软件工程1916|W(福州大学) 作业要求 Beta冲刺(5/7)--2019.5.26 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪万里 ...

  8. JMeter的执行顺序

    JMeter执行顺序如下:1.配置元件2.前置处理器3.定时器4.采样器5.后置处理器(除非服务器响应为空)6.断言(除非服务器响应为空)7.监听器(除非服务器响应为空) 只有当作用域内存在采样器时, ...

  9. SpringBoot——经典的Hello World【二】

    前言 来创建个hello world 呗 步骤 首先肯定是要打开我们的IDEA来创建一个Maven的项目哈 创建项目 1. File->New->Project 2.Maven->J ...

  10. sqoop2相关实例:hdfs和mysql互相导入(转)

    原文地址:http://blog.csdn.net/dream_an/article/details/74936066 超详细讲解Sqoop2应用与实践 2017年07月10日 20:06:57 阅读 ...