AESUtil加密: Base64,AES嵌套双层加密

crazy code (kotlin)

/**
* @ClassName AESUtil
* @Description TODO
* @Author Kolin Zhao/ Mozhimen
* @Date 2021/10/14 15:13
* @Version 1.0
*/
object AESUtil {
//加密算法
private const val KEY_ALGORITHM = "AES"

//AES 的 密钥长度,32 字节,范围:16 - 32 字节
private const val SECURE_KEY_LENGTH = 16

//秘钥长度不足 16 个字节时,默认填充位数
private const val DEFAULT_VALUE = "0"

//字符编码
@RequiresApi(Build.VERSION_CODES.KITKAT)
private val CHARSET_UTF8 = StandardCharsets.UTF_8

//加解密算法/工作模式/填充方式
private const val CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding"

//key
private const val SECURE_KEY = "xxxxxForTodo_Key"

//IV
private const val IV_STRING = "xxxxxForTodo_Iv"

/**
* 采用AES128加密
*
* @param content 要加密的内容
* @return
*/
@RequiresApi(Build.VERSION_CODES.KITKAT)
fun encrypt(content: String): String? {
try {
// 获得密匙数据
val rawKeyData = getAESKey(SECURE_KEY)
// 从原始密匙数据创建KeySpec对象
val key = SecretKeySpec(rawKeyData, KEY_ALGORITHM)
// Cipher对象实际完成加密操作
val cipher = Cipher.getInstance(CIPHER_ALGORITHM)
// 用密匙初始化Cipher对象
val ivParameterSpec = IvParameterSpec(IV_STRING.toByteArray())
cipher.init(Cipher.ENCRYPT_MODE, key, ivParameterSpec)
// 正式执行加密操作
val encryptByte = cipher.doFinal(content.toByteArray())
return Base64.encodeToString(encryptByte, Base64.NO_WRAP)
} catch (e: UnsupportedEncodingException) {
e.printStackTrace()
} catch (e: NoSuchAlgorithmException) {
e.printStackTrace()
} catch (e: NoSuchPaddingException) {
e.printStackTrace()
} catch (e: InvalidAlgorithmParameterException) {
e.printStackTrace()
} catch (e: InvalidKeyException) {
e.printStackTrace()
} catch (e: IllegalBlockSizeException) {
e.printStackTrace()
} catch (e: BadPaddingException) {
e.printStackTrace()
}
return null
}

/**
* 采用AES128解密
*
* @param content
* @param secureKey
* @return
* @throws Exception
* ,Exception
* @throws Exception
*/
@RequiresApi(Build.VERSION_CODES.KITKAT)
fun decrypt(content: String, secureKey: String): String? {
val data: ByteArray = Base64.decode(content, Base64.NO_WRAP)
try {
// 获得密匙数据
val rawKeyData = getAESKey(secureKey) // secureKey.getBytes();
// 从原始密匙数据创建一个KeySpec对象
val key = SecretKeySpec(rawKeyData, KEY_ALGORITHM)
// Cipher对象实际完成解密操作
val cipher = Cipher.getInstance(CIPHER_ALGORITHM)
// 用密匙初始化Cipher对象
val initParam = IV_STRING.toByteArray()
val ivParameterSpec = IvParameterSpec(initParam)
cipher.init(Cipher.DECRYPT_MODE, key, ivParameterSpec)
return String(cipher.doFinal(data), CHARSET_UTF8)
} catch (e: UnsupportedEncodingException) {
e.printStackTrace()
} catch (e: NoSuchAlgorithmException) {
e.printStackTrace()
} catch (e: NoSuchPaddingException) {
e.printStackTrace()
} catch (e: InvalidKeyException) {
e.printStackTrace()
} catch (e: InvalidAlgorithmParameterException) {
e.printStackTrace()
} catch (e: IllegalBlockSizeException) {
e.printStackTrace()
} catch (e: BadPaddingException) {
e.printStackTrace()
}
return null
}

@RequiresApi(Build.VERSION_CODES.KITKAT)
@Throws(UnsupportedEncodingException::class)
fun getAESKey(key: String): ByteArray {
val keyBytes: ByteArray = key.toByteArray(CHARSET_UTF8)
val keyBytes16 = ByteArray(SECURE_KEY_LENGTH)
System.arraycopy(
keyBytes, 0, keyBytes16, 0,
keyBytes.size.coerceAtMost(SECURE_KEY_LENGTH)
)
return keyBytes16
}
}