Android上的AES加密

news2024/11/25 8:47:48

基础算法说明

https://www.youtube.com/watch?v=lnKPoWZnNNM

虽然这个视频讲的非常详细,但是涉及到具体底层算法,大致流程

1. 将数据转成HEX或者byte array

2.将数据分层一块块等大小的数据

3.将数据和key 进行一次混合,加密之后的输出,在生成新的key

4.将新的key和下一个数据,进行加密计算,继续重复

生成的KEY长度有128,192,256,不同的的长度对算法的速度有影响

当然key的长度越长,可能越安全这样

具体的算法是什么呢

为什么要有IV

另外这篇

https://www.youtube.com/watch?v=uWEPEBmFBHw

我们在AES的时候,有key了,为什么要IV呢

大概解释是,IV是个Ramdom的参数,不然每次用key算出来的值是一样的,

所以加上IV后,计算出来的结果会不一样。

Android上的具体AES实现

然后就是PL这个在Android上AES加密的具体实现

https://github.com/philipplackner/AndroidCrypto/tree/encrypt/decrypt

或者参考这个文档

https://medium.com/@jerry.cho.dev/android-keystore-aa7d2b43adfe

基本差不多

1.加密管理器

key的初始化和获取

@RequiresApi(Build.VERSION_CODES.M)
class CryptoManager {

    //获取keystroe,用于存放加密的key
    private val keyStore = KeyStore.getInstance("AndroidKeyStore").apply {
        load(null)
    }

    //获取加密器,模式是ENCRYPT_MODE
    private val encryptCipher get() = Cipher.getInstance(TRANSFORMATION).apply {
        init(Cipher.ENCRYPT_MODE, getKey())
    }

    //解码器,模式DECRYPT_MODE,
    private fun getDecryptCipherForIv(iv: ByteArray): Cipher {
        return Cipher.getInstance(TRANSFORMATION).apply {
            init(Cipher.DECRYPT_MODE, getKey(), IvParameterSpec(iv))
        }
    }

    //加密秘钥,存储在keystroe中
    private fun getKey(): SecretKey {
        val existingKey = keyStore.getEntry("secret", null) as? KeyStore.SecretKeyEntry
        return existingKey?.secretKey ?: createKey()
    }

    private fun createKey(): SecretKey {
        return KeyGenerator.getInstance(ALGORITHM).apply {
            init(
                KeyGenParameterSpec.Builder(
                    "secret",
                    KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
                )
                    .setBlockModes(BLOCK_MODE)
                    .setEncryptionPaddings(PADDING)
                    .setUserAuthenticationRequired(false)
                    .setRandomizedEncryptionRequired(true)
                    .build()
            )
        }.generateKey()
    }

    //把byte进行加密,写入IV,写入机密后的bytes
    fun encrypt(bytes: ByteArray, outputStream: OutputStream): ByteArray {
        val encryptedBytes = encryptCipher.doFinal(bytes)
        outputStream.use {
            it.write(encryptCipher.iv.size)
            it.write(encryptCipher.iv)
            it.write(encryptedBytes.size)
            it.write(encryptedBytes)
        }
        return encryptedBytes
    }

    //解码,读取IV,根据IV再解码
    fun decrypt(inputStream: InputStream): ByteArray {
        return inputStream.use {
            val ivSize = it.read()
            val iv = ByteArray(ivSize)
            it.read(iv)

            val encryptedBytesSize = it.read()
            val encryptedBytes = ByteArray(encryptedBytesSize)
            it.read(encryptedBytes)

            getDecryptCipherForIv(iv).doFinal(encryptedBytes)
        }
    }

    companion object {
        private const val ALGORITHM = KeyProperties.KEY_ALGORITHM_AES
        private const val BLOCK_MODE = KeyProperties.BLOCK_MODE_CBC
        private const val PADDING = KeyProperties.ENCRYPTION_PADDING_PKCS7
        private const val TRANSFORMATION = "$ALGORITHM/$BLOCK_MODE/$PADDING"
    }

}

        

2.加密

val bytes = messageToEncrypt.encodeToByteArray()
                            val file = File(filesDir, "secret.txt")
                            if(!file.exists()) {
                                file.createNewFile()
                            }
                            val fos = FileOutputStream(file)

                            messageToDecrypt = cryptoManager.encrypt(
                                bytes = bytes,
                                outputStream = fos
                            ).decodeToString()

3.解密

 val file = File(filesDir, "secret.txt")
                            messageToEncrypt = cryptoManager.decrypt(
                                inputStream = FileInputStream(file)
                            ).decodeToString()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2211945.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(vue)el-tabs标签页展示el-table动态表头表格

&#xff08;vue&#xff09;el-tabs标签页展示el-table动态表头表格 效果: 代码 <el-tabs v-if"showStatistics" type"border-card"><el-tab-panev-for"(item, index) in statisticsTable":key"index":label"item.pr…

C++游戏开发指南(新改)

目录 1. 引言 2. C的基础知识 2.1 面向对象编程与游戏开发 2.2 指针与内存管理 2.3 C和其他游戏开发语言的比较 3. 游戏引擎的选择 3.1 Unreal Engine 3.2 Unity 3.3 游戏引擎对比表 4. 游戏架构设计 4.1 ECS架构 4.2 游戏循环 5. C中的图形编程基础 5.1 DirectX…

Panasonic Programming Contest 2024(AtCoder Beginner Contest 375)题解

A - Seats 思路&#xff1a;从前往后扫&#xff0c;判断有多少个.的左右各有一个# #include<bits/stdc.h> using namespace std; #define int long longint n; string s;signed main() {cin>>n;cin>>s;int cnt0;if(s.size()<3){cout<<0<<&quo…

python中双引号和单引号的区别是什么

python3中的单引号‘’和双引号“”的作用一样。 3个单引号的作用&#xff1a; 1、表示注释 #3个单引号表示注释多行gf_of_archerzon "Wang" print("archerzon的女盆友是",gf_of_archerzon) print("archerzon的女盆友是%s"%gf_of_archerzon)2…

PolarCTF靶场[web]file、ezphp WP

[WEB]file 知识点&#xff1a;文件上传漏洞 工具&#xff1a;Burp Suite、dirsearch 方法一&#xff1a; 根据页面提示&#xff0c;先用dirsearch工具扫一扫 访问/upload.php&#xff0c;发现一个上传区 在访问/uploaded/,再点击Parent Directory&#xff0c;发现链接到首页…

NVIDIA GPGPU的通信架构解析

NVIDIA GPGPU- 通信架构 写在前面 在本部分&#xff0c;我们将深入探讨NVLink、NCCL、NVSwitch和GPGPU之间的紧密联系。重点关注通信系统及其与计算的耦合性&#xff0c;以揭示Nvlink & NVSwitch System在支持NVIDIA GPGPU大规模计算和超大算力方面的重要作用。为了更好地…

新生入门季 | 学习生物信息分析,如何解决个人电脑算力不足的问题?

随着生物信息学在科研和教育中的快速普及&#xff0c;越来越多的新生开始接触基因组测序、RNA分析等复杂计算任务。然而&#xff0c;在面对这些大规模数据时&#xff0c;个人电脑的算力往往显得捉襟见肘。你是否也在为自己的笔记本性能不足而苦恼&#xff1f; 这篇文章将为你提…

【读书笔记-《30天自制操作系统》-27】Day28

本篇的内容不少&#xff0c;主要围绕着文件操作与文字显示展开。 1. alloca函数 在开发文件操作与文字显示之前&#xff0c;需要先做一些准备&#xff0c;引入alloca函数。首先看下面的代码&#xff1a; #include <stdio.h> #include "apilib.h"#define MA…

美畅物联丨剖析 GB/T 28181 与 GB 35114:视频汇聚领域的关键协议

我们在使用畅联云平台进行视频汇聚时&#xff0c;经常会用的GB/T 28181协议&#xff0c;前面我们写了关于GB/T 28181的相关介绍&#xff0c;​ 详见《畅联云平台&#xff5c;关于GB28181你了解多少&#xff1f;》。 ​最近也有朋友向我们咨询GB 35114协议与GB/T 28181有什么不同…

基于STM32的智能运输机器人设计

引言 本项目设计了一个基于STM32的智能运输机器人&#xff0c;能够自动识别路径、避开障碍物&#xff0c;并根据用户的指令将物品运输到指定地点。该机器人集成了超声波传感器、红外传感器、无线通信模块等&#xff0c;通过STM32对电机的控制&#xff0c;实现平稳、智能的运输…

【深度学习】RNN的简单实现

目录 1.RNNCell 2.RNN 3.RNN_Embedding 1.RNNCell import torchinput_size 4 hidden_size 4 batch_size 1idx2char [e, h, l, o] x_data [1, 0, 2, 2, 3] # 输入&#xff1a;hello y_data [3, 1, 2, 3, 2] # 期待&#xff1a;ohlol# 独热向量 one_hot_lookup [[1, …

滑雪——记忆化搜索

题目 代码 //#pragma GCC optimize(3)#include <bits/stdc.h> const int N 310; using namespace std; int dx[4] {-1, 0, 1, 0}, dy[4] {0, 1, 0, -1}; int ans; int g[N][N]; int r, c; int f[N][N]; int dfs(int x, int y) {if(~f[x][y]) return f[x][y];f[x][y] …

TikTok直播带货话术分享,轻松实现销量翻倍

随着TikTok直播带货的不断壮大&#xff0c;越来越多的国内用户开始尝试使用英语进行直播带货。这不仅能够吸引国际观众&#xff0c;还能够扩大市场和提升品牌影响力。 TikTok直播通用带货话术 1. 开场白 开场时&#xff0c;主播可以用热情的语言吸引观众的注意力&#xff1a;…

闭着眼学机器学习——支持向量机分类

引言&#xff1a; 在正文开始之前&#xff0c;首先给大家介绍一个不错的人工智能学习教程&#xff1a;https://www.captainbed.cn/bbs。其中包含了机器学习、深度学习、强化学习等系列教程&#xff0c;感兴趣的读者可以自行查阅。 1. 算法介绍 支持向量机(Support Vector Mach…

AI 能否替代程序员?且听我来一唠!

关于 AI 替代程序员这事儿&#xff0c;咱得仔细唠唠。随着 AI 技术的飞速发展&#xff0c;越来越多人担心程序员会被 AI 取代。程序员会不会失业呢&#xff1f;答案是&#xff1a;没那么简单&#xff01; 首先&#xff0c;AI 确实已经可以干很多程序员的活儿了&#xff0c;比如…

如何构建高效的公路工程资料管理系统?

本文介绍了构建高效的公路工程资料管理系统的方法&#xff0c;涵盖了系统需求分析、功能设计、开发平台选择、开发过程、系统上线与培训、持续改进与维护等关键环节。通过合理规划和科学管理&#xff0c;可以确保系统满足用户需求&#xff0c;提高工作效率&#xff0c;保障公路…

基于Java的超级玛丽游戏的设计与实现(论文+源码)-kaic

摘 要 “超级玛丽”游戏是是任天堂情报开发本部开发的Family Computer横版卷轴动作游戏&#xff0c;它因操作简单、娱乐性强而广受欢迎。Java 的优势在于网络编程与多线程&#xff0c;但其作为一门全场景语言&#xff0c;依然提供了强大的GUI开发API。本论文利用Java的GUI界…

某普SSLVPN 任意文件读取

0x01 产品描述&#xff1a; ‌ 迪普科技的VPN产品是一款面向广域互联应用场景的专业安全网关产品&#xff0c;集成了IPSec、SSL、L2TP、GRE等多种VPN技术&#xff0c;支持国密算法&#xff0c;实现分支机构、移动办公人员的统一安全接入&#xff0c;提供内部业务跨互联网的…

公开课 | 2024最新清华大模型公开课 第4课 大模型学习方法

本文由readlecture.cn转录总结。ReadLecture专注于音、视频转录与总结&#xff0c;2小时视频&#xff0c;5分钟阅读&#xff0c;加速内容学习与传播。 大纲 引言 介绍大模型的训练方法 强调大模型在多领域的应用 大模型的训练阶段 预训练过程 Tokenization的重要性 预训练模…

​面向异构硬件架构:软件支撑和优化技术

面向异构硬件架构&#xff1a;软件支撑和优化技术 本文来自“面向异构硬件架构软件支撑和优化技术”&#xff0c;重点分析了异构硬件成为发展新趋势&#xff0c;系统软件扮演重要新角色&#xff0c;硬件能力单一性与应用需求多样性间的矛盾带来系统性挑战。为了解决这个问题&am…