Android Studio中Kotlin实现AES加密时应用崩溃求助
问题分析与解决方案
你遇到的崩溃核心原因是控件初始化时机错误,同时代码还存在语法笔误、AES密钥不符合规范等问题,以下是逐一修复方案:
1. 修复启动时的空指针崩溃
你在类成员变量位置直接调用findViewById,此时Activity还未执行setContentView加载布局,所有控件都会返回null,导致App启动即崩溃。必须将控件初始化放在setContentView之后。
2. 修正其他关键问题
- 语法笔误:原代码中
va clave是拼写错误,需改为val clave - AES密钥规范:AES要求密钥长度必须为128位(16字节)、192位(24字节)或256位(32字节),原密钥长度不符合要求,会抛出无效密钥异常
- 加密结果显示:加密后的字节数组包含不可打印字符,直接转字符串会乱码,需用Base64编码后再显示
- Cipher实例化规范:避免依赖平台默认的加密模式和填充,明确指定模式(如
AES/ECB/PKCS5Padding) - 异常调试:除Toast外,添加日志打印便于排查问题
修复后的完整代码
package com.example.FirstApp import android.annotation.SuppressLint import android.util.Base64 import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Button import android.widget.EditText import android.widget.Toast import javax.crypto.Cipher import javax.crypto.SecretKey import javax.crypto.spec.SecretKeySpec class MainActivity : AppCompatActivity() { // 仅声明控件变量,不提前初始化 private lateinit var btnEncriptar: Button private lateinit var txtPlano: EditText private lateinit var txtEncriptado: EditText private var textoEncriptar: String = "" @SuppressLint("MissingInflatedId") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 布局加载完成后初始化控件 btnEncriptar = findViewById(R.id.btnEncriptar) txtPlano = findViewById(R.id.txtPlain) txtEncriptado = findViewById(R.id.txtEncriptado) btnEncriptar.setOnClickListener{ textoEncriptar = txtPlano.text.toString() encriptar(textoEncriptar) } } private fun encriptar(textoEncriptar: String){ try { // 修正为16字节(128位)的AES密钥 val claveUsuario: String = "11AA22B4444ABCDEF" val clave: SecretKey = SecretKeySpec(claveUsuario.toByteArray(), "AES") // 明确指定加密模式和填充方式 val cifrar: Cipher = Cipher.getInstance("AES/ECB/PKCS5Padding") cifrar.init(Cipher.ENCRYPT_MODE, clave) val arrayTextoPlano: ByteArray = textoEncriptar.toByteArray() val arrayTextoEncriptado: ByteArray = cifrar.doFinal(arrayTextoPlano) // 将加密字节数组转为Base64字符串显示 txtEncriptado.setText(Base64.encodeToString(arrayTextoEncriptado, Base64.DEFAULT)) } catch (e: Exception){ Toast.makeText(this, "错误:${e.message}", Toast.LENGTH_LONG).show() // 打印异常日志到Logcat,方便调试 e.printStackTrace() } } }
关于Toast未显示的说明
原崩溃发生在App启动阶段(控件初始化时的空指针),此时try-catch块还未被执行,因此Toast没有机会弹出。修复控件初始化问题后,后续的异常就能被正常捕获并显示。
内容的提问来源于stack exchange,提问作者Looking for a answer ...
相关产品推荐
相关产品推荐

