Kotlin 中的 AES 加密

AES Encryption in Kotlin

Android docs 给出了以下关于如何使用 AES 加密消息的片段:

val plaintext: ByteArray = ...
val keygen = KeyGenerator.getInstance("AES")
keygen.init(256)
val key: SecretKey = keygen.generateKey()
val cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING")
cipher.init(Cipher.ENCRYPT_MODE, key)
val ciphertext: ByteArray = cipher.doFinal(plaintext)
val iv: ByteArray = cipher.iv

我在实施此方法时遇到此错误:

Unresolved reference: Cipher

所以 'Cipher' 对象似乎不是本地对象,但是我无法知道如何按照 Android 文档导入它。 如何设置我的项目才能使用 'Cipher'?

我不确定是否有必要使用 Cipher,以及我提供的解决方案是否是最佳方法,但我能够将 AES 用于 encryptiondecryptiontext 输入使用以下代码,表示 String:

加密

// text

val aesEncrypt: AESEncrypt = AESEncrypt()
val encryptedByteArray = aesEncrypt.encrypt(text)
val baos_text = ByteArrayOutputStream()
val oosText = ObjectOutputStream(baos_text)
oosText.writeObject(encryptedByteArray)
val encryptedText = String(android.util.Base64.encode(baos_text.toByteArray(), android.util.Base64.DEFAULT))

// key

val key = aesEncrypt.mySecretKey
val baos = ByteArrayOutputStream()
val oos = ObjectOutputStream(baos)
oos.writeObject(key)
val keyAsString = String(android.util.Base64.encode(baos.toByteArray(), android.util.Base64.DEFAULT))

// initialisation vector

val iv = aesEncrypt.myInitializationVector
val baosIV = ByteArrayOutputStream()
val oosIV = ObjectOutputStream(baosIV)
oosIV.writeObject(iv)
val initialisationVector = String(android.util.Base64.encode(baosIV.toByteArray(), android.util.Base64.DEFAULT))

解密

您必须保存 keyinitialisation vectorencrypted text 才能将其解密。

val initialisationVector = ... // get from wherever you saved it, local db, firebase...

val bytesIV = android.util.Base64.decode(iv, android.util.Base64.DEFAULT)
val oisIV = ObjectInputStream(ByteArrayInputStream(bytesIV))
val initializationVectorIV = oisIV.readObject() as ByteArray


val encryptedText = ... // get 

val bytesText = android.util.Base64.decode(encryptedText, android.util.Base64.DEFAULT)
val oisText = ObjectInputStream(ByteArrayInputStream(bytesText))
val textByteArray = oisText.readObject() as ByteArray


val key = ... // get your key
val bytesKey = android.util.Base64.decode(key, android.util.Base64.DEFAULT)
val oisKey = ObjectInputStream(ByteArrayInputStream(bytesKey))
val secretKeyObj = oisKey.readObject() as SecretKey


val aesDecrypt = AESDecrypt(secretKeyObj,initializationVectorIV)
val decryptedByteArray = aesDecrypt.decrypt(textByteArray)

val textAfterDecryption = decryptedByteArray.toString(charset("UTF-8"))

编辑

AES 助手 class:

import javax.crypto.Cipher
import javax.crypto.KeyGenerator
import javax.crypto.SecretKey

class AESEncrypt {

    var mySecretKey: SecretKey? = null
    var myInitializationVector: ByteArray? = null

    fun encrypt(strToEncrypt: String): ByteArray {

        val plainText = strToEncrypt.toByteArray(Charsets.UTF_8)
        val keygen = KeyGenerator.getInstance("AES")
        keygen.init(256)

        val key = keygen.generateKey()
        mySecretKey = key

        val cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING")
        cipher.init(Cipher.ENCRYPT_MODE, key)
        val cipherText = cipher.doFinal(plainText)
        myInitializationVector = cipher.iv

        return cipherText
    }

}

AES 解密助手

import javax.crypto.Cipher
import javax.crypto.SecretKey
import javax.crypto.spec.IvParameterSpec

class AESDecrypt(private val mySecretKey: SecretKey?, private val initializationVector: ByteArray?) {

    fun decrypt(dataToDecrypt: ByteArray): ByteArray {
        val cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING")
        val ivSpec = IvParameterSpec(initializationVector)
        cipher.init(Cipher.DECRYPT_MODE, mySecretKey, ivSpec)
        val cipherText = cipher.doFinal(dataToDecrypt)

        return cipherText
    }

}

请告知您是否还需要任何帮助:)

javax.crypto.Cipher 是 JCE 的一部分,应该可用。 import javax.crypto.Cipher 不起作用吗?那可能是你的环境有问题。