首页 > 编程语言 >Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密

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

时间:2024-08-28 17:51:30浏览次数:13  
标签:AES 加密 val kotlin iv 密钥 256 加密算法

本文首发于公众号“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查看更多精彩文章!

AntDream

标签:AES,加密,val,kotlin,iv,密钥,256,加密算法
From: https://blog.csdn.net/myth13141314/article/details/141639687

相关文章

  • 使用Kotlin+协程+Flow+Retrofit+OkHttp搭建一套网络请求工具
    文章目录一、前言二、搭建Java工程1.打开AndroidStudio建一个Android工程2.修改该工程的build.gradle文件为Java工程,并配置如下:3.搭建一个RetrofitUtils请求工具类,这都是常规操作了,如下4.建一个NetWorkAPi作为Retrofit请求接口:5.建一个WXRepository为了和A......
  • 【Kotlin设计模式】Kotlin实现外观模式
    前言外观模式(FacadePattern)是一种结构型设计模式,旨在为子系统中的一组接口提供一个统一的接口。外观模式定义了一个高层接口,使得这一子系统更加容易使用。它将复杂的子系统封装在一个简单的接口后面,从而降低了客户端的复杂性。实现我们以银行APP业务举个例子,其中包......
  • Go使用crypto实现AES和RSA加密处理
    前言在Go语言中,实现数据加密可以通过使用标准库中的crypto包以及encoding/base64等包来完成。这里,我们将重点阐述如何在Go语言中使用这些库来实现对称加密和非对称加密的详细逻辑。一、对称加密对称加密是指加密和解密使用同一密钥的加密方式。常用的对称加密算法有AES、......
  • 在Kotlin中使用Spark SQL的UDF和UDAF函数
    1.项目结构与依赖1.1项目依赖使用gradle:在项目的build.gradle.kts添加dependencies{  implementation("org.apache.spark:spark-sql_2.12:3.3.1")}使用maven:在模块的pom.xml中添加<dependency><groupId>org.apache.spark</groupId>......
  • Android Kotlin优化代码整洁:with、applay以及run是什么,作用,区别
    目录为什么需要使用with、applay以及runwith、applay以及run是什么、作用以及三者区别一、为什么需要使用with、applay以及run我们在开发项目的过程当中,不可避免,一个界面的内容会有很多,如下initivew方法,会有Recyclerview的初始化,长按以及触摸事件设置,以及生命周期的注册,主......
  • Android开发语言Kotlin简介
    官方认可:自2017年Google正式宣布Kotlin成为Android开发的官方语言后,它在Android开发中的流行度就有了显著提升。与Java的兼容性:Kotlin在设计时就考虑到了与Java的互操作性,这让开发者能够在Android项目中轻松使用Kotlin,同时继续利用现有的Java代码和库。......
  • 【JS逆向】探索文章链接地址AES加密后如何再次替换变形
    一、加密后的数据变形二、加密函数的定义defencrypt_message(message):cipher=AES.new(key,AES.MODE_ECB)padded_message=pad(message.encode(),AES.block_size,style='pkcs7')cliphertext=cipher.encrypt(padded_message)returncliphert......
  • 记一次Kotlin Visibility Modifiers引发的问题
    概述测试环境爆出ERROR告警日志java.lang.IllegalStateException:Didn'tfindreportforspecifiedlanguage,登录测试环境ELK查到如下具体的报错堆栈日志:java.lang.IllegalStateException:Didn'tfindreportforspecifiedlanguageatcom.aba.report.service.biz.Assessme......
  • delphi加密C#解密(AES-256)
    因为公司内部业务需要,用delphi加密的内容(流和字符串)要用C#解密,因为不懂delphi,我这里只是问同事要了代码,贴上delphi加密:共两个文件(AES.pas和ElAES.pas)AES.pas:(**************************************************************)(*......
  • AES常用的代码示例
    AESAES是对称加密。对称加密是指加密和解密使用相同的密钥的加密算法。非对称加密是指加密和解密使用不同的密钥的加密算法。AES加密解密加密模式,有ECB模式和CBC模式等等,ECB不需要iv偏移量,而CBC需要。密钥,可以自定义。填充方式,有PKCS5、PKCS7、NoPadding。......