package com.xjf.repository.utils;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import static com.xjf.repository.utils.ConvertUtils.*;
/**
* <pre>
* author: Blankj
* blog : http://blankj.com
* time : 2016/8/2
* desc : 加密解密相关的工具类
* </pre>
*/
public class EncryptUtils {
private EncryptUtils() {
throw new UnsupportedOperationException("u can't fuck me...");
}
/*********************** 哈希加密相关 ***********************/
/**
* MD2加密
*
* @param data 明文字符串
* @return 16进制密文
*/
public static String encryptMD2ToString(String data) {
return encryptMD2ToString(data.getBytes());
}
/**
* MD2加密
*
* @param data 明文字节数组
* @return 16进制密文
*/
public static String encryptMD2ToString(byte[] data) {
return bytes2HexString(encryptMD2(data));
}
/**
* MD2加密
*
* @param data 明文字节数组
* @return 密文字节数组
*/
public static byte[] encryptMD2(byte[] data) {
return encryptAlgorithm(data, "MD2");
}
/**
* MD5加密
*
* @param data 明文字符串
* @return 16进制密文
*/
public static String encryptMD5ToString(String data) {
return encryptMD5ToString(data.getBytes());
}
/**
* MD5加密
*
* @param data 明文字符串
* @param salt 盐
* @return 16进制加盐密文
*/
public static String encryptMD5ToString(String data, String salt) {
return bytes2HexString(encryptMD5((data + salt).getBytes()));
}
/**
* MD5加密
*
* @param data 明文字节数组
* @return 16进制密文
*/
public static String encryptMD5ToString(byte[] data) {
return bytes2HexString(encryptMD5(data));
}
/**
* MD5加密
*
* @param data 明文字节数组
* @param salt 盐字节数组
* @return 16进制加盐密文
*/
public static String encryptMD5ToString(byte[] data, byte[] salt) {
byte[] dataSalt = new byte[data.length + salt.length];
System.arraycopy(data, 0, dataSalt, 0, data.length);
System.arraycopy(salt, 0, dataSalt, data.length, salt.length);
return bytes2HexString(encryptMD5(dataSalt));
}
/**
* MD5加密
*
* @param data 明文字节数组
* @return 密文字节数组
*/
public static byte[] encryptMD5(byte[] data) {
return encryptAlgorithm(data, "MD5");
}
/**
* SHA1加密
*
* @param data 明文字符串
* @return 16进制密文
*/
public static String encryptSHA1ToString(String data) {
return encryptSHA1ToString(data.getBytes());
}
/**
* SHA1加密
*
* @param data 明文字节数组
* @return 16进制密文
*/
public static String encryptSHA1ToString(byte[] data) {
return bytes2HexString(encryptSHA1(data));
}
/**
* SHA1加密
*
* @param data 明文字节数组
* @return 密文字节数组
*/
public static byte[] encryptSHA1(byte[] data) {
return encryptAlgorithm(data, "SHA-1");
}
/**
* SHA224加密
*
* @param data 明文字符串
* @return 16进制密文
*/
public static String encryptSHA224ToString(String data) {
return encryptSHA224ToString(data.getBytes());
}
/**
* SHA224加密
*
* @param data 明文字节数组
* @return 16进制密文
*/
public static String encryptSHA224ToString(byte[] data) {
return bytes2HexString(encryptSHA224(data));
}
/**
* SHA224加密
*
* @param data 明文字节数组
* @return 密文字节数组
*/
public static byte[] encryptSHA224(byte[] data) {
return encryptAlgorithm(data, "SHA-224");
}
/**
* SHA256加密
*
* @param data 明文字符串
* @return 16进制密文
*/
public static String encryptSHA256ToString(String data) {
return encryptSHA256ToString(data.getBytes());
}
/**
* SHA256加密
*
* @param data 明文字节数组
* @return 16进制密文
*/
public static String encryptSHA256ToString(byte[] data) {
return bytes2HexString(encryptSHA256(data));
}
/**
* SHA256加密
*
* @param data 明文字节数组
* @return 密文字节数组
*/
public static byte[] encryptSHA256(byte[] data) {
return encryptAlgorithm(data, "SHA-256");
}
/**
* SHA384加密
*
* @param data 明文字符串
* @return 16进制密文
*/
public static String encryptSHA384ToString(String data) {
return encryptSHA384ToString(data.getBytes());
}
/**
* SHA384加密
*
* @param data 明文字节数组
* @return 16进制密文
*/
public static String encryptSHA384ToString(byte[] data) {
return bytes2HexString(encryptSHA384(data));
}
/**
* SHA384加密
*
* @param data 明文字节数组
* @return 密文字节数组
*/
public static byte[] encryptSHA384(byte[] data) {
return encryptAlgorithm(data, "SHA-384");
}
/**
* SHA512加密
*
* @param data 明文字符串
* @return 16进制密文
*/
public static String encryptSHA512ToString(String data) {
return encryptSHA512ToString(data.getBytes());
}
/**
* SHA512加密
*
* @param data 明文字节数组
* @return 16进制密文
*/
public static String encryptSHA512ToString(byte[] data) {
return bytes2HexString(encryptSHA512(data));
}
/**
* SHA512加密
*
* @param data 明文字节数组
* @return 密文字节数组
*/
public static byte[] encryptSHA512(byte[] data) {
return encryptAlgorithm(data, "SHA-512");
}
/**
* 对data进行algorithm算法加密
*
* @param data 明文字节数组
* @param algorithm 加密算法
* @return 密文字节数组
*/
private static byte[] encryptAlgorithm(byte[] data, String algorithm) {
try {
MessageDigest md = MessageDigest.getInstance(algorithm);
md.update(data);
return md.digest();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return new byte[0];
}
/**
* 获取文件的MD5校验码
*
* @param filePath 文件路径
* @return 文件的16进制密文
*/
public static String encryptMD5File2String(String filePath) {
return encryptMD5File2String(new File(filePath));
}
/**
* 获取文件的MD5校验码
*
* @param filePath 文件路径
* @return 文件的MD5校验码
*/
public static byte[] encryptMD5File(String filePath) {
return encryptMD5File(new File(filePath));
}
/**
* 获取文件的MD5校验码
*
* @param file 文件
* @return 文件的16进制密文
*/
public static String encryptMD5File2String(File file) {
return encryptMD5File(file) != null ? bytes2HexString(encryptMD5File(file)) : "";
}
/**
* 获取文件的MD5校验码
*
* @param file 文件
* @return 文件的MD5校验码
*/
public static byte[] encryptMD5File(File file) {
FileInputStream in = null;
try {
in = new FileInputStream(file);
FileChannel channel = in.getChannel();
MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(buffer);
return md.digest();
} catch (NoSuchAlgorithmException | IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException ignored) {
}
}
}
return null;
}
/************************ DES加密相关 ***********************/
/**
* DES转变
* <p>法算法名称/加密模式/填充方式</p>
* <p>加密模式有:电子密码本模式ECB、加密块链模式CBC、加密反馈模式CFB、输出反馈模式OFB</p>
* <p>填充方式有:NoPadding、ZerosPadding、PKCS5Padding</p>
*/
public static String DES_Transformation = "DES/ECB/NoPadding";
private static final String DES_Algorithm = "DES";
/**
* @param data 数据
* @param key 秘钥
* @param algorithm 采用何种DES算法
* @param transformation 转变
* @param isEncrypt 是否加密
* @return 密文或者明文,适用于DES,3DES,AES
*/
public static byte[] DESTemplet(byte[] data, byte[] key, String algorithm, String transformation, boolean isEncrypt) {
try {
SecretKeySpec keySpec = new SecretKeySpec(key, algorithm);
Cipher cipher = Cipher.getInstance(transformation);
SecureRandom random = new SecureRandom();
cipher.init(isEncrypt ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE, keySpec, random);
return cipher.doFinal(data);
} catch (Throwable e) {
e.printStackTrace();
}
return null;
}
/**
* DES加密后转为Base64编码
*
* @param data 明文
* @param key 8字节秘钥
* @return Base64密文
*/
public static byte[] encryptDES2Base64(byte[] data, byte[] key) {
return EncodeUtils.base64Encode(encryptDES(data, key));
}
/**
* DES加密后转为16进制
*
* @param data 明文
* @param key 8字节秘钥
* @return 16进制密文
*/
public static String encryptDES2HexString(byte[] data, byte[] key) {
return bytes2HexString(encryptDES(data, key));
}
/**
* DES加密
*
* @param data 明文
* @param key 8字节秘钥
* @return 密文
*/
public static byte[] encryptDES(byte[] data, byte[] key) {
return DESTemplet(data, key, DES_Algorithm, DES_Transformation, true);
}
/**
* DES解密Base64编码密文
*
* @param data Base64编码密文
* @param key 8字节秘钥
* @return 明文
*/
public static byte[] decryptBase64DES(byte[] data, byte[] key) {
return decryptDES(EncodeUtils.base64Decode(data), key);
}
/**
* DES解密16进制密文
*
* @param data 16进制密文
* @param key 8字节秘钥
* @return 明文
*/
public static byte[] decryptHexStringDES(String data, byte[] key) {
return decryptDES(hexString2Bytes(data), key);
}
/**
* DES解密
*
* @param data 密文
* @param key 8字节秘钥
* @return 明文
*/
public static byte[] decryptDES(byte[] data, byte[] key) {
return DESTemplet(data, key, DES_Algorithm, DES_Transformation, false);
}
/************************ 3DES加密相关 ***********************/
/**
* 3DES转变
* <p>法算法名称/加密模式/填充方式</p>
* <p>加密模式有:电子密码本模式ECB、加密块链模式CBC、加密反馈模式CFB、输出反馈模式OFB</p>
* <p>填充方式有:NoPadding、ZerosPadding、PKCS5Padding</p>
*/
public static String TripleDES_Transformation = "DESede/ECB/NoPadding";
private static final String TripleDES_Algorithm = "DESede";
/**
* 3DES加密后转为Base64编码
*
* @param data 明文
* @param key 24字节秘钥
* @return Base64密文
*/
public static byte[] encrypt3DES2Base64(byte[] data, byte[] key) {
return EncodeUtils.base64Encode(encrypt3DES(data, key));
}
/**
* 3DES加密后转为16进制
*
* @param data 明文
* @param key 24字节秘钥
* @return 16进制密文
*/
public static String encrypt3DES2HexString(byte[] data, byte[] key) {
return bytes2HexString(encrypt3DES(data, key));
}
/**
* 3DES加密
*
* @param data 明文
* @param key 24字节密钥
* @return 密文
*/
public static byte[] encrypt3DES(byte[] data, byte[] key) {
return DESTemplet(data, key, TripleDES_Algorithm, TripleDES_Transformation, true);
}
/**
* 3DES解密Base64编码密文
*
* @param data Base64编码密文
* @param key 24字节秘钥
* @return 明文
*/
public static byte[] decryptBase64_3DES(byte[] data, byte[] key) {
return decrypt3DES(EncodeUtils.base64Decode(data), key);
}
/**
* 3DES解密16进制密文
*
* @param data 16进制密文
* @param key 24字节秘钥
* @return 明文
*/
public static byte[] decryptHexString3DES(String data, byte[] key) {
return decrypt3DES(hexString2Bytes(data), key);
}
/**
* 3DES解密
*
* @param data 密文
* @param key 24字节密钥
* @return 明文
*/
public static byte[] decrypt3DES(byte[] data, byte[] key) {
return DESTemplet(data, key, TripleDES_Algorithm, TripleDES_Transformation, false);
}
/************************ AES加密相关 ***********************/
/**
* AES转变
* <p>法算法名称/加密模式/填充方式</p>
* <p>加密模式有:电子密码本模式ECB、加密块链模式CBC、加密反馈模式CFB、输出反馈模式OFB</p>
* <p>填充方式有:NoPadding、ZerosPadding、PKCS5Padding</p>
*/
public static String AES_Transformation = "AES/ECB/NoPadding";
private static final String AES_Algorithm = "AES";
/**
* AES加密后转为Base64编码
*
* @param data 明文
* @param key 16、24、32字节秘钥
* @return Base64密文
*/
public static byte[] encryptAES2Base64(byte[] data, byte[] key) {
return EncodeUtils.base64Encode(encryptAES(data, key));
}
/**
* AES加密后转为16进制
*
* @param data 明文
* @param key 16、24、32字节秘钥
* @return 16进制密文
*/
public static String encryptAES2HexString(byte[] data, byte[] key) {
return bytes2HexString(encryptAES(data, key));
}
/**
* AES加密
*
* @param data 明文
* @param key 16、24、32字节秘钥
* @return 密文
*/
public static byte[] encryptAES(byte[] data, byte[] key) {
return DESTemplet(data, key, AES_Algorithm, AES_Transformation, true);
}
/**
* AES解密Base64编码密文
*
* @param data Base64编码密文
* @param key 16、24、32字节秘钥
* @return 明文
*/
public static byte[] decryptBase64AES(byte[] data, byte[] key) {
return decryptAES(EncodeUtils.base64Decode(data), key);
}
/**
* AES解密16进制密文
*
* @param data 16进制密文
* @param key 16、24、32字节秘钥
* @return 明文
*/
public static byte[] decryptHexStringAES(String data, byte[] key) {
return decryptAES(hexString2Bytes(data), key);
}
/**
* AES解密
*
* @param data 密文
* @param key 16、24、32字节秘钥
* @return 明文
*/
public static byte[] decryptAES(byte[] data, byte[] key) {
return DESTemplet(data, key, AES_Algorithm, AES_Transformation, false);
}
}