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){ // // } // // } }