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的更多相关文章

随机推荐

  1. AUGMIX : A SIMPLE DATA PROCESSING METHOD TO IMPROVE ROBUSTNESS AND UNCERTAINTY

    目录 概 主要内容 实验的指标 Dan Hendrycks, Norman Mu,, et. al, AUGMIX : A SIMPLE DATA PROCESSING METHOD TO IMPRO ...

  2. IT6563替代芯片|DP转HDMI 2.0音视频讯号转换芯片|CS5263Capstpne

    IT6563替代芯片|CS 5263|4LAN DP转HDMI 2.0音视频讯号转换芯片IT6563是一款4LAN EDP转HDMI2.0 HDMI2.0转换器芯片.IT6563FN结合Display ...

  3. MA8621带SD读卡的USB 2.0高速3端口HUB方案芯片|MA8621中文规格书|USB 2.0方案

    MA8621说明 MA8621是USB 2.0高速3端口集线器的高性能解决方案,带有SD卡控制器,完全符合通用串行总线规范2.0.控制器继承了先进的串行接口技术,当3个DS(下游)端口同时工作时,功耗 ...

  4. gojs 如何实现虚线(蚂蚁线)动画?

    在绘制 dag 图时,通过节点和来箭头的连线来表示节点彼此之间的关系.而节点常常又带有状态,为了更好的表示节点之间的流程关系,loading 状态的节点,与后续节点之间,需要用 动画着的虚线 表示,表 ...

  5. HTML网页设计基础笔记 • 【第7章 盒子模型】

    全部章节   >>>> 本章目录 7.1 盒子模型原理 7.1.1 盒子模型概述 7.1.2 盒子的大小 7.1.3 盒子之间的关系 7.2 标准文档流 7.2.1 标准文档流 ...

  6. Linux无法登陆,var目录权限修改导致SSH失败

    1.问题说明 Linux远程服务器突然无法SSH登录了, 登陆报错: ssh_exchange_identification: read: Connection reset by peer. 2.问题 ...

  7. [学习笔记] RabbitMQ的安装使用

    安装 使用命令行安装,会自动管理依赖(推荐): choco install rabbitmq 安装包安装: 以管理员身份安装64位的 Erlang. 下载并安装 RabbitMQ 服务.下载地址. R ...

  8. linux 之 非root用户安装mysql5.7.27

    下载 下载 mysql-5.7.27-linux-glibc2.12-x86_64.tar.gz 详见linux(CentOS7) 之 MySQL 5.7.30 下载及安装. 配置规划 用户: zhj ...

  9. Centos7上传文件和下载文件命令

    https://www.cnblogs.com/patrick-yeh/p/12922829.html 使用工具:SecureCRT 或 Xshell 步骤一:安装lrzsz软件,root权限下.安装 ...

  10. 曾经大量使用的Model1开发模式,虽不常用,但可以帮我们理解JSP

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6513394762370777604/ 1.<JSP页面实际上就是Servlet> 2.<JSP页 ...