AESUtil_1
package com.tebon.ams.util;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.SecureRandom;
public class AESUtil {
/**
* 功能:生成AES秘钥并写入指定文件中
*
* @param filePath
* 文件夹绝对路径,必须是已存在文件
* @throws Exception
*/
public static void genAESKeyPair(String filePath) throws Exception {
// keySpec 生成对称密钥
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128);
SecretKey secretKey = keyGenerator.generateKey();
SecretKeySpec keySpec = new SecretKeySpec(secretKey.getEncoded(), "AES");
try {
String publicKeyString = Base64.encodeBase64String(keySpec.getEncoded());
System.out.println(publicKeyString);
FileWriter pubfw = new FileWriter(filePath + "AESKey.key");
BufferedWriter pubbw = new BufferedWriter(pubfw);
pubbw.write(publicKeyString);
pubbw.flush();
pubbw.close();
pubfw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取签名
*
* @param data
* 要加签的数据
* @param MD5key
* 加签时使用的key
* @return 签名字符
* @throws Exception
*/
public static String getSignature(String data, String MD5key) throws Exception {
data = data + "|" + MD5key; // data与key
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] b = md.digest(data.getBytes("UTF-8")); // md5签名
return Base64.encodeBase64String(b); // base64转码
};
/**
* AES加密
*
* @param plainTextData
* 要加密的数据
* @param key
* 加密时使用的key
* @return 返回加密后的数据
* @throws Exception
*/
public static String encryptAES(String plainTextData, String key) throws Exception {
// 密钥
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(key.getBytes());
kgen.init(128, secureRandom);
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
// 加密数据
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encryptedData = cipher.doFinal(plainTextData.getBytes("UTF-8"));
return Base64.encodeBase64String(encryptedData); // base64转码
}
/**
* AES解密
*
* @param encryptedData
* 要解密的数据
* @param key
* 解密使用的key
* @return 解密后的数据
* @throws Exception
*/
public static String decryptAES(String encryptedData, String key) throws Exception {
// 密钥
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(key.getBytes());
kgen.init(128, secureRandom);
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
// 解密数据
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] decryptedData = cipher.doFinal(Base64.decodeBase64(encryptedData));
return new String(decryptedData, "UTF-8");
}
/**
* 验签
*
* @param encryptedSignature MD5加签的数�?
* @param plainTextData DATA明文
* @param key MD5 key
* @return
* @throws Exception
*/
public static boolean verify(String encryptedSignature, String plainTextData, String key) throws Exception {
String signature = getSignature(plainTextData, key);
if (encryptedSignature.equals(signature)) {
return true;
}
return false;
}
public static void main(String[] args) throws Exception {
// genAESKeyPair("c:/"); // 生成密钥
String sendStr =
"20171121|25|1|22195560|\r\n"
+"850|CON2015020449|刘崟波|N|13820666177|天津市|120105198001196035||1|37|M|首付款产品|0.16|360|0|FX|1|1|1|0|0|31480000|12592000|0|18888000|0|22195560|4624075|4444721|1|24|20150330|15|2015-04-15|2017-03-29|否||0|0|0|2015-03-26|沃尔沃|S|2010 款T5|沃尔�? C70(进口)|红色|YV1MC6755BJ112639|H|24|\r\n"
+"850|CON2015020449|2015-04-15|2015-04-15|924815|924815|\r\n"
+"850|CON2015020449|2015-05-15|2015-05-15|924815|924815|\r\n"
+"850|CON2015020449|2015-06-15|2015-06-16|924815|924815|\r\n"
+"850|CON2015020449|2015-07-15|2015-07-15|924815|924815|\r\n"
+"850|CON2015020449|2015-08-15|2015-08-15|924815|924815|\r\n"
+"850|CON2015020449|2015-09-15|2015-09-15|924815|924815|\r\n"
+"850|CON2015020449|2015-10-15|2015-10-16|924815|924815|\r\n"
+"850|CON2015020449|2015-11-15|2015-11-15|924815|924815|\r\n"
+"850|CON2015020449|2015-12-15|2015-12-15|924815|924815|\r\n"
+"850|CON2015020449|2016-01-15|2016-01-16|924815|924815|\r\n"
+"850|CON2015020449|2016-02-15|2016-02-15|924815|924815|\r\n"
+"850|CON2015020449|2016-03-15|2016-03-16|924815|924815|\r\n"
+"850|CON2015020449|2016-04-15|2016-04-15|924815|924815|\r\n"
+"850|CON2015020449|2016-05-15|2016-05-16|924815|924815|\r\n"
+"850|CON2015020449|2016-06-15|2016-06-15|924815|924815|\r\n"
+"850|CON2015020449|2016-07-15|2016-07-15|924815|924815|\r\n"
+"850|CON2015020449|2016-08-15|2016-08-16|924815|924815|\r\n"
+"850|CON2015020449|2016-09-15|2016-09-15|924815|924815|\r\n"
+"850|CON2015020449|2016-10-15|2016-10-16|924815|924815|\r\n"
+"850|CON2015020449|2016-11-15||924815|0|\r\n"
+"850|CON2015020449|2016-12-15||924815|0|\r\n"
+"850|CON2015020449|2017-01-15||924815|0|\r\n"
+"850|CON2015020449|2017-02-15||924815|0|\r\n"
+"850|CON2015020449|2017-03-30||924815|0|\r\n";
//加密过程
//MD5加签
String MD5Key = "vVwU4bhXdlSjWHMjxpCcbg==";
String md5Sign = AESUtil.getSignature(sendStr, MD5Key);
String AESKey = "qkMlGXKh0106YuZNW7guzA==";
String aesSendStr = md5Sign +"\r\n"+ sendStr;
System.out.println(md5Sign);
//对MD5加签后的结果进行AES加密
String encryptedData = AESUtil.encryptAES(aesSendStr, AESKey);
//验签过程
//AES解签
String decryptAESStr = AESUtil.decryptAES(encryptedData, AESKey);
//解签后获取Md5加签
String getMd5Sign = decryptAESStr.substring(0,aesSendStr.indexOf("\r\n"));
System.out.println(getMd5Sign);
//解签后获取明
String str = decryptAESStr.substring(aesSendStr.indexOf("\r\n")+2);
System.out.println(str);
//验签
boolean flag = AESUtil.verify(getMd5Sign, str, MD5Key);
System.out.println(flag);
}
}
AESUtil_1的更多相关文章
随机推荐
- Scale-Invariant Error
目录 概 主要内容 代码 Eigen D., Puhrsch C. and Fergus R. Depth Map Prediction from a Single Image using a Mul ...
- vue使用v-chart图表出现的问题
npm i v-charts echarts -S 引入 import VCharts from 'v-charts' Vue.use(VCharts) 后发现报错,后来发现安装echarts版本太高 ...
- [git]git重连
使用以下两个命令清理缓存进行ssh清除:$ssh-keygen -f "/home/leoxae/.ssh/known_hosts" -Rxxx.xxx.xxx.xxx(指定IP) ...
- vue3获取当前路由
正解 使用useRouter: // router的 path: "/user/:uid" <template> <div>user</div> ...
- SpringBoot集成Actuator监控管理
1.说明 本文详细介绍Spring Boot集成Actuator监控管理的方法, 基于已经创建好的Spring Boot工程, 然后引入Actuator依赖, 介绍监控管理相关功能的使用. Sprin ...
- SpringCloud创建Config多客户端公共配置
1.说明 基于已经创建好的Spring Cloud配置中心, 在配置中心仅保存一套配置文件, 多个客户端可以通过配置中心读取到相同的配置, 而不需要在每个客户端重复配置一遍, 下面以一个Config ...
- 初识python: 反射
反射:通过字符串映射或修改程序运行时的状态.属性.方法 反射有以下三个方法: hasattr(object, name) 判断一个对象(object)里是否有对应的字符串(name ...
- Docker_安装和卸载(2)
1.检查是否安装docker docker -v 下图为已安装docker的结果 下图为未安装docker的结果 2.卸载docker 查看已安装的版本 yum list installed | gr ...
- Docker 安装mysql主从
安装docker 1.yum -y install docker 2.查看是否安装成功 docker -v 3.接着将docker后台启动 systemctl start docker.service ...
- 第10组 Alpha冲刺 (6/6)
1.1基本情况 ·队名:今晚不睡觉 ·组长博客:https://www.cnblogs.com/cpandbb/p/14008187.html ·作业博客:https://edu.cnblogs.co ...