You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android API24及以下Kotlin中Base64.getEncoder().encode()的替代方案

兼容Android API 24的RSA加密实现

你的代码在API 24及以下版本失效,核心原因是用到了API 26才引入的Java 8 java.util.Base64工具类,且未明确指定算法模式导致潜在兼容性问题。以下是修改后的兼容实现:

import android.util.Base64
import java.security.KeyFactory
import java.security.spec.X509EncodedKeySpec
import javax.crypto.Cipher
import java.security.interfaces.RSAPublicKey

fun rsaEncrypt(rsaPublicKey: String, aesKey: ByteArray?): String {
    requireNotNull(aesKey) { "AES key cannot be null" }
    
    val keyFactory = KeyFactory.getInstance("RSA")
    // 替换为Android原生Base64工具类(API 1起支持)
    val keyBytes = Base64.decode(rsaPublicKey, Base64.DEFAULT)
    val spec = X509EncodedKeySpec(keyBytes)
    val publicKey = keyFactory.generatePublic(spec) as RSAPublicKey
    
    // 明确指定完整算法字符串,避免不同版本默认实现差异
    val cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding")
    cipher.init(Cipher.ENCRYPT_MODE, publicKey)
    
    val encryptedBytes = cipher.doFinal(aesKey)
    // 用Android原生Base64生成加密结果
    return Base64.encodeToString(encryptedBytes, Base64.DEFAULT)
}

关键修改说明:

  • 替换Base64实现:把Java 8的java.util.Base64换成Android平台自带的android.util.Base64,这个类从API 1就提供支持,完美覆盖API 24。
  • 明确算法规则:原代码Cipher.getInstance("RSA")依赖系统默认填充/工作模式,不同Android版本可能存在差异,指定"RSA/ECB/PKCS1Padding"能保证加密逻辑一致。
  • 增强健壮性:添加requireNotNull校验aesKey,避免空值引发未预期异常。
  • 简化字符集处理:省略手动转UTF-8字节数组的步骤,android.util.Base64.decode直接接收字符串参数,且String默认转字节数组就是UTF-8编码。

内容的提问来源于stack exchange,提问作者c-an

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 20:00:58