尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

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

我做了一款鸿蒙加密App,加密后的密文看起来像一段正常中文——聊聊 AES-GCM + 字谱替换的实现思路 起因加密结果为什么非得是乱码去年有个朋友问我“我想把一些私密笔记存在手机便签里但又怕被人看到有没有什么办法”我说用加密工具啊。他说试过加密完一串 Base64 或者乱码放在便签里别人一看就知道这条是加密过的反而更引人注意。这句话点醒了我。传统加密工具的问题不在于加密强度不够而在于加密结果本身就在宣告我被加密了。对于很多日常场景——比如备忘录里记个密码、朋友之间传个悄悄话——你需要的不只是别人解不开而是别人根本不觉得这里有东西需要解。所以我做了「密语盒子」一个鸿蒙原生的加密工具。它的核心卖点就一句话加密结果是一段看起来完全正常的中文文字。技术方案AES-GCM 加密 自定义字谱映射整体分两层底层加密用的是 AES-GCM PBKDF2 派生密钥。这部分没什么花活就是保证密码学层面的安全性。HarmonyOS 提供了ohos.security.cryptoFramework模块AES-GCM 的实现可以直接调系统能力不需要自己搬 OpenSSL。上层伪装才是这个 App 的灵魂。加密产生的二进制数据通常工具会用 Base64 编码输出我换了一种做法——用一套「字谱」做映射。说白了字谱就是一个字符集合比如你可以定义一套字谱是天地玄黄宇宙洪荒日月盈昃辰宿列张这些字。加密后的每个字节按索引映射到字谱中的某个汉字。最终输出的就是一串看起来像诗句、像随笔的中文文本。关键代码大概长这样// 将加密后的字节数组映射到字谱字符 function bytesToCipherText(encrypted: Uint8Array, charset: string[]): string { let result for (let i 0; i encrypted.length; i) { // 高4位和低4位分别映射确保字谱长度16即可覆盖 let high (encrypted[i] 4) 0x0F let low encrypted[i] 0x0F result charset[high] charset[low] } return result } 这样做的好处是字谱完全由用户自定义。你可以用《千字文》里的字也可以用菜单上的菜名甚至用 emoji。只要收发双方约定同一套字谱和密码就能互相解读。 ## 鸿蒙适配过程中踩的坑 说实话做鸿蒙版比我预想的顺利一些ArkUI 的声明式写法上手之后效率还行。但有几个地方折腾了一阵 1. **剪贴板权限**。密语盒子的核心操作流程是加密→复制→粘贴到别处鸿蒙对剪贴板的管控比较严格pasteboard 模块在后台状态下行为和前台不一样我调了两天才搞清楚生命周期的影响。 2. **文本输入框的性能**。用户可能粘贴很长的密文进来解密ArkUI 的 TextArea 组件在文本量大的时候渲染有点卡。最后我做了分段渲染超过一定长度就先截断显示点击展开全文。 3. **字谱编辑器**。这个功能我试了三种交互方案。第一版是表格填写太笨重第二版是自由文本输入然后自动拆分用户反馈说搞不清哪个字对应哪个位置最终第三版用了类似标签流的布局每个字是一个可拖拽的 tag直观多了。 arkts // 字谱编辑器 - 标签流布局 Flex({ wrap: FlexWrap.Wrap, space: { main: LengthMetrics.vp(8), cross: LengthMetrics.vp(8) } }) { ForEach(this.charsetArray, (char: string, index: number) { Text(char) .fontSize(16) .padding({ left: 12, right: 12, top: 6, bottom: 6 }) .backgroundColor(this.selectedIndex index ? #4FC3F7 : #F5F5F5) .borderRadius(16) .onClick(() { this.selectedIndex index }) }) } ## 当前状态 密语盒子鸿蒙版 1.2.0 已经上架华为应用市场完全免费无广告数据全离线不联网。 说实话这个 App 目前下载量很小。我分析了一下一方面是品类太小众大部分人没有加密后还要伪装这个需求意识另一方面是我之前几乎没做过推广就是静默上架等自然流量结果当然约等于零。 但从留存数据看用过的人留下来的比例还不错。有几个用户在评论区说用来和对象传悄悄话这倒是我没想到的使用场景。 ## 为什么选择做鸿蒙原生而不是跨平台 这个问题我考虑过。密语盒子的核心依赖两个能力加密 API 和剪贴板。HarmonyOS 的 cryptoFramework 接口封装得比较干净AES-GCM 支持完整不需要额外引入第三方库。如果用 Flutter 或 RN 做跨平台反而要桥接原生加密模块多一层不说还有安全审核的麻烦。 对了鸿蒙的应用审核对加密类 App 有额外审查提交的时候需要在备注里说明加密用途和算法类型第一次被打回来就是因为这个没写清楚。后来补了一份算法说明文档就过了。 ## 后续计划 下个版本打算加两个东西 - **密语分享卡片**生成一张好看的图片密文嵌在图里分享到社交平台更自然 - - **字谱市场**本地的预置几套有趣的字谱模板比如外卖菜单风、古诗词风、数学公式风降低用户自己编字谱的门槛 如果你也在做 HarmonyOS 开发或者对加密/信息隐藏这个方向感兴趣欢迎交流。我的鸿蒙开发笔记后续也会陆续整理发出来。
返回列表