package com.panzhihua.common.model.helper;
|
|
import java.io.UnsupportedEncodingException;
|
import java.nio.charset.StandardCharsets;
|
import java.security.InvalidKeyException;
|
import java.security.MessageDigest;
|
import java.security.NoSuchAlgorithmException;
|
import java.security.spec.KeySpec;
|
import java.util.Arrays;
|
import java.util.Base64;
|
|
import javax.crypto.*;
|
import javax.crypto.spec.IvParameterSpec;
|
import javax.crypto.spec.PBEKeySpec;
|
import javax.crypto.spec.SecretKeySpec;
|
|
/**
|
* AES 工具类
|
*/
|
public class AESUtil {
|
|
private static SecretKeySpec secretKey;
|
private static byte[] key;
|
|
/**
|
* AES 256 加密
|
*
|
* @param strToEncrypt
|
* 要加密的字符串
|
* @param secKey
|
* 秘钥
|
* @param salt
|
* 盐
|
* @return 加密后的字符串
|
*/
|
public static String encrypt256(String strToEncrypt, String secKey, String salt) {
|
try {
|
byte[] iv = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
IvParameterSpec ivspec = new IvParameterSpec(iv);
|
|
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
|
KeySpec spec = new PBEKeySpec(secKey.toCharArray(), salt.getBytes(), 65536, 256);
|
SecretKey tmp = factory.generateSecret(spec);
|
SecretKeySpec secretKey = new SecretKeySpec(tmp.getEncoded(), "AES");
|
|
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
|
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivspec);
|
return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes(StandardCharsets.UTF_8)));
|
} catch (Exception e) {
|
System.out.println("Error while encrypting: " + e.toString());
|
}
|
return null;
|
}
|
|
/**
|
* AES 256 解密
|
*
|
* @param strToDecrypt
|
* 要解密的字符串
|
* @param secKey
|
* 秘钥
|
* @param salt
|
* 盐
|
* @return 解密后的字符串
|
*/
|
public static String decrypt256(String strToDecrypt, String secKey, String salt) {
|
try {
|
byte[] iv = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
IvParameterSpec ivspec = new IvParameterSpec(iv);
|
|
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
|
KeySpec spec = new PBEKeySpec(secKey.toCharArray(), salt.getBytes(), 65536, 256);
|
SecretKey tmp = factory.generateSecret(spec);
|
SecretKeySpec secretKey = new SecretKeySpec(tmp.getEncoded(), "AES");
|
|
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
|
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivspec);
|
return new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt)));
|
} catch (Exception e) {
|
System.out.println("Error while decrypting: " + e.toString());
|
}
|
return null;
|
}
|
|
public static void setKey(String myKey) {
|
MessageDigest sha = null;
|
try {
|
key = myKey.getBytes(StandardCharsets.UTF_8);
|
sha = MessageDigest.getInstance("SHA-1");
|
key = sha.digest(key);
|
key = Arrays.copyOf(key, 16);
|
secretKey = new SecretKeySpec(key, "AES");
|
} catch (NoSuchAlgorithmException e) {
|
e.printStackTrace();
|
}
|
}
|
|
/**
|
* AES 128(base64)加密
|
*
|
* @param strToEncrypt
|
* 要加密的字符串
|
* @param secret
|
* 秘钥
|
* @return 加密后的字符串
|
*/
|
public static String encrypt128(String strToEncrypt, String secret)
|
throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException,
|
BadPaddingException, IllegalBlockSizeException {
|
setKey(secret);
|
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
|
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
|
return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes(StandardCharsets.UTF_8)));
|
}
|
|
/**
|
* AES 128(base64) 解密
|
*
|
* @param strToDecrypt
|
* 要解密的字符串
|
* @param secret
|
* 秘钥
|
* @return 解密后的字符串
|
*/
|
public static String decrypt128(String strToDecrypt, String secret) throws NoSuchPaddingException,
|
NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException {
|
setKey(secret);
|
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
|
cipher.init(Cipher.DECRYPT_MODE, secretKey);
|
return new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt)));
|
}
|
|
}
|
|
class AES256Example {
|
public static void main(String[] args) {
|
String originalString = "howtodoinjava.com";
|
|
String secKey = "this is my super secrt key";
|
String salt = "salt for me!!!";
|
String encryptedString = AESUtil.encrypt256(originalString, secKey, salt);
|
String decryptedString = AESUtil.decrypt256(encryptedString, secKey, salt);
|
|
System.out.println(originalString);
|
System.out.println(encryptedString);
|
System.out.println(decryptedString);
|
}
|
}
|
|
class AES128Example {
|
public static void main(String[] args) {
|
String[] originalString = new String[] {"51011234567892013", "13612345678", "四川省成都市高新区", "四川省成都市高新"};
|
|
String key = "5165465461dsfas";
|
|
Arrays.stream(originalString).forEach(os -> {
|
try {
|
String encryptedString = AESUtil.encrypt128(os, key);
|
String decryptedString = AESUtil.decrypt128(encryptedString, key);
|
|
System.out.println(os);
|
System.out.println(encryptedString);
|
System.out.println(decryptedString);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
});
|
}
|
}
|