我正在尝试使用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=
我有多个问题:
- 正如您在第二个日志中看到的,
testing=
应该是testing
,并且它有一个额外的=
字符 - 当我加密句子时,解密后所有的空格都会被删除。CCD_ 4=>
testtext
- 一些句子使应用程序因
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从加密发送到解密。