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 高分。 从给出的演示图来看,一些非常复杂的数学公式都能正确的识别,颇为强大。模型…...
保姆级教程:在CentOS 7上用达梦8搭建DCA练习环境(附ulimit、VNC、ODBC全配置)
达梦8 DCA认证实战:CentOS 7环境搭建与调优全指南 在国产数据库技术快速发展的今天,达梦数据库作为核心产品之一,其DCA认证已成为众多从业者提升竞争力的重要选择。与理论为主的认证不同,DCA更注重实际操作能力,而一个…...
作业本耐用度差距巨大?深圳大明印刷厂拆解合规工艺,告别定制作业本掉页开裂通病
在校园日常教学中,很多学校都会遇到同一个难题:同一学期采购的作业本、定制作业本,品质差距悬殊,有的完好无损用到期末,有的短短几周就出现书脊开裂、页面脱落、边角破损、翻页卡顿等问题。不少人误以为是学生使用习惯…...
浅聊26上半年软考架构师
2026年上半年架构师考试已然落幕,大家都考的如何?架构师共有三门考试,上午综合知识(75道选择题)案例分析,时间为8.30-12.30;下午论文,时间为14.30-16.30。下面说说我整体的备考过程。…...
Vulnhub-DC-1
1.信息收集 使用工具nmap扫描主机端口 这是Drupal是使用PHP语言编写的开源内容管理框架(CMF),它由内容管理系统(CMS)和PHP开发框架(Framework)共同构成 Web指纹扫描 发现是:drupal…...
Unity Visual Scripting不是拖拽玩具:中阶开发者的编程范式重构指南
1. 为什么Unity官方Visual Scripting不是“拖拽完就能跑”的玩具,而是一套需要重新理解的编程范式很多人第一次点开Unity的Visual Scripting(VS)面板时,看到那些五颜六色的节点和丝滑的连线,下意识觉得:“这…...
MobX社区资源大全:10个必备工具、插件和扩展库推荐 [特殊字符]
MobX社区资源大全:10个必备工具、插件和扩展库推荐 🚀 【免费下载链接】MobX-Docs-CN MobX 中文文档 项目地址: https://gitcode.com/gh_mirrors/mo/MobX-Docs-CN MobX作为一个简单、可扩展的状态管理库,已经成为React开发者不可或缺的…...
RevSSH反向SSH隧道:无公网IP设备的安全远程运维方案
1. 这不是又一个SSH封装工具——RevSSH解决的是“根本性连接悖论”你有没有遇到过这样的场景:一台部署在客户内网的嵌入式设备,没有公网IP,NAT穿透失败,防火墙策略死死锁住所有入向端口,连ICMP都被禁了;或者…...
Claude端到端测试设计终极清单:覆盖17类非功能需求(含延迟敏感度分级、幻觉熔断阈值、多轮对话状态持久化验证)
更多请点击: https://kaifayun.com 第一章:Claude端到端测试设计的演进逻辑与核心范式 Claude端到端测试并非静态产物,而是随模型能力边界拓展、交互场景复杂化及可靠性要求升级而持续演化的工程实践。其演进逻辑根植于三个关键张力…...
观察Token消耗明细,Taotoken用量看板如何帮助控制预算
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 观察Token消耗明细,Taotoken用量看板如何帮助控制预算 对于个人开发者或项目管理者而言,在使用大模型API时…...
Lovable内部工具开发方法论(从需求黑洞到用户自发推广的完整闭环)
更多请点击: https://kaifayun.com 第一章:Lovable内部工具开发方法论(从需求黑洞到用户自发推广的完整闭环) Lovable 方法论的核心不是交付功能,而是培育“工具依赖感”——当一线工程师在凌晨三点调试线上问题时&am…...
