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
相关产品推荐
相关产品推荐

