WindChat/windchat-common/src/main/java/com/windchat/common/crypto/AESCrypto.java
2019-11-27 23:33:35 +08:00

104 lines
2.6 KiB
Java
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.windchat.common.crypto;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.windchat.common.constant.CharsetCoding;
public class AESCrypto {
private static final Logger logger = LoggerFactory.getLogger(AESCrypto.class);
/**
* <pre>
* AES四种加密模式
* ECB模式有利于并行计算
* CBC模式不容易攻击安全性高于ECB模式适合传输长度长的报文是SSLIPSec的标准不利于并行计算
* CFB模式不利于并行计算
* OFB模式不利于并行计算
* </pre>
*/
public static final String ALGORITHM = "AES/ECB/PKCS5Padding";
/**
* 随机生成AES加密解密KEY
*
* @return
*/
public static byte[] generateTSKey() {
try {
KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(128);
SecretKey secretKey = kg.generateKey();
return secretKey.getEncoded();
} catch (Exception e) {
logger.error("generate ts key error", e);
}
return null;
}
/**
* 通过key生成AES加密解密key
*
* @param key
* @return
*/
public static byte[] generateTSKey(String key) {
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(key.getBytes(CharsetCoding.ISO_8859_1));
kgen.init(128, secureRandom);
SecretKey secretKey = kgen.generateKey();
return secretKey.getEncoded();
} catch (Exception e) {
logger.error("generate ts key error by key=" + key, e);
}
return null;
}
/**
* 加密内容
*
* @param tsk
* @param content
* @return
*/
public static byte[] encrypt(byte[] tsk, byte[] content) {
try {
SecretKeySpec key = new SecretKeySpec(tsk, "AES");
Cipher cipher = Cipher.getInstance(ALGORITHM);// 创建密码器
cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
return cipher.doFinal(content);
} catch (Exception e) {
logger.error("aes encrypt error tsk-size={} content-size={}", tsk.length, content.length);
}
return null;
}
/**
* 解密内容
*
* @param tsk
* @param content
* @return
*/
public static byte[] decrypt(byte[] tsk, byte[] content) {
try {
SecretKeySpec key = new SecretKeySpec(tsk, "AES");
Cipher cipher = Cipher.getInstance(ALGORITHM);// 创建密码器
cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
return cipher.doFinal(content);
} catch (Exception e) {
logger.error("AES decrypt error,tsk-len={} content-len={}", tsk.length, content.length);
}
return null;
}
}