package com.lcjian.library.util.security;
|
|
import java.io.UnsupportedEncodingException;
|
import java.nio.charset.StandardCharsets;
|
import java.security.InvalidKeyException;
|
import java.security.NoSuchAlgorithmException;
|
import java.security.SecureRandom;
|
|
import javax.crypto.BadPaddingException;
|
import javax.crypto.Cipher;
|
import javax.crypto.IllegalBlockSizeException;
|
import javax.crypto.KeyGenerator;
|
import javax.crypto.NoSuchPaddingException;
|
import javax.crypto.SecretKey;
|
import javax.crypto.spec.SecretKeySpec;
|
|
public class AEScrypt {
|
|
/**
|
* 加密
|
*
|
* @param content
|
* 需要加密的内容
|
* @param password
|
* 加密密码
|
* @return
|
*/
|
public static byte[] encrypt(String content, String password) {
|
try {
|
KeyGenerator kgen = KeyGenerator.getInstance("AES");
|
kgen.init(128, new SecureRandom(password.getBytes()));
|
SecretKey secretKey = kgen.generateKey();
|
byte[] enCodeFormat = secretKey.getEncoded();
|
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
|
Cipher cipher = Cipher.getInstance("AES");// 创建密码器
|
byte[] byteContent = content.getBytes(StandardCharsets.UTF_8);
|
cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
|
byte[] result = cipher.doFinal(byteContent);
|
return result; // 加密
|
} catch (NoSuchAlgorithmException e) {
|
e.printStackTrace();
|
} catch (NoSuchPaddingException e) {
|
e.printStackTrace();
|
} catch (InvalidKeyException e) {
|
e.printStackTrace();
|
} catch (IllegalBlockSizeException e) {
|
e.printStackTrace();
|
} catch (BadPaddingException e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
/**
|
* 解密
|
*
|
* @param content
|
* 待解密内容
|
* @param password
|
* 解密密钥
|
* @return
|
*/
|
public static byte[] decrypt(byte[] content, String password) {
|
try {
|
KeyGenerator kgen = KeyGenerator.getInstance("AES");
|
kgen.init(128, new SecureRandom(password.getBytes()));
|
SecretKey secretKey = kgen.generateKey();
|
byte[] enCodeFormat = secretKey.getEncoded();
|
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
|
Cipher cipher = Cipher.getInstance("AES");// 创建密码器
|
cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
|
byte[] result = cipher.doFinal(content);
|
return result; // 加密
|
} catch (NoSuchAlgorithmException e) {
|
e.printStackTrace();
|
} catch (NoSuchPaddingException e) {
|
e.printStackTrace();
|
} catch (InvalidKeyException e) {
|
e.printStackTrace();
|
} catch (IllegalBlockSizeException e) {
|
e.printStackTrace();
|
} catch (BadPaddingException e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
private static String bytesToHexString(byte[] bytes) {
|
// http://stackoverflow.com/questions/332079
|
StringBuilder sb = new StringBuilder();
|
for (int i = 0; i < bytes.length; i++) {
|
String hex = Integer.toHexString(0xFF & bytes[i]);
|
if (hex.length() == 1) {
|
sb.append('0');
|
}
|
sb.append(hex);
|
}
|
return sb.toString();
|
}
|
|
/**
|
* 将16进制转换为二进制
|
*
|
* @param hexStr
|
* @return
|
*/
|
public static byte[] hexStringToBytes(String hexStr) {
|
if (hexStr.length() < 1)
|
return null;
|
byte[] result = new byte[hexStr.length() / 2];
|
for (int i = 0; i < hexStr.length() / 2; i++) {
|
int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
|
int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
|
result[i] = (byte) (high * 16 + low);
|
}
|
return result;
|
}
|
}
|