一个用于Android AES加密解密的工具类,记录一下。。。
import android.os.Build
import android.security.keystore.KeyGenParameterSpec
import android.security.keystore.KeyProperties
import android.util.Base64
import androidx.annotation.RequiresApi
import java.io.*
import java.security.KeyStore
import javax.crypto.Cipher
import javax.crypto.KeyGenerator
import javax.crypto.SecretKey
import javax.crypto.spec.IvParameterSpec
@RequiresApi(Build.VERSION_CODES.M)
class CryptoManager {
companion object {
private const val IV_BLOCK_SIZE = 16
private const val ALGORITHM = KeyProperties.KEY_ALGORITHM_AES
private const val BLOCK_MODE = KeyProperties.BLOCK_MODE_CBC
private const val PADDING = KeyProperties.ENCRYPTION_PADDING_PKCS7
private const val TRANSFORMATION = "$ALGORITHM/$BLOCK_MODE/$PADDING"
private const val KeyStoreType = "AndroidKeyStore"
private const val KEY_ALIAS = "SecretKeyAlias"
private val cipher = Cipher.getInstance(TRANSFORMATION) //创建密码器
fun encrypt(encryptBytes: ByteArray): ByteArray?{
try {
cipher.init(Cipher.ENCRYPT_MODE, getKey()) //用密钥初始化Cipher对象
val final = cipher.doFinal(encryptBytes)
return cipher.iv + final // iv占前16位,加密后的数据占后面
} catch (e: Exception) {
e.printStackTrace()
}
return null
}
fun decrypt(decryptBytes: ByteArray): ByteArray? {
try {
val iv = decryptBytes.copyOfRange(0, IV_BLOCK_SIZE) // 先取出IV
val decryptData = decryptBytes.copyOfRange(IV_BLOCK_SIZE, decryptBytes.size) // 取出加密后的数据
cipher.init(Cipher.DECRYPT_MODE, getKey(), IvParameterSpec(iv))
return cipher.doFinal(decryptData)
} catch (e: Exception) {
e.printStackTrace()
}
return null
}
// type设为"AndroidKeyStore"使用Android专门提供的密钥存储系统,可以根据别名获取key, 类似于sp
private val keyStore = KeyStore.getInstance(KeyStoreType).apply {
load(null) }
private