package com.hdl.sdk.link.core.utils.mqtt;
|
|
|
|
import com.hdl.sdk.link.common.utils.LogUtils;
|
import com.hdl.sdk.link.core.utils.HexUtil;
|
|
import org.bouncycastle.jce.provider.BouncyCastleProvider;
|
|
import java.security.InvalidAlgorithmParameterException;
|
import java.security.InvalidKeyException;
|
import java.security.Key;
|
import java.security.NoSuchAlgorithmException;
|
import java.security.Security;
|
|
import javax.crypto.BadPaddingException;
|
import javax.crypto.Cipher;
|
import javax.crypto.IllegalBlockSizeException;
|
import javax.crypto.NoSuchPaddingException;
|
import javax.crypto.spec.IvParameterSpec;
|
import javax.crypto.spec.SecretKeySpec;
|
|
|
/**
|
* Aes 加解密工具类
|
*
|
* @author yangtao
|
* 2020年10月29日
|
*/
|
public class AesUtil {
|
|
private static final String CIPHER_INSTANCE = "AES/ECB/PKCS5Padding";
|
private static final String AES_ALGORITHM = "AES";
|
|
static {
|
//AES/CBC/PKCS7Padding 依赖
|
Security.addProvider(new BouncyCastleProvider());
|
}
|
|
/**
|
* AES加密
|
*
|
* @param key
|
* @return
|
* @throws Exception
|
*/
|
public static byte[] aesEncrypt(byte[] content, String key) {
|
return encrypt(content, key.getBytes(), "AES/CBC/PKCS7Padding", true, null);
|
}
|
|
/**
|
* AES解密
|
*
|
* @param key
|
* @return
|
* @throws Exception
|
*/
|
public static byte[] aesDecrypt(byte[] content, String key) {
|
return decrypt(content, key.getBytes(), "AES/CBC/PKCS7Padding", true, null);
|
}
|
|
/**
|
* 加密
|
*
|
* @param content 待加密字符串
|
* @param keyHex aesKye的hexStr
|
* @return
|
*/
|
public static String encrypt(String content, String keyHex) {
|
return HexUtil.encodeHexStr(encrypt(content.getBytes(), HexUtil.decodeHex(keyHex), CIPHER_INSTANCE, false, null));
|
}
|
|
/**
|
* 加密
|
*
|
* @param content 待加密字符串
|
* @param key 密钥
|
* @return
|
*/
|
public static String encrypt(String content, byte[] key) {
|
return HexUtil.encodeHexStr(encrypt(content.getBytes(), key, CIPHER_INSTANCE, false, null));
|
}
|
|
/**
|
* 加密
|
*
|
* @param content 待加密字符串
|
* @param keyHex aesKye的hexStr
|
* @return
|
*/
|
public static byte[] encryptReturnByte(String content, String keyHex) {
|
return encrypt(content.getBytes(), HexUtil.decodeHex(keyHex), CIPHER_INSTANCE, false, null);
|
}
|
|
/**
|
* 加密
|
*
|
* @param content 待加密字符串
|
* @param key 密钥
|
* @return
|
*/
|
public static byte[] encryptReturnByte(String content, byte[] key) {
|
return encrypt(content.getBytes(), key, CIPHER_INSTANCE, false, null);
|
}
|
|
/**
|
* 加密
|
*
|
* @param content 待加密字符串
|
* @param keyByte aesKye的hexStr
|
* @param cipherInstance AES算法填充方式
|
* @param isIv 是否使用偏移量 ECB模式不可用
|
* @param iv 偏移量 不传默认密钥
|
* @return
|
*/
|
public static byte[] encrypt(byte[] content, byte[] keyByte, String cipherInstance, Boolean isIv, byte[] iv) {
|
try {
|
//KEY转换
|
Key key = new SecretKeySpec(keyByte, AES_ALGORITHM);
|
//加密
|
Cipher cipher = Cipher.getInstance(cipherInstance);
|
if (isIv != null && isIv) {
|
//偏移量 不传默认密钥
|
if (iv == null) {
|
iv = keyByte;
|
}
|
IvParameterSpec ivps = new IvParameterSpec(iv);
|
cipher.init(Cipher.ENCRYPT_MODE, key, ivps);
|
} else {
|
cipher.init(Cipher.ENCRYPT_MODE, key);
|
}
|
byte[] result = cipher.doFinal(content);
|
return result;
|
} catch (NoSuchAlgorithmException e) {
|
LogUtils.e(e.getMessage());
|
} catch (InvalidKeyException e) {
|
LogUtils.e(e.getMessage());
|
} catch (NoSuchPaddingException e) {
|
LogUtils.e(e.getMessage());
|
} catch (BadPaddingException e) {
|
LogUtils.e(e.getMessage());
|
} catch (IllegalBlockSizeException e) {
|
LogUtils.e(e.getMessage());
|
} catch (InvalidAlgorithmParameterException e) {
|
LogUtils.e(e.getMessage());
|
}
|
return null;
|
}
|
|
/**
|
* 解密
|
*
|
* @param contentHex 待解密待字符串hexStr
|
* @param keyHex desKye的hexStr
|
* @return
|
*/
|
public static String decrypt(String contentHex, String keyHex) {
|
return new String(decrypt(HexUtil.decodeHex(contentHex), HexUtil.decodeHex(keyHex), CIPHER_INSTANCE, false, null));
|
}
|
|
/**
|
* 解密
|
*
|
* @param contentHex 待解密待字符串hexStr
|
* @param key 密钥
|
* @return
|
*/
|
public static String decrypt(String contentHex, byte[] key) {
|
return new String(decrypt(HexUtil.decodeHex(contentHex), key, CIPHER_INSTANCE, false, null));
|
}
|
|
/**
|
* 解密
|
*
|
* @param content 待解密待内容
|
* @param keyHex 密钥
|
* @return
|
*/
|
public static String decrypt(byte[] content, String keyHex) {
|
return new String(decrypt(content, HexUtil.decodeHex(keyHex), CIPHER_INSTANCE, false, null));
|
}
|
|
/**
|
* 解密
|
*
|
* @param content 待解密待内容
|
* @param key 密钥
|
* @return
|
*/
|
public static String decrypt(byte[] content, byte[] key) {
|
return new String(decrypt(content, key, CIPHER_INSTANCE, false, null));
|
}
|
|
|
/**
|
* 解密
|
*
|
* @param contentByte 待解密待字符串hexStr
|
* @param contentByte 密钥
|
* @param cipherInstance AES算法填充方式
|
* @param isIv 是否使用偏移量 ECB模式不可用
|
* @param iv 偏移量 不传默认密钥
|
* @return
|
*/
|
public static byte[] decrypt(byte[] contentByte, byte[] keyByte, String cipherInstance, Boolean isIv, byte[] iv) {
|
try {
|
//KEY转换
|
Key key = new SecretKeySpec(keyByte, AES_ALGORITHM);
|
//解密
|
Cipher cipher = Cipher.getInstance(cipherInstance);
|
if (isIv != null && isIv) {
|
//偏移量 不传默认密钥
|
if (iv == null) {
|
iv = keyByte;
|
}
|
IvParameterSpec ivps = new IvParameterSpec(iv);
|
cipher.init(Cipher.DECRYPT_MODE, key, ivps);
|
} else {
|
cipher.init(Cipher.DECRYPT_MODE, key);
|
}
|
byte[] result = cipher.doFinal(contentByte);
|
return result;
|
} catch (NoSuchAlgorithmException e) {
|
LogUtils.e(e.getMessage());
|
} catch (InvalidKeyException e) {
|
LogUtils.e(e.getMessage());
|
} catch (NoSuchPaddingException e) {
|
LogUtils.e(e.getMessage());
|
} catch (BadPaddingException e) {
|
LogUtils.e(e.getMessage());
|
} catch (IllegalBlockSizeException e) {
|
LogUtils.e(e.getMessage());
|
} catch (InvalidAlgorithmParameterException e) {
|
LogUtils.e(e.getMessage());
|
}
|
return null;
|
}
|
|
|
public static void main(String[] args) {
|
// jiemi();
|
//jiami();
|
}
|
|
public static void jiami() {
|
String key = "1f6714fc-fb9b-4a";
|
String content = "{\"id\":\"123\",\"objects\":[{\"sid\":\"0001011565879801020200010101\",\"type\":\"PWD\",\"local_id\":\"2\"}],\"time_stamp\":\"1603281282000\"}";
|
byte[] res = aesEncrypt(content.getBytes(), key);
|
System.out.println(HexUtil.encodeHexStr(res));
|
}
|
|
/**
|
*
|
* @param str
|
* @param houseId
|
* @return
|
*/
|
public static String jiemi(byte[] str, String houseId) {
|
byte[] rs = aesDecrypt(str, HouseIdSecretUtil.getSecret(houseId));
|
String content = new String(rs);
|
return content;
|
}
|
|
// public static void main(String[] args) {
|
// try {
|
// //第一步: 生成KEY
|
// //KeyGenerator keyGenerator = KeyGenerator.getInstance(AES_ALGORITHM);
|
// //keyGenerator.init(256);
|
// //第二步: 产生密钥
|
// //SecretKey secretKey = keyGenerator.generateKey();
|
// //第三步: 获取密钥
|
// //byte[] keyBytes = secretKey.getEncoded();
|
// //System.out.println(byteArrayToHexStr(keyBytes));
|
// String src = "aaaaaaaaaVVVVaaaAAAA无";
|
// String pwd = "41151AF257BFDB7859EEC62FB341EE95EE42E648FE24E1F8CE8DADE287CC1E5C";
|
// String mw = encrypt(src,pwd);
|
// System.out.println("mw:"+mw);
|
// String jm = decrypt(mw,pwd);
|
// System.out.println("jm:"+jm);
|
//
|
// }catch (Exception e){
|
//
|
// }
|
//
|
// }
|
}
|