安卓系统中的AES加密/解密



我正在尝试使用AES进行加密和解密。所以我穿了一个有两个功能的课:


class Cryptography {
private var initVector = ByteArray(16)
init {
SecureRandom().nextBytes(initVector)
}
fun encrypt(input: String, password: String): String {
val plainText = Base64.decode(input, Base64.NO_WRAP)
val cipher = Cipher.getInstance("AES/CBC/PKCS7PADDING")
val keySpec = SecretKeySpec(password.toByteArray(), "AES")
cipher.init(Cipher.ENCRYPT_MODE, keySpec, IvParameterSpec(initVector))

val encrypt = cipher.doFinal(plainText)
return Base64.encodeToString(encrypt, Base64.NO_WRAP)
}


fun decrypt(input: String, password: String): String {
val cypherText = Base64.decode(input, Base64.NO_WRAP)
val cipher = Cipher.getInstance("AES/CBC/PKCS7PADDING")
val keySpec = SecretKeySpec(password.toByteArray(), "AES")

cipher.init(Cipher.DECRYPT_MODE, keySpec, IvParameterSpec(initVector))

val decrypt = cipher.doFinal(cypherText)
return Base64.encodeToString(decrypt, Base64.NO_WRAP)
}
}

我就这样使用它们:

val cryptography = Cryptography()
val cypher = cryptography.encrypt("testing","1234567891234567")
Log.i("Log","encrypt:$cypher")
Log.i("Log","decrypt:${cryptography.decrypt(cypher,"1234567891234567")}")
Log.i("Log","decrypt:${cryptography.encrypt(cypher,"1234567981234567")}")

日志的结果如下:

I/Log: encrypt:6MyrSsAqePP3o5BDDylfBg==
I/Log: decrypt:testing=
I/Log: decrypt:EQtSQev+offTgNTki/AdyMFMlziBr2h1dCX/J3nVUi4=

我有多个问题:

  1. 正如您在第二个日志中看到的,testing=应该是testing,并且它有一个额外的=字符
  2. 当我加密句子时,解密后所有的空格都会被删除。CCD_ 4=>testtext
  3. 一些句子使应用程序因bad base-64错误而崩溃

如何解决这些问题?

encrypt()中,这一行不正确:

val plainText = Base64.decode(input, Base64.NO_WRAP);

完全有可能您的input不像您的测试那样是Base64编码的你通常需要做这样的事情:

val plainBuf = input.toByteArray();

类似的问题发生在decrypt():的末尾

return Base64.encodeToString(decrypt, Base64.NO_WRAP);

应该是这样的:

return String(decrypt)

顺便说一句,你可能很快就会遇到另一个问题,因为你的IV。你需要有类似的IV来加密/解密。但根据你的代码,我可以假设你不会将IV从加密发送到解密。

最新更新