我的代码
,,,
//key genration
val keygen = KeyGenerator.getInstance("AES")
keygen.init(256)
val key = keygen.generateKey()
keyTV.setText(key.toString())
encryptbtn.setOnClickListener(View.OnClickListener {
val plaintext = message.text.toString()
// object of cipher
val cipher = Cipher.getInstance("AES")
cipher.init(Cipher.ENCRYPT_MODE,key)
// encrypted message
val ciphertext = cipher.doFinal(plaintext.toByteArray())
encryptMsgTV.setText(ciphertext.toString())
})
decryptbtn.setOnClickListener(View.OnClickListener {
val ciphertext = encryptMsgTV.text.toString()
val decipher = Cipher.getInstance("AES")
decipher.init(Cipher.DECRYPT_MODE,key)
val plaintext = decipher.doFinal(ciphertext.toByteArray())
decryptMsgTV.setText(plaintext.toString())
})
,,,
错误:-javax.crypto.IllegalBlockSizeException:解密中的最后一个块不完整
为什么iam收到错误,我的代码有什么问题
这是我的解决方案实现'commons-codec:commons-codec:1.11'
private fun decrypt(plainText: String): String? {
val cipher = Cipher.getInstance("AES/ECB/NoPadding")
val key: SecretKey = SecretKeySpec(hexToByteArray(keyHex), "AES")
cipher.init(Cipher.DECRYPT_MODE, key)
val result = cipher.update(hexToByteArray(plainText))
val text = String(Hex.encodeHex(result))
val finalText = String(hexToByteArray(text)!!)
return finalText.trim { it <= ' ' }
}
fun hexToByteArray(s: String?): ByteArray? {
require(!(s == null || s.length % 2 == 1))
val chars = s.toCharArray()
val len = chars.size
val data = ByteArray(len / 2)
var i = 0
while (i < len) {
data[i / 2] =
((Character.digit(chars[i], 16) shl 4) + Character.digit(
chars[i + 1],
16
)).toByte()
i += 2
}
return data
}