package com.scai.dispatcher.util;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
/**
* @author
*/
public class AESUtil {
/**
* AES加密算法-加密
* @param data
* @param key
* @return
* @throws Exception
*/
public static String aesEncrypt(String data, String key){
String str = "";
try {
byte[] kb = key.getBytes("utf-8");
SecretKeySpec sks = new SecretKeySpec(kb, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//算法/模式/补码方式
cipher.init(Cipher.ENCRYPT_MODE, sks);
byte[] eb = cipher.doFinal(data.getBytes("utf-8"));
return new BASE64Encoder().encode(eb);
}catch (Exception e){
e.printStackTrace();
return str;
}
}
/**
* AES加密算法-加密,采用密钥生成器keygenerator的方式
* @param data
* @param key
* @return
* @throws Exception
*/
public static String aesEncryptBak(String data, String key){
String str = "";
try {
//构造秘钥生成器
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" );
secureRandom.setSeed(key.getBytes("utf-8"));
kgen.init(128,secureRandom);
// kgen.init(128, new SecureRandom(key.getBytes()));
//产生原始对称密钥
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
//生成密钥
SecretKeySpec keySpec = new SecretKeySpec(enCodeFormat, "AES");
//AES加密算法
//算法/模式/补码方式
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
byte[] byteContent = data.getBytes("utf-8");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
byte[] result = cipher.doFinal(byteContent);
//base64处理
str = new BASE64Encoder().encode(result);
} catch (Exception e){
e.printStackTrace();
}
return str;
}
/**
* AES加密算法-解密
* @param data
* @param key
* @return
* @throws Exception
*/
public static String aesDecrypt(String data, String key) {
String str = "";
try {
byte[] buf = new BASE64Decoder().decodeBuffer(data);
byte[] kb = key.getBytes("utf-8");
SecretKeySpec sks = new SecretKeySpec(kb, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//算法/模式/补码方式
cipher.init(Cipher.DECRYPT_MODE, sks);
byte[] eb = cipher.doFinal(buf);
return new String(eb);
}catch (Exception e){
e.printStackTrace();
return str;
}
}
/**
* AES加密算法-解密,采用密钥生成器keygenerator的方式
* @param data
* @param key
* @return
* @throws Exception
*/
public static String aesDecryptBak(String data, String key) {
String str = "";
try {
//base64处理
byte[] buf = new BASE64Decoder().decodeBuffer(data);
//构造秘钥生成器
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" );
secureRandom.setSeed(key.getBytes("utf-8"));
kgen.init(128,secureRandom);
// kgen.init(128, new SecureRandom(key.getBytes()));
//产生原始对称密钥
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
//生成密钥
SecretKeySpec keySpec = new SecretKeySpec(enCodeFormat, "AES");
//AES加密算法
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, keySpec);
byte[] result = cipher.doFinal(buf);
str = new String(result,"utf-8");
}catch (Exception e){
e.printStackTrace();
}
return str;
}
}
package com.scai.dispatcher.util;
import java.util.HashMap;
import java.util.Map;
/**
* <p>加密与签名DEMO,同时也包含了验签与解密的DEMO</p>
* <ol>
* <li>以下DEMO针对接口为例,展示了加密加签的工具使用方法</li>
* <li>以下DEMO针对为例,展示了验签解密工具的使用方法</li>
* <li>签名采用MD5对<strong>{secretKey}+参数字符串</strong>做签名;</li>
* <li>加密采用AES加密算法对每个参数的参数值做加密,DEMO中对每个值做加密后重新放入了新的Map中</li>
* </ol>
* <p>其中本DEMO中所使用的<strong>SECRET_KEY</strong>只是演示所用,实际开发时需要替换成为真正提供的秘钥</p>
*
*
* @Author Cosmo Zhu
* @Date 2018/12/4 15:53
* @email cosmo.zhu@scai-global.com
* @copyright 2018 SCAI-GLOBAL All Rights Reserved.
**/
public class EncrptAndSign {
/**
*
*/
final public static String SECRET_KEY = "testsecret";
public Map encrpt(Map<String, String> param, String secrectKey) {
Map<String, String> encrptResult = new HashMap<String, String>();
//加密
for (Map.Entry<String, String> entry : param.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
String encrypt = AESUtil.aesEncrypt(value, secrectKey);
encrptResult.put(key, encrypt);
}
return encrptResult;
}
public String sign(Map param, String secretKey) {
return SignUtil.sign(param, secretKey);
}
public boolean validateSign(String secretKey, Map<String, String> param) {
return SignUtil.validateSign(param, secretKey);
}
public Map<String, String> DeEncrpt(Map<String, String> encrptResult, String secretKey) {
Map<String, String> deEncrptResult = new HashMap<String, String>();
for (Map.Entry<String, String> entry : encrptResult.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
String deEncrptMsg = AESUtil.aesDecrypt(value, secretKey);
deEncrptResult.put(key, deEncrptMsg);
}
return deEncrptResult;
}
}