# 三重双拼汉字加密方案 密钥生成 **Repository Path**: ttwe77/TripleDoublePinyinKeygen ## Basic Information - **Project Name**: 三重双拼汉字加密方案 密钥生成 - **Description**: 该算法致力于脱离计算机加密中文。本程序使用UUID作为种子,生成包含随机对称键盘映射及其逆映射、音调数字及小鹤双拼标注的高分辨率可视化密钥PNG图像。 - **Primary Language**: Java - **License**: GPL-3.0 - **Default Branch**: TripleDoublePinyinKeygen - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-08-23 - **Last Updated**: 2026-03-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 三重双拼汉字加密方案 使用指南 > **说明** > 本程序用于生成一种可视化的对称“键盘映射”密钥,输出为高分辨率 PNG(带 DPI 元数据)。图像由两张键盘表格组成:上表为随机映射 `p`,下表为其逆映射 `p⁻¹`;每个键同时包含一个随机音调数字(1–4)与随机或小鹤双拼标注。每次运行会生成一个 **全部大写的 UUID**(同一 UUID 显示在上下两个键盘下方),并默认用该 UUID 作为随机种子和输出文件名(`.png`)。 本工具通过三重双拼映射表,对汉字进行加密,生成唯一对应的密文。密文均为 **小写字母**。 [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) --- # 快速开始 编译并运行: ```cmd javac TripleDoublePinyinKeygen_V2.java java TripleDoublePinyinKeygen_V2 # 默认输出:.png,scale=4, dpi=600 ``` 程序运行结束会在控制台打印类似信息: ```cmd 生成完成:7F3A9E5B-....png (scale=4, dpi=600) UUID: 7F3A9E5B-... ``` ------ # 命令行参数 / 输出说明 您可以执行以下命令查看帮助, ```cmd java TripleDoublePinyinKeygen_V2 --help ``` 程序会输出: ```cmd 程序使用说明 ============== 用法: java Main [选项] 选项: -h, --help 显示此帮助信息并退出 -o <文件名> 指定输出文件名 -s <数值> 设置缩放比例(默认4)(整数) -d <数值> 设置DPI(整数)(默认600) -u 设置UUID(不区分大小写) -r 是否使用小鹤双拼(布尔值) -j 是否输出JSON文件(布尔值,默认false ) 示例: java Main -o output.txt -s 100 -d 300 -u abc123 java Main --help 注意: - 所有数值参数必须是有效的整数 - UUID会自动转换为大写格式 ``` 程序会把 PNG 写到当前目录,并在生成结束时输出文件名与 UUID。 ------ # 密钥文件(PNG)中信息的解读 生成的 PNG 是 **密钥的视觉表示**,每个键(以 QWERTY 布局)包含几部分元素: ### 1. 中央大写字母(Key,示例:`Q`, `W`, ...) - **功能**:这是键的主标识符,用于两件事: 1. **表示韵母索引**:当你要把一个韵母(如 `uan`、`en`)编码时,需要在键下方找到包含目标韵母的键,然后取该键的**中央大写字母**作为韵母编码的来源。 2. **表示声调映射目标**:当你用某个键来表示声调(比如把声调 `2` 映射到某个键),你实际上是用该键的中央大写字母来编码声调。 - **注意**:在**密文中**,所有来自中央大写字母的编码都会**转换为小写字符**以保持密文全小写(例如中央 `R` 则写作 `r`)。 ### 2. 右上角小写字母(top-right,示例:`g`, `x`) - **功能**:这是**声母(initial)替换表**。当加密一个字的声母时(例如 `y`、`s`),你查找“该声母对应的大写键位”(通常是声母字母的大写位置或事先约定的位置),从该键的**右上角小写字母**直接取代原声母。 - **为何是小写**:右上本身就是小写,直接作为密文的第一部分,无需额外大小写转换(密文要求小写)。 - **逆向**:解密时,用密文的第一个小写字母在上表右上角列表中查找对应键位,从而反推出原始声母(或其约定化形式,如 `sh`→`s`)。 ### 3. 键下方的双拼标注(pinyin 字样,如 `uan`, `en`) - **功能**:这是**韵母(final)到键位的静态映射表**(随机分布),**不具随机性**。加密时: - 找到拼音的韵母(例如 `uan`),在所有键下方查找包含该韵母的键,取该键的**中央大写字母**作为韵母编码的来源(最终写入密文时转为小写)。 - **逆向**:解密时,读出密文的第二个字符(小写),将其对应回中央大写键(大写化后),查该键下方的双拼标签以恢复韵母。 ### 4. 右下角数字(tone,1–4) - **功能**:此数字是**声调类别**(1–4),为三重密钥的第三层。它本身不是直接写入密文,而是**通过选择一个中央大写字母(Key)来表示**。也就是说:在加密时,你需要随机选择一个右下为所需数字的键,然后取该键的中央大写字母作为声调编码(写入密文时转为小写)。 - **逆向**:解密时,读出密文的第三字符(小写),把它映回对应的大写键,再读取该键右下的数字以还原声调。 ### 5. 下表(p⁻¹,逆映射)与 UUID - **下表(p⁻¹)**:图片中的第二张键盘直接表示 `p` 的逆映射(便于人工/程序交叉验证与解密),其结构与上表位置一致。解密时可直接查下表以减少搜索步骤。 - **UUID(全部大写)**:标识本密钥套。**必须保证加解密双方使用同一 UUID 的密钥图**,否则映射不一致导致无法解密。 # 加密步骤 V2版本支持加密**中文英文和数字**。密钥**默认加密中文**,**转换**到其它的语言**需要**使用**转换符** ## 中文加密 > 请注意,**发送方与接收方的UUID应一致**。 > 密钥默认加密中文,可直接使用以下教程加密中文。 中文加密时,一律使用平舌音,且无en韵母(需要将韵母en替换为eng) 以“原神 (yuán shén)”为例: 1. **分离声母与韵母** - "原" → 声母 **y**,韵母 **uan**,声调 **2**。 - "神" → 声母 **sh**(本方案无翘舌音,统一写为 **s**),韵母 **eng**(本方案无en韵母,统一写为 **eng**),声调 **2**。 2. **声母替换** 查找映射表,将声母替换为 **右上角的小写字母**。 3. **韵母替换** 查找对应的韵母,在映射表下方找到匹配的大写字母,并记录。 4. **声调替换** 根据声调数字 (1–4),在映射表 **右下角的数字** 找到对应的大写字母,并进行替换。 5. **组合** 将步骤 2、3、4 的结果拼接,得到最终密文。 最终得到的密文为一串 **小写字母.** **再以“原神 (yuán shén)”为例:**(建议保存此图便于后续参考) ![图片示例](Example.png) 拼音与分解(标准拼音): - `原` → `yuan2`:声母 `y`,韵母 `uan`,声调 `2` - `神` → `shen2`:按规则 `sh` → `s`,所以声母 `s`,韵母 en→`eng`,声调 `2` 按 **上表(p)** 进行转换(选择规则:任选一个对应数字的键作为声调键): - `原 (yuan2)`: 1. 初声 `y` → 找键 `Y`(上表):右上小写 = **c** → 声母编码:**c** 2. 韵母 `uan` → 查找下方包含 `uan` 的键(上表):`A`(下方 `uan&üan`)→ 韵母编码:**a** 3. 声调 `2` → 在上表任选右下为2的大写字母,这里选W→ 声调编码:**w** → `原` 的密文段:`caw` - `神 (shen2 → s eng 2)`: 1. 初声 `s` → 找键 `S`(上表):右上 = **b** → 声母编码:**b** 2. 韵母 `en` → 查找下方包含 `eng` 的键:`V`(下方 `eng`)→ 韵母编码:**v** 3. 声调 `2` → 同样选 `W` → 声调编码:**w** 所以`神` 的密文`bvw` - 最终密文(拼接):`cawbvw` --- ## 中文解密 解密即为加密的逆过程: 1. **切分密文** 每个汉字对应三个部分:小写字母 (声母) + 小写字母 (韵母) + 小写字母 (声调)。 2. **声母恢复** 根据声母字母,在映射表中找到其对应的大写键位,逆向恢复拼音声母。 注意:本方案无翘舌音。 3. **韵母恢复** 根据韵母对应大写字母,在映射表中查找对应的韵母集合(大写字母下方),恢复韵母。 4. **声调恢复** 查找声调大写字母,逆向映射回 1–4 的声调数字。 5. **拼合拼音** 将声母 + 韵母 + 声调组合,得到完整拼音。 6. **还原汉字** 根据拼音查字典得到汉字;如遇多音字,则需结合上下文选择正确字。 **示例:** ![图片示例](Example.png) 密文 `cawbvw` → 分段:`caw`、`bvw` - `caw` → 声母 `y` + 韵母 `uan` + 声调 `2` → `yuan2` → `原` - `bvw` → 声母 `s` + 韵母 `en` + 声调 `2` → `shen2` → `神` 最终解密结果:**原神** ## 中文特殊符号 ### 中文逗号 V2版本新增逗号输入,加密时使用**固定声母 `v`** 作为前缀,然后寻找**韵母栏“,”**对应的字母,最后**声调任选**(不影响哪种具体标点的识别,**声调仅占位**) 文本形式示例:`v(,)<任意声调>` 例如 `v(,)2`、`v(,)1` 都表示中文逗号 > 例如(如上方提到的密钥) > > 加密“原,神” > > 原**,**神→yuan2,**v(,)3**,shen2→caw**vce**bvw(这里v和v恰巧重叠了,实际的V应该被替换为V右上角的声母) ### 中文转换符 **目的**:在一条消息里切换输入模式(中文 ↔ 英文 ↔ 数字),并用可识别的转换符显式标记切换点。转换符本身也用三重编码写入密文,以保持可逆性与同步。 - 切换到英文:`v(eng)0` 解释:`v` = 声母占位;`eng` = 表示英语模式的“韵母”;`0` = 保留的“声调”值,表示这是转换控制(不是普通声调)。 - 切换到数字:`v(u)0` 解释:`u` 表示“数字模式“,0同上 ## 英文加密 ### 使用转换符切换到英文模式 **中文**→英文 - 文本形式:`v(eng)0<...>` - 语义:`V` 作为声母占位(V 在中文方案里不会被当作普通声母),`eng` 便于记忆为 english,`0` 表示“这是转换控制(无声调意义)”。 - 该转换符**同时会印在密钥图上**以免遗忘。 **数字**→英文 - 文本形式:`911<...>` - 用法与 `v(eng)0<...>` 等价,便于记忆(紧急拨号式的提示)。同样印在密钥图上并以三重编码写入密文。 **英文→中文**(从英文回中文) - 文本形式(易记写法):`xcgchi` - 说明:`x` 在英文中开头少见;`cg` → change(改变),`chi` → chinese。会印在密钥图上。 **英文→数字** / **中文→数字** - 英文转数字:`xcgnum<字数>`(`<字数>` 为接下来加密的字符数) - 中文转数字:`v(u)0<字数>` - 这两者也印在密钥图上并三重编码入密文。`<字数>` 在这里是2位数字(例如 `05` 表示接下来 5 个字符被视为数字模式)。 > 说明:所有转换符**原文形式**(如 `v(eng)0<...>`)用于人类可读的协议说明;实际发送时,转换符必须按“**三重编码**”写入密文。 ### 插件 `<...>`(仅数字) `<...>` 只能由数字组成(加密时使用密钥上的音调加密这些数字),用以在转换符处声明**英文加密方法与参数**。格式定义如下(严格): ```text v(eng)0<使用的加密方法>[2位列数][2位行数][2位开始列数][读取方向(奇左偶右)] ``` <使用的加密方法>:必填,用于指定使用何种加密方法,取值如下: - 0 = 纯声母替换(快,但易被破解) - 1 = 栅栏+替换融合(慢但更安全) #### 英文加密方法 A:纯声母替换 快速、易理解,但安全性低(适合短文本或非敏感用途)。 在要开始英文之前,先插入转换符 `v(eng)0<...>` 或 `911<...>`(以三重编码形式写入密文,见上)。`<...>` 设置为 `0`(或省略)表示纯替换。 当<使用的加密方法>为0时,忽略后方中括号内容,直接加密,例如: welcome→v(eng)0**0**welcome→vvz**z**qdkpsad 再如加密:notebook在桌上→*v(eng)0* **0** notebook *xcgchi* zai4 zuo1 sang3→*vvz* **z** msydgssh *opzplt* ebgewcbjg > 明确:纯替换只使用“右上小写字母”的映射,不引入韵母/声调的三重复杂性(除了前缀转换符本身)。每个明文字母输出 1 个密文字母。 #### **英文加密方法 B:栅栏+替换融合法** 此方法适用于大量英文加密,以保证安全性。 在 `v(eng)0<...>` 中,当 `<使用的加密方法>` 等于 `1` 时,`<...>` 必须为 **7 位数字**,各位字段含义如下(固定位宽),格式如下 ```text 格式: [列数 2位][行数 2位][开始列 2位][读取方向 1位] 例如: 0403021 表示:列数=04,行数=03,开始列=02,方向=1(奇数→向左) ``` 字段说明: - 列数(2 位,范围 [01-99]):表示表格的列数 。 - 行数(2 位,范围 [01-99]):表示表格的行数 。 - 开始列(2 位,范围 [01-列数]):从第几列开始进行“绕列填入”的起点。 - 读取方向(1 位):奇数表示向左循环(从开始列向左走),偶数表示向右循环(从开始列向右走)。 > 注意:**只有在 `<使用的加密方法>=1` 时才使用此 7 位插件格式**;如果方法不是 1,则忽略这 7 位参数或按其它方法解析。 > 四数为钥:列数 行数 起头 划向定。 > 列行排方格,不够就补空。 > 自起头,按方向(奇左偶右),左右绕一圈。 > 逐列竖读出密文,拼接送出去。 > 回填复原按行读,末尾去掉补空。 ##### 加密流程 1. 明确要加密的明文,这里以”**never gonna give you up**“为例 2. 首先,需要确**定密钥中”列“的值**。我们建议有几个单词就以这些单词词数作为列,如例子就有5个词数,这里列5列: 3. | n | e | v | e | r | | :--: | :--: | :--: | :--: | :--: | | | g | o | n | n | | a | | g | i | v | | e | | y | o | u | | | u | p | | | 4. 我们发现**表格有5行,所以行数为05**. 5. 现在**决定密钥**: 1. 列数:05 2. 行数:05 3. 起始列:从[01-05]中取值,这里**取04** 4. 读取方向:从[1-9]取值,**这里取7**,奇数向左偶数向右 6. 根据密钥意思”**从第04列从上到下,向左读取**“,在表格中读出1次加密的密文:enio vogypeg _ _ un ae rnvu(注:遇到2个空格就用2个明显的下划线代替) 7. 使用密钥加密1次加密的密文(声母替换):dmts vszcxdz _ _ wm id fmvq 8. 在前面插入转换符和密钥:*v(eng)0*1**0505047**dmts vszcxdz _ _ wm id fmvq→*vvz*d**zazazsq**dmts vszcxdz _ _ wm id fmvq ##### 解密流程 现在让我们来解密刚刚的示例:*vvz*d**zazazsq**dmts vszcxdz _ _ wm id fmvq 1. 使用密钥解密密文:*v(eng)0*1**0505047**dmts vszcxdz _ _ wm id fmvq. 2. 读取信息,**v(eng)0**表示从中文转为英文,**1**代表使用**英文加密方法 B:栅栏+替换融合法**,后面**0505047**为密钥,意思是**列05列,05行的表格。从第04列开始从上到下,向左读取内容**。 3. 列表,然后读出原文。 ## 数字加密 1. 使用 `v(u)0<字数>` 或 `xcgnum<字数>` 声明进入数字模式,`<字数>` 为两位十进制数字(例如 `05` 表示接下来 5 个字符为数字模式)。 2. 数字模式开始后,程序按密钥图中的 **音调(0–9)** 将每个数字编码为固定长度的字母序列。 3. 数字块结束后,**必须**额外写入并加密 `110` 或 `911`(由发送方选择目标语言:`110` 表示切回中文,`911` 表示切回英文),以明确后续文本的解析模式。 ## 转换符整理 | | 原中文 | 原英文 | 原数字 | | :--------: | :-----: | :----: | :----: | | **转中文** | - | xcgchi | 110 | | **转英文** | v(eng)0 | - | 911 | | **转数字** | v(u)0 | xcgnum | - | ## 加密解密示例 **原文**:我是Alex,我在25日生日 加密步骤:原文→wo3,si4,**v(eng)00**,alex,**xcgchi**,**v(,)3**,wo3,zai4,**v(u)002**,25,**110**,ri4,seng1,ri4 →qwe bnm **vvzz** ikdo **opzplt** **vcc** qwe ebg **wzzzj** wa **ccz** fnm bvc fnm 得出密文:qwebnmvvzzikdoopzpltvccqweebgwzzzjwacczfnmbvcdnm 解密和加密相差不大,可试着逆向解密上文。 ------ # 密钥表复现机制 本程序生成的密码表具有**可复现性**:同一个 UUID 始终对应同一张密码表。 若需复现同一张密码表,只需保证 **UUID 相同**,并在命令行中指定: ```cmd java TripleDoublePinyinKeygen_UUID_AllRandom -u <在这里输入密码表上的UUID> ``` **示例**: 两次运行下列命令将得到完全一致的密码表(即便在不同的计算机上): ```cmd java TripleDoublePinyinKeygen_UUID_AllRandom -u 123E4567-E89B-12D3-A456-123456789012 ``` --- # 推荐安全流程 1. 在**隔离网络的可信机器**上运行本程序生成 PNG。 2. 使用受信任的打印设备打印图像,并在打印后当场核对打印输出(纸上 UUID 与数字文件中的 UUID 一致)。 3. 把打印件交付给接收方(面对面或可信快递,避免邮件和拍照)。 4. 传输后在数字设备上安全删除(且按需要做安全擦除),并在不再需要时对打印件进行粉碎。 ------ # 安全注意事项与免责声明 - **本程序不是经审计的加密产品**。若用于高风险机密,请使用已审计的密码学库与成熟的密钥管理系统(例如 libsodium、OpenSSL 的受控生成命令)。 - 由于这是对称密钥,若有任意一方泄露密钥,请立即协商销毁密钥。 - `SecureRandom` 在大多数 JVM 中使用操作系统的熵源,但具体实现与平台相关;**不要**在对安全性要求极高的场景仅依赖本工具生成的密钥(除非你已在可信环境中验证其随机源)。 - 对密钥的任何电子副本均应加密并限制访问权限。打印件视为同等敏感材料。 ------ # 许可证说明 本项目(包含所有源代码及文档)基于**GNU 通用公共许可证第 3 版(GNU General Public License v3.0,简称 GPLv3.0)** 授权。 完整许可证文本请参阅 [LICENSE](LICENSE) 文件,或访问 [https://www.gnu.org/licenses/gpl-3.0.html](https://www.gnu.org/licenses/gpl-3.0.html)了解更多信息。 [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)