Android上的AES加密
基础算法说明
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,用于存放加密的keyprivate val keyStore = KeyStore.getInstance("AndroidKeyStore").apply {load(null)}//获取加密器,模式是ENCRYPT_MODEprivate 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.SecretKeyEntryreturn 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,写入机密后的bytesfun 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_AESprivate const val BLOCK_MODE = KeyProperties.BLOCK_MODE_CBCprivate const val PADDING = KeyProperties.ENCRYPTION_PADDING_PKCS7private 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()
相关文章:
Android上的AES加密
基础算法说明 https://www.youtube.com/watch?vlnKPoWZnNNM 虽然这个视频讲的非常详细,但是涉及到具体底层算法,大致流程 1. 将数据转成HEX或者byte array 2.将数据分层一块块等大小的数据 3.将数据和key 进行一次混合,加密之后的输出&…...
安全测试的漏洞类型
目录 一、安全测试的定义 二、安全测试的分类 1、静态扫描 2、内存扫描 3、动态安全测试 三、安全测试主要关注哪些方面的漏洞 漏洞一:SQL注入 漏洞二:XSS 漏洞三:暴力破解 漏洞四:文件包含文件上传漏洞 漏洞五&#…...
51 | 适配器模式:代理、适配器、桥接、装饰,这四个模式有何区别?
前面几篇文章我们学习了代理模式、桥接模式、装饰器模式,今天,我们再来学习一个比较常用的结构型模式:适配器模式。这个模式相对来说还是比较简单、好理解的,应用场景也很具体,总体上来讲比较好掌握。 关于适配器模式…...
ORM框架简介
什么是ORM? ORM(Object-Relational Mapping,对象关系映射)是一种编程技术,用于在关系数据库和对象程序语言之间转换数据。ORM框架允许开发者以面向对象的方式来操作数据库,而不需要编写复杂的SQL语句。简单…...
Windows系统上根据端口号查找对应进程
“开始”-“运行”,输入cmd,打开命令行窗口,输入netstat和findstr的组合,找出占用了4118的端口的进程 根据上述PID,使用tasklist和findstr的组合,找出对应进程是dsa.exe 要想kill此进程,可以打开…...
一文通透OpenAI o1:从CoT、Quiet-STaR、Self-Correct、Self-play RL、MCST等技术细节到工程复现
前言 注意,本文自10.12日起,正在每天更新的过程中,包括已写的部分也在不断修改(以增加更多技术细节、更加通俗易懂) 预计10.20完成第一版,10月底修订到第二版——具体修订记录详见本文文末.. 可能是去年写或讲的关于ChatGPT原理的…...
如何解决与kernel32.dll相关的常见错误:详细指南解析kernel32.dll文件缺失、损坏或错误加载问题
当你的电脑中出现错误kernel32.dll丢失的问题,会导致电脑不能出现正常运行,希望能够有效的帮助你有效的将丢失的kernel32.dll文件进行修复同时也给大家介绍一些关于kernel32.dll文件的相关介绍,希望能够有效的帮助你快速修复错误。 kernel32.…...
Caffeine Cache解析(一):接口设计与TinyLFU
Caffeine is a high performance Java caching library providing a near optimal hit rate. 自动加载value, 支持异步加载基于size的eviction:frequency and recency基于时间的过期策略:last access or last write异步更新valuekey支持weak referenceva…...
深入探索LINUX中AWK命令:强大的文本处理工具
深入探索LINUX中AWK命令:强大的文本处理工具 AWK 是一种编程语言,专为文本和数据处理设计,它以其强大的文本处理能力和简洁的语法在 Unix/Linux 系统中占据了重要地位。AWK 程序由一系列的模式(pattern)和动作(action)组成,对于输…...
数字化转型:解决项目管理困境的新路径
在当今这个飞速发展的数字化时代,企业如同在汹涌波涛中航行的船只,承受着前所未有的变革压力。而作为企业运作核心环节之一的项目管理,同样面临着巨大的挑战。 传统项目管理模式中的种种问题,犹如顽固的礁石,阻碍着项目…...
Arthas常用的命令(三)--monitor、jad 、stack
monitor:监控方法的执行情况 监控指定类中方法的执行情况 用来监视一个时间段中指定方法的执行次数,成功次数,失败次数,耗时等这些信息 参数说明 方法拥有一个命名参数 [c:],意思是统计周期(cycle of ou…...
Power BI之常用DAX函数使用介绍——提供数据源练习
前述: 本次使用数据是包含产品表、客户表、区域表、销售订单表的一份销售订单数据,数据源链接如下: 链接:https://pan.baidu.com/s/1micl_09hFrgz2aUBERkeZg 提取码:y17e 一、CALCULATE 1.语法结构 语法结构CALCUL…...
SQL-触发器(trigger)的详解以及代码演示
一、触发器的概念 触发器是一种特殊的存储过程,但是触发器不存在输入和输出参数,所以不能被显式的去调用,而是与特定的表相关联,当表中的数据发生变化时,触发器被激活并执行其定义的SQL代码。触发器可以是行级触发器&…...
【devops】x-ui 实现一键安装 x-ray 打造高速国际冲浪 | xray管理平台
一、部署X-UI篇 1、Github 地址&说明 github地址如下: https://github.com/FranzKafkaYu/x-ui?tabreadme-ov-file 2、一键部署 2.1、更新并安装curl #Ubuntu、Deibian系统 apt update && apt upgrade -y apt install curl -y #CentOS7 系统 yum…...
Linux系统编程——进程标识、进程创建
一、进程标识(pid) 每个进程都有一个非负整数形式的唯一编号,即 PID。PID 在任何时刻都是唯一的,但是可以重用,当进程终止并被回收以后,其 PID 就可以为其它进程所用。进程的 PID 由系统内核根据延迟重用算…...
【超级福利】openMind开源实习来袭,奖励高达万元,解锁你的AI实践新篇章!
亲爱的小伙伴们,是不是梦想着能在真实的项目中大展拳脚,却又苦于找不到合适的舞台?别担心,OpenI启智社区携手openMind Library工具链,为你量身打造了一场开源实习盛宴,保证让你的学习不再无聊,技…...
React JSX 使用条件语句渲染UI的两种写法
只针对函数组件 1. 第一种写法: function App({ id }) {return id1? <h1>hello</h1> : <h1>world</h1>; } 或者: function App({ id }) {return (<h1>{id1 && "hello" || id2 && "wo…...
谷歌-BERT-第四步:模型部署
1 需求 需求1:基于gradio实现大模型的WEB UI交互界面 2 接口 3 示例 import gradio as gr from transformers import *classifier pipeline("text-classification", model"./model", tokenizer"./model")gr.Interface.from_pipel…...
猫咪化身蒲公英,浮毛满屋乱飞,有哪些宠物空气净化器值得购买?
不掉毛的猫咪究竟是谁在养? 当初去朋友家玩,被猫咪捕获芳心,没多久自己也领养了一只。没想到啊,这就意味着要和猫毛纠缠一辈子了。平时白天上班不在家,它就在一边跑动一边掉毛,回到家我都能推断它的行动路…...
端到端的开源OCR模型:GOT-OCR-2.0,支持场景文本、文档、乐谱、图表、数学公式等内容识别!
今天给大家分享一个端到端的开源 OCR 模型,号称 OCR 2.0! 支持场景文本、文档、乐谱、图表、数学公式等内容识别,拿到了 BLEU 0.972 高分。 从给出的演示图来看,一些非常复杂的数学公式都能正确的识别,颇为强大。模型…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
