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的更多相关文章
随机推荐
- 使用.NET 6开发TodoList应用(12)——实现ActionFilter
系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 Filter在.NET Web API项目开发中也是很重要的一个概念,它运行在执行MVC响应的Pipeline中执行,允许我们 ...
- iOS提交AppStore审核时:提示有其他支付并隐藏功能被拒的处理办法
背景提示:数字类产品(比如购买会员等不需要配送实物的商品),Apple规定必须使用苹果IAP应用内支付,给Apple分成30%.打包的时候不要勾选微信或支付宝等其他支付方式.如果你提交的包里包含了微信 ...
- Mybatis的联合查询
数据库表结构 department employee 要求一 现在的要求是输入 id 把 employee 表的对应员工数据查询出来,并且查询出该员工的所处部门信息 JavaBean public c ...
- 每天学一点——python用户的交互、格式化输出与基础运算符运用
用户交互 input输入 input接收的数据都是字符串类型 如下图 output输出 还可以相加 换行符 想让他们隔行排列的话就可以这样(如图) 在想各行的开头前面加上\n即可 那若是想将两个输出的 ...
- springboot单元测试为什么排除junit-vintage-engine
https://blog.csdn.net/Ber_Bai/article/details/117001443 如果不排除,就需要使用@RunWith注解? 25-springboot整合单元测试指定 ...
- STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解)
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) 前面 ...
- Linux上天之路(十七)之Shell编程二
一.shell常用工具 grep 1.作用 Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Exp ...
- js实现工具函数中groupBy数据分组
数据 this.tableData = [ {id: 1, name: '测试', number: 1, price: 0}, {id: 2, name: '测试', number: 1, price ...
- redis的bind误区
对于Redis中bind的正确的理解是:bind:是绑定本机的IP地址,(准确的是:本机的网卡对应的IP地址,每一个网卡都有一个IP地址),而不是redis允许来自其他计算机的IP地址.如果指定了bi ...
- Spring系列1:Spring基本概念
本文内容 什么是Spring? 为什么学Spring? 本系列包含哪些技术? 本系列适合哪些人? 什么是Spring? 基本概念 Spring 框架为现代基于 Java 的企业应用程序提供了一个全面的 ...