我在鸿蒙上做了一个加密工具,加密结果看起来像一段正常中文——聊聊密语盒子的 AES-GCM + 字谱替换设计

鸿蒙第16篇——数据持久化 本文介绍的数据持久化是指鸿蒙应用的数据持久化存储。它是将内存中的数据通过文件或数据库的形式保存到设备存储中。鸿蒙支持多种数据存储方式, 包括用户首选项Preferences、 键值型数据库KV-Store和关系型数据库。 阅读详情

起因:加密后的东西,一眼就能看出"被加密了"

说实话,这事儿困扰我挺久的。

我平时有个习惯,会在备忘录里记一些账号密码、私密想法之类的东西。用过几款加密工具,Base64 编码也好,AES 加密也好,输出的结果都是一堆乱码或者 U2FsdGVkX1... 这种字符串。

问题在哪?太明显了。

任何人瞥一眼就知道"这段内容被加密过"。被加密本身就是一种信息——它告诉别人"这里有秘密"。

我就想:能不能让加密结果看起来像一段正常的中文句子?外人看到觉得是一句莫名其妙但人畜无害的话,只有知道密钥的人才能还原?

这就是密语盒子的出发点。

做了什么:AES-GCM 加密 + 自定义字谱映射

核心思路分两步:

  1. 先用 AES-GCM 对明文做强加密(密钥通过 PBKDF2 从用户输入的密码派生),拿到密文字节流
    1. 把密文字节流按自定义的「字谱」做映射,把每个字节替换成一个汉字或可读字符
      举个例子,假设我的字谱是一组 256 个汉字(刚好对应一个字节的 256 种取值),那加密后的每个字节都能找到对应的汉字。最终输出就是一串中文字,比如:

“梧桐落叶时节青山远眺归雁南飞”
外人看了觉得像诗句碎片,实际上它是一段被加密的内容。

这和简单的替换密码(凯撒密码那种)完全不同——底层是 AES-GCM 这样的认证加密,字谱只是最后一层"视觉伪装"。破解者即使猜到了字谱映射关系,没有密钥照样还原不了明文。

为什么选鸿蒙

今年上半年开始做鸿蒙适配,1.2.0 版本已经上架。选 HarmonyOS 有几个原因:

  • 鸿蒙的安全能力底座挺好,@ohos.security.cryptoFramework 提供了完整的 AES-GCM 和 PBKDF2 支持,不用自己引第三方库
    • ArkTS 写 UI 确实快,声明式的方式做表单交互很顺手
    • 说实话也有私心——鸿蒙应用市场现在竞争没那么卷,同类工具几乎没有

技术细节:鸿蒙侧的加密实现

加密核心用了 @ohos.security.cryptoFramework,这里贴一下密钥派生和加密的关键逻辑:

import cryptoFramework from '@ohos.security.cryptoFramework'

// PBKDF2 密钥派生
async function deriveKey(password: string, salt: Uint8Array): Promise<cryptoFramework.SymKey> {
  let kdfSpec: cryptoFramework.PBKDF2Spec = {
      algName: 'PBKDF2',
          password: password,
              salt: salt,
                  iterations: 100000,
                      keySize: 32
                        }
                          let kdf = cryptoFramework.createKdf('PBKDF2|SHA256')
                            let keyBlob = await kdf.generateSecret(kdfSpec)
                              let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES256')
                                return await symKeyGenerator.convertKey({ data: keyBlob.data })
                                }
// AES-GCM 加密
async function encrypt(plainText: Uint8Array, symKey: cryptoFramework.SymKey, iv: Uint8Array): Promise<Uint8Array> {
  let cipher = cryptoFramework.createCipher('AES256|GCM|PKCS7')
    let gcmParams: cryptoFramework.GcmParamsSpec = {
        iv: { data: iv },
            aad: { data: new Uint8Array(0) },
                authTag: { data: new Uint8Array(16) },
                    algName: 'GcmParamsSpec'
                      }
                        await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, gcmParams)
                          let output = await cipher.doFinal({ data: plainText })
                            return output.data
                            }
                            ```
拿到加密后的字节数组后,就是字谱映射的环节。这一步反而简单——本质就是一个 256 长度的数组查表:

```arkts
function bytesToCipherText(encrypted: Uint8Array, charset: string[]): string {
  let result = ''
    for (let i = 0; i < encrypted.length; i++) {
        result += charset[encrypted[i]]  // 每个字节 0-255 对应字谱中的一个字符
          }
            return result
            }
            ```
解密就是反过来:先把密文中每个字符在字谱里查位置还原成字节,再用 AES-GCM 解密。

## ArkUI 做交互的一些体会

UI 层用的 ArkUI,几个页面:加密页、解密页、字谱管理页。

说实话 ArkUI 的 `TextArea` 组件在处理大段文本输入时体验还行,但有个小坑——`onChange` 在输入法组合输入时的触发时机和我预期不太一样,调了一阵才稳定。

字谱管理那边,我用了 `@ohos.data.preferences` 做本地持久化,每套字谱就是一个 256 长度的字符串数组。用户可以自己编辑、导入导出,这样不同朋友之间可以约定不同的字谱。

## 关于"完全离线"这件事

密语盒子没有网络权限。对,一个字节都不往外发。

这不是什么高尚的设计哲学,纯粹是因为——一个加密工具如果联网,我自己用着都不放心。密钥派生、加解密、字谱存储全在本地完成。鸿蒙的沙箱机制保证了 preferences 数据不会被其他应用读取。

## 几个真实使用场景

1. **备忘录里存密码**:把"支付宝密码: abc123"加密后变成"碧海潮生曲终人散",存在系统便签里。手机被人借去用也不担心。
2. **和朋友发"密电"**:两个人约定同一套字谱和密码,在微信聊天里发密文。截图发朋友圈别人也看不懂——关键是看起来不像被加密的,不会引起好奇心。
3. **日记类内容**:有些想法不想被任何人看到,加密后发在自己的社交平台上当"树洞",只有自己能解。
## 当前状态和一些数据

- 上架时间:2024年,鸿蒙应用市场可搜"密语盒子"
- - 当前版本:1.2.0
- - 下载量:说实话还很少,刚起步阶段
- - 包体积:控制在 5MB 以内(没有网络模块,没有大型依赖)
下载量不高我觉得正常——这东西的目标用户本来就小众,是那些对隐私有洁癖、同时觉得传统加密工具"太丑太明显"的人。

## 踩过的坑

1. **字谱长度问题**:一开始我想用 65536 个字符的字谱(对应两个字节一组映射),这样密文更短。但实际操作中,找到 65536 个不重复的、看起来自然的汉字组合太难了,而且 Unicode 有些区段的字在鸿蒙字体里显示不出来。最后还是退回到 256 字符的方案,接受密文长一些。
2. **GCM 的 authTag 处理**:AES-GCM 加密后会产生一个认证标签,解密时需要用到。一开始我把 authTag 拼在密文尾部一起做字谱映射,结果解密时拆分位置算错了,调了一整个下午。
3. **PBKDF2 迭代次数**:10 万次迭代在手机上大概要 200-300ms,用户体感还行。试过 50 万次,等待超过 1 秒就有人受不了了。
## 写在后面

如果你也在做鸿蒙开发,特别是安全相关的方向,欢迎交流。`@ohos.security.cryptoFramework` 这个模块的文档说实话还不够详细,很多用法是我翻源码和试错试出来的。

鸿蒙应用市场搜索「密语盒子」可以直接下载体验。有问题评论区聊。
NACA0012的O型网格求解 本篇文章采用偏微分方程数值解法生成NACA0012翼型O型网格,并采用速度势方程求解绕NACA0012翼型迎角为0度时的低速不可压无粘流场。 文章目录一、求解网格1.翼型2.远场3.网格4.迭代5.求解二、求解流场1.偏微分方程2.迭代求解流场三、求解参数1.偏微分方程2.迭代求解四、导出数据 一、求解网格 1.翼型 本次求解网格和流场等采用的是NACA0012(修形)对称翼型,在NACA四位翼型中,第一位数字代表的是弯度,第二位数字代表的是弯度位置,后两位数字代表的是厚度,由于本次翼型的前两位数字都为0, 阅读详情

相关推荐

从开源到落地:SimpleBGC 三轴稳像平台全栈技术解析(上)

SimpleBGC是一款开源的稳定云台控制系统,相比专业设备具有显著的价格优势(仅为1/5-1/10),采用模块化设计支持全场景适配。系统包含硬件设计、软件代码和算法三大核心:硬件采用STM32主控和IMU传感器,支持6步换向和FOC电机驱动;软件采用三层架构(驱动层、算法层、应用层),实现姿态解算和PID控制;算法方面提供互补滤波(基础版)和卡尔曼滤波(高端版),可达到±0.5°至±0.1°的稳定精度。该系统适用于无人机航拍、工业检测等多种应用场景,特别适合DIY开发者和中小企业进行定制化开发。

bother3000的博客 3682

【crypto】现代密码包

注意U2FsdGVkX1打头的加密是用ccypto js 专用加密工具加盐并加密的,和普通的加密不同。密码base64解码为modern,用此密钥结合captfencoder工具即可解以上三个加密。第一部分:flag{51b70f7e。密码:bW9kZXJu。

amber_o0k的博客 2552

STC8H硬件IIC从机模式实战:手把手教你驱动OLED屏幕(附完整代码)

本文详细介绍了如何使用STC8H单片机的硬件IIC从机模式驱动SSD1306 OLED屏幕,包括硬件连接、寄存器配置、中断处理和实际应用中的优化技巧。通过完整的代码示例和实战经验分享,帮助开发者快速掌握I2C通信协议和OLED屏幕驱动技术,提升嵌入式开发效率。

weixin_33747129的博客 336

AES Encrypt / Decrypt

【代码】AES Encrypt / Decrypt。

dcdmer1211的博客 1341

Brainstorm简单分析近红外数据(fNIRS)(一)

Brainstorm分析fNIRS数据

weixin_43604817的博客 1350

Abaqus中Cohesive单元建模:从本构到失效的完整指南

本文提供了Abaqus中Cohesive单元建模的完整指南,涵盖从本构模型到失效分析的全过程。详细解析了Cohesive单元作为模拟界面粘结与失效的关键工具,其核心在于弹性本构、损伤起始准则和损伤演化定律的设置。文章通过双悬臂梁(DCB)实例,手把手指导前处理、材料定义、求解设置及后处理分析,并分享了刚度、强度、断裂能等关键参数的影响与收敛性调优的实用避坑技巧,帮助用户准确模拟复合材料及胶接结构的界面失效行为。

cuda7parallel的博客 700

BUUCTF_crypto_Rabbit

这些都可以引入密钥,密文特征与base64相似,明显区别是秘文里​​+​​​比较多,并且经常出现​​/​​。首先我们来了解一下Rabbit密码的特征,以U2FsdGVkX1开头。题目:注意:得到的 flag 请包上 flag{} 提交。所以答案为:flag{Cute_Rabbit}可以使用解码网站进行直接解码。

2301_76628253的博客 2111

PHP项目实战:易宝支付SDK对接全流程(含回调处理与常见问题排查)

本文详细介绍了PHP项目中易宝支付SDK的对接全流程,包括环境准备、SDK配置、支付请求构建与发起、回调处理实战以及常见问题排查。特别针对回调处理环节的常见问题提供了解决方案,帮助开发者快速完成支付对接并优化性能。

weixin_29007809的博客 385

ISCC2021 美人计

打开zip,在ny4w1nbmry4m\word\media这个路径下找到两张二维码。得到密钥:ISCC2021 了解到加密方式有AES。使用QR Research分别扫描得到以下两段码。得知第一段是DES加密,解码后得到flag。PK开头说明被强制转换过,原来是zip。有一个文档和黑寡妇图片。第二段是AES加密,连续三次解码后得到。用010 Editor打开黑寡妇图片。之后用010 Editor打开文档。说明美人的话不可全信啊。注意:不可换行提交!

sky_original的博客 667

YOLOv11-Pose部署RK3588实战:人体姿态识别精度翻倍,边缘推理速度突破瓶颈

本教程从YOLOv11-pose模型的姿态识别训练,到RK3588的边缘量化部署,为你打造了一套“高精度+高实时性+低成本”的人体姿态分析解决方案。无论是健身动作纠正、智能安防行为检测,还是工业人员姿态监控,这套技术都能直接复用——你只需替换数据集与业务逻辑,即可快速落地专属的边缘AI姿态识别系统。如果你在实践中遇到任何卡点,欢迎随时交流。记住,人体姿态识别的价值在于“关键点准、推理快、部署易”,而这三者的平衡,正是你通过本教程能掌握的核心能力。

m0_64661770的博客 138

手把手教你双目测距理论及生成视差图,深度图,点云图像

Stereo Vision, 也叫双目立体视觉,它的研究可以帮助我们更好的理解人类的双眼是如何进行深度感知的。双目视觉在许多领域得到了应用,例如城市三维重建、3D模型构建(如kinect fusion)、视角合成、3D跟踪、机器人导航(自动驾驶)、人类运动捕捉(Microsoft Kinect)等等。双目测距也属于双目立体视觉的一个应用领域,双目测距的基本原理主要是三角测量原理,即通过视差来判定物体的远近。

qq_53545309的博客 2280

我用 HarmonyOS 做了个加密App:密文看起来就是一段唐诗

那种感觉促使我做了密语盒子——一个加密之后输出结果看起来像正常汉字的工具。不是乱码,不是 Base64,是一串你可以抄在便签上、发到朋友圈、截图给别人看,对方完全不会觉得「这是密文」的汉字序列。用 AES-GCM + PBKDF2 做真正的密码学加密,完全离线,密钥不上传任何服务器。HarmonyOS 的。模块提供了完整的对称加密支持,AES-GCM 的初始化向量每次随机生成,规避重放攻击。把手机递给别人的瞬间,你有没有想过备忘录里那些「密码123456」?密语盒子有两层机制,缺一不可。

same4869的博客 256

46、搭建与配置FTP服务器全攻略

本文详细介绍了如何搭建与配置FTP服务器,以vsftpd为例,涵盖了FTP基础概念、安装步骤、服务控制、安全设置、用户权限管理、文件上传支持、互联网共享配置、客户端使用以及常见问题解决等内容。旨在帮助用户高效、安全地实现文件共享与管理。

time3的博客 88

我在鸿蒙上做了个加密工具,加密结果看起来像一段正常中文——聊聊 AES-GCM + 字谱替换的实现思路

把加密后的二进制数据,通过一套"字谱"映射成汉字。字谱是可自定义的——你可以用唐诗三百首里的字,可以用菜谱里的字,甚至可以用 emoji。去年我在整理备忘录的时候突然意识到一个问题——我把一些重要密码、私密笔记存在手机便签里,虽然手机有锁屏密码,但如果有人借我手机看个东西,顺手划到便签……试了几个,加密之后输出的要么是 Base64,要么是一串不可读的乱码。问题来了:一眼就能看出来"这东西被加密了",反而引起好奇心。:用 AES-GCM 做真正的加密,密钥通过 PBKDF2 从用户输入的密码派生。

same4869的博客 81

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

我做了一款鸿蒙加密App,加密后的密文看起来像一段正常中文——聊聊 AES-GCM + 字谱替换的实现思路

底层加密用的是 AES-GCM + PBKDF2 派生密钥。这部分没什么花活,就是保证密码学层面的安全性。HarmonyOS 提供了模块,AES-GCM 的实现可以直接调系统能力,不需要自己搬 OpenSSL。上层伪装才是这个 App 的灵魂。加密产生的二进制数据,通常工具会用 Base64 编码输出,我换了一种做法——用一套「字谱」做映射。说白了,字谱就是一个字符集合,比如你可以定义一套字谱是"天地玄黄宇宙洪荒日月盈昃辰宿列张"这些字。加密后的每个字节,按索引映射到字谱中的某个汉字。

same4869的博客 105

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

js aes加密_从一例JS加密案例看JS分析应该具有的思想

最近很久没更新文章了,一方面是该总结的常用东西基本写完了,自己在学习;另一方面是没有新鲜的东西宁愿不写水文,宁愿自己一边玩去。老铁们也没取关,在这里也谢谢你们。我也不满足于去学习优秀的东西,同时要求自己要有创造创新技术,唯有创新方能持久,好东西会有的。今天写这篇文章的原因是前两天一个网友加我,叫我帮他分析一下咕米音乐下载连接数据的加密,他说他研究了有段时间了,今天一时兴起就看了看,最后发...

weixin_39883194的博客 639

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

实验吧-杂项-NSCTF crypto50(AES加密)

密文为:U2FsdGVkX1+qtU8KEGmMJwGgKcPUK3XBTdM+KhNRLHSCQL2nSXaW8++yBUkSylRp 先把这串密文拿去AES解密得到,密钥为空: flag{DISJV_Hej_UdShofjyed} 提交不正确。{}内的字符串看着就乱,对{}内的字符用凯撒解密,按到flag。 ...

Sea_Sand息禅 1749

几种常用加密方式简要分析及建议

原始字符串: {     "at": "2486",     "pwd": "96E79218965EB72C92A549DD5A330112",     "vc": "147514",     "v": "3.0" } 加密算法: AES,DES,RC4,Rabbit,TripleDes   密码:pppppxxxxxx 正确的目的值:             U2FsdGV

小蚂蚁 1万+

CTF中常见密码题解密网站总结

CTF中常见密码题解密网站总结

Greedy Hat的博客 4万+

HarmonyOS 7 端侧 AI 图像超分的工程化落地

用户抱怨网络差的时候图片传不上去,更严重的是,大量的私密照片上传到云端,引发了严重的隐私合规审查危机。痛定思痛后,我们决定把 AI 模型直接塞进手机里,用端侧的 NPU 来做推理,但这绝非易事。我们首先在服务端对模型进行了知识蒸馏,把参数砍掉了一大半,然后利用 MindSpore Lite 的转换工具,将模型转成了鸿蒙底层支持的。即便如此,模型依然有 20 多兆,我们最终选择了 FP16 量化,牺牲了极其微小的画质,换取了内存占用减半。推理过程极其消耗 CPU 和内存,稍微大一点的图,处理时间长达几秒。

2602_97267507的博客 156

〖物流终端实战 05〗纯血鸿蒙 ArkTS 高阶性能优化:长列表渲染、组件复用与内存泄漏排查

本文深度剖析鸿蒙ArkTS高阶性能优化,直击长列表卡顿与内存泄漏痛点。针对渲染,指出ForEach全量构建的缺陷,强调采用LazyForEach(V2推荐Repeat)配合增量通知及稳定业务Key;针对组件复用,明确@Reusable仅复用实例不重置状态,必须在aboutToReuse中手动清理UI状态;针对内存泄漏,总结全局监听未注销、定时器未清理及长生命周期对象持有页面引用三大元凶,并指导通过DevEco Profiler的Heap快照排查引用链。文章强调优化需遵循“先定位后改代码”原则,助力开发者打造

Eyf • 半字节的博客 633

AppGallery 上架自检 SOP:签名、隐私对齐与包体校验实战【鸿蒙心迹】

上架被驳回多因签名、隐私声明与包体不一致。本文提炼“签名→隐私对齐→包体校验”自检SOP,配套一键脚本与权限三角校验代码,实现90%驳回前置拦截。通过CI强制release签名、代码/声明/功能三者权限对齐、包体完整性校验,确保提审一次过。实战清单可直接抄,让过审从运气变为流程。

wdracky的专栏 311

【鸿蒙专题与实战】测试体系:单元测试、组件测试与 UI 测试

本文系统讲解鸿蒙开发中的三层测试实践:底层单元测试(用Hypium框架,优先覆盖纯函数、边界与异常)、中层ViewModel逻辑、顶层仅测3-5条关键UI路径。强调测试应“越往下写得越多”,因单元测试快且成本低,而UI测试慢易出错。通过实例说明断言拆分提升定位效率,结合覆盖率报告(hvigorwtest --coverage)发现盲区,核心是“用覆盖率找漏测,而非追求数字”。附五步落地清单:建测试文件、按优先级补用例、精简UI测试、生成报告、定位未覆盖行。下一篇将开启实战项目:从需求到上架全流程。

信息安全领域优质创作者|操作系统领域专家 162

窗口销毁了监听还在,HarmonyOS 7 生命周期释放的归属分界

综上所述,onWindowStageWillDestroy 是窗口监听的最后安全出口,onWindowStageDestroy 只负责断开窗口引用,onDestroy 管 Ability 级资源——三者不是“程度不同的退出回调”,而是各自有明确的归属范围。窗口监听的所有者是 WindowStage,定时器的所有者是 UIAbility,播放器的所有者是页面或 Ability(取决于你在哪一层创建的),ApplicationContext 监听的所有者是 Ability 的 context。

qq_61905492的博客 197

鸿蒙平板能当电脑第二块屏幕吗?ToDesk、向日葵镜像/副屏实测

本文对比测试了ToDesk鸿蒙版4.8.3.0与向日葵鸿蒙版16.8.0在连接鸿蒙平板作为电脑副屏的表现。结果显示,ToDesk可直接实现镜像屏与扩展屏功能,支持参数调节,操作流畅;而向日葵副屏需开通会员才能使用。对于已有鸿蒙平板的用户,ToDesk能有效拓展工作空间,提升多任务效率,尤其适合临时办公、出差等场景,具备较高实用价值。

2501_91062530的博客 2312

React Native for OpenHarmony 实战:react-native-file-logger 日志库鸿蒙化适配

本文记录了将 react-native-file-logger 适配至 OpenHarmony 的实战过程。基于鸿蒙 7.0 模拟器,通过 5 个 TurboModule 方法实现日志落盘、轮转、列举与删除,采用 fileIo 实现核心功能,支持按大小和跨天轮转,归档文件命名精确至毫秒。邮件发送功能因平台限制按能力边界处理,明确拒绝并提示用户手动导出。验证通过,日志文件结构清晰,内容完整,产出 HAP 示例与独立 HAR 库,中英双语文档齐全,为鸿蒙应用日志管理提供可靠方案。

m0_62930060的博客 232
上一篇: 独立开发一款鸿蒙呼吸训练App:动画性能降级策略与ArkTS工程实践
下一篇: 我用 ArkTS 写了个“吃什么决策器“,三种模式解决选择困难症
SameX-4869
博客等级 码龄17年 3354粉丝 657原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值