提问者:小点点

aes加密在使用Kotlin的android studio中不起作用?


我的代码
,,,

    //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收到错误,我的代码有什么问题


共1个答案

匿名用户

这是我的解决方案实现'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
    }