Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密

简介: 本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点讲解了如何使用 Kotlin 实现 AES-256 的加密和解密,并提供了详细的代码示例。通过生成密钥、加密和解密数据等步骤,展示了如何在 Kotlin 项目中实现数据的安全加密。

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

在移动端开发中,数据加密是确保数据传输和存储安全的重要手段。常见的加密算法包括对称加密算法(如 AES)、非对称加密算法(如 RSA)、散列算法(如 SHA-256),以及消息认证码(如 HMAC)。

常见的移动端加密算法

1、 对称加密算法(Symmetric Encryption)

  • AES(Advanced Encryption Standard):AES 是目前较为流行的对称加密算法,支持密钥长度为 128 位、192 位或 256 位。对称加密的特点是加密和解密使用同一个密钥。
  • DES(Data Encryption Standard):是一种较老的对称加密算法,因其密钥长度较短(56 位)而不再推荐使用。

2、 非对称加密算法(Asymmetric Encryption)

  • RSA:RSA 是一种广泛使用的非对称加密算法,使用一对公钥和私钥进行加密和解密。非对称加密的特点是加密和解密使用不同的密钥,适合于密钥交换和数字签名。

3、 散列算法(Hash Algorithms)

  • SHA-256(Secure Hash Algorithm 256-bit):一种常用的散列算法,将输入的数据生成固定长度的散列值,用于数据完整性校验和数字签名。
  • MD5(Message Digest Algorithm 5):较老的散列算法,已被发现存在安全漏洞,不再推荐使用。

4、 消息认证码(Message Authentication Codes, MACs)

  • HMAC(Hash-based Message Authentication Code):结合了散列算法和密钥的消息认证码,用于确保数据的完整性和真实性。

使用 Kotlin 进行 AES-256 加密和解密

我们将介绍如何使用 Kotlin 实现 AES-256 加密和解密。以下是所需的步骤:

  1. 生成密钥
  2. 加密数据
  3. 解密数据

工具和库

在 Kotlin 中,我们通常使用 Java 提供的加密库 javax.crypto 来实现这些功能。

代码示例

  1. 依赖导入

确保你的项目中已经导入了必要的依赖:

dependencies {
   
    implementation("org.jetbrains.kotlin:kotlin-stdlib")
}
  1. 密钥生成

AES-256 需要 256 位(32 字节)的密钥。你可以生成一个随机密钥,或者使用一个固定的密钥(不推荐)。

import javax.crypto.KeyGenerator
import javax.crypto.SecretKey

fun generateAESKey(): SecretKey {
    val keyGen = KeyGenerator.getInstance("AES")
    keyGen.init(256) // 使用 256 位
    return keyGen.generateKey()
}
  1. 加密和解密
import java.util.Base64
import javax.crypto.Cipher
import javax.crypto.SecretKey
import javax.crypto.spec.GCMParameterSpec

private const val AES_ALGORITHM = "AES/GCM/NoPadding"
private const val TAG_LENGTH_BIT = 128
private const val IV_LENGTH_BYTE = 12

fun encrypt(data: String, secretKey: SecretKey): String {
    val cipher = Cipher.getInstance(AES_ALGORITHM)
    val iv = ByteArray(IV_LENGTH_BYTE)
    java.security.SecureRandom().nextBytes(iv)
    val parameterSpec = GCMParameterSpec(TAG_LENGTH_BIT, iv)
    cipher.init(Cipher.ENCRYPT_MODE, secretKey, parameterSpec)
    val encryptedData = cipher.doFinal(data.toByteArray())
    val encryptedIvAndData = ByteArray(iv.size + encryptedData.size)
    System.arraycopy(iv, 0, encryptedIvAndData, 0, iv.size)
    System.arraycopy(encryptedData, 0, encryptedIvAndData, iv.size, encryptedData.size)
    return Base64.getEncoder().encodeToString(encryptedIvAndData)
}

fun decrypt(encryptedData: String, secretKey: SecretKey): String {
    val cipher = Cipher.getInstance(AES_ALGORITHM)
    val encryptedIvAndData = Base64.getDecoder().decode(encryptedData)
    val iv = ByteArray(IV_LENGTH_BYTE)
    System.arraycopy(encryptedIvAndData, 0, iv, 0, iv.size)
    val parameterSpec = GCMParameterSpec(TAG_LENGTH_BIT, iv)
    cipher.init(Cipher.DECRYPT_MODE, secretKey, parameterSpec)
    val originalData = cipher.doFinal(encryptedIvAndData, iv.size, encryptedIvAndData.size - iv.size)
    return String(originalData)
}
  1. 测试加密和解密
fun main() {
    val secretKey = generateAESKey()
    val originalText = "Hello, World!"

    println("Original Text: $originalText")

    val encryptedText = encrypt(originalText, secretKey)
    println("Encrypted Text: $encryptedText")

    val decryptedText = decrypt(encryptedText, secretKey)
    println("Decrypted Text: $decryptedText")
}

代码解释

1、 生成密钥
使用 KeyGenerator 类生成一个 256 位的 AES 密钥。

2、 加密数据

  • 使用 AES/GCM/NoPadding 模式。
  • 生成一个随机的初始化向量(IV)。
  • 使用 IV 和密钥来初始化 Cipher 实例。
  • 执行加密操作并返回 Base64 编码的加密结果。

3、 解密数据

  • 使用 AES/GCM/NoPadding 模式。
  • 从加密数据中提取 IV。
  • 使用 IV 和密钥来初始化 Cipher 实例。
  • 执行解密操作并返回解密后的原始数据。

这样你就能够在 Kotlin 项目中使用 AES-256 实现数据的安全加密和解密。请注意,使用固定密钥不安全,建议使用安全的密钥管理机制来保护密钥。


欢迎关注我的公众号AntDream查看更多精彩文章!

目录
相关文章
|
2月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
1月前
|
存储 Java 数据安全/隐私保护
Java技术栈揭秘:Base64加密和解密文件的实战案例
以上就是我们今天关于Java实现Base64编码和解码的实战案例介绍。希望能对你有所帮助。还有更多知识等待你去探索和学习,让我们一同努力,继续前行!
143 5
|
5月前
|
人工智能 编解码 算法
DeepSeek加持的通义灵码2.0 AI程序员实战案例:助力嵌入式开发中的算法生成革新
本文介绍了通义灵码2.0 AI程序员在嵌入式开发中的实战应用。通过安装VS Code插件并登录阿里云账号,用户可切换至DeepSeek V3模型,利用其强大的代码生成能力。实战案例中,AI程序员根据自然语言描述快速生成了C语言的base64编解码算法,包括源代码、头文件、测试代码和CMake编译脚本。即使在编译错误和需求迭代的情况下,AI程序员也能迅速分析问题并修复代码,最终成功实现功能。作者认为,通义灵码2.0显著提升了开发效率,打破了编程语言限制,是AI编程从辅助工具向工程级协同开发转变的重要标志,值得开发者广泛使用。
8349 71
DeepSeek加持的通义灵码2.0 AI程序员实战案例:助力嵌入式开发中的算法生成革新
|
1月前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
72 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
|
2月前
|
缓存 Android开发 iOS开发
Kotlin跨平台Compose Multiplatform实战指南
Kotlin Multiplatform (KMP) 结合 Compose Multiplatform,助力开发者用一套代码构建跨平台应用(Android、iOS、桌面和 Web)。本文提供实战指南,涵盖环境搭建、项目结构、共享 UI 编写、平台适配、状态管理及资源处理等内容。通过 expect/actual 处理差异,借助官方文档与示例项目学习,减少重复代码,优化多平台开发体验。
399 18
|
3月前
|
数据采集 JSON 网络安全
移动端数据抓取:Android App的TLS流量解密方案
本文介绍了一种通过TLS流量解密技术抓取知乎App热榜数据的方法。利用Charles Proxy解密HTTPS流量,分析App与服务器通信内容;结合Python Requests库模拟请求,配置特定请求头以绕过反爬机制。同时使用代理IP隐藏真实IP地址,确保抓取稳定。最终成功提取热榜标题、内容简介、链接等信息,为分析热点话题和用户趋势提供数据支持。此方法也可应用于其他Android App的数据采集,但需注意选择可靠的代理服务。
133 11
移动端数据抓取:Android App的TLS流量解密方案
|
4月前
|
消息中间件 存储 算法
JVM实战—3.JVM垃圾回收的算法和全流程
本文详细介绍了JVM内存管理与垃圾回收机制,涵盖以下内容:对象何时被垃圾回收、垃圾回收算法及其优劣、新生代和老年代的垃圾回收算法、Stop the World问题分析、核心流程梳理。
JVM实战—3.JVM垃圾回收的算法和全流程
|
5月前
|
弹性计算 算法 Linux
使用SM4算法加密LUKS格式磁盘
本文介绍了在Anolis 8操作系统使用cryptsetup对磁盘进行分区、加密和挂载的过程。采用SM4加密算法。具体步骤包括:初始化加密卷、解锁加密分区、格式化并挂载设备。最后,展示了如何取消挂载并关闭加密卷以确保数据安全。整个过程确保了磁盘数据的安全性和隐私保护。
237 2
使用SM4算法加密LUKS格式磁盘
|
5月前
|
Android开发 开发者 Kotlin
Android实战经验之Kotlin中快速实现MVI架构
MVI架构通过单向数据流和不可变状态,提供了一种清晰、可预测的状态管理方式。在Kotlin中实现MVI架构,不仅提高了代码的可维护性和可测试性,还能更好地应对复杂的UI交互和状态管理。通过本文的介绍,希望开发者能够掌握MVI架构的核心思想,并在实际项目中灵活应用。
175 8
|
6月前
|
编译器 Android开发 开发者
Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
Lambda表达式和匿名函数都是Kotlin中强大的特性,帮助开发者编写简洁而高效的代码。理解它们的区别和适用场景,有助于选择最合适的方式来解决问题。希望本文的详细讲解和示例能够帮助你在Kotlin开发中更好地运用这些特性。
99 9