Skip to content

Commit 4aa231c

Browse files
authored
Update USAGE.md
1 parent 3808993 commit 4aa231c

1 file changed

Lines changed: 179 additions & 46 deletions

File tree

USAGE.md

Lines changed: 179 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -6,37 +6,25 @@
66

77
如果想直接阅读使用指南,请跳到 [**使用指南**](#最佳操作实践)
88

9-
## 密本安全
9+
```
10+
明文 -> 压缩 -> AES-256-CTR -> Base64 -> 三重转轮 -> 映射汉字 -> 组句(仅仿真加密时) -> 密文
11+
```
1012

11-
魔曰的密本不同于任何同类型的工具,它由数百个《通用规范汉字表》中的一级字和二级字构成,也有一些非常常见的 **日本和制汉字(Kanji)**,比如 **桜(Sakura)**;没有任何让人眼花缭乱的诡异汉字。
12-
13-
## 随机性
14-
15-
相同原文,相同密钥的情况下,本程序的加密结果随机性很高,不同于其他类似工具的单一密文。
16-
17-
随机性可以显著增强本工具的安全性,抵抗各种攻击,
18-
19-
在明文和密钥都一样的情况下,每次加密出来的密文可以说是**完全不同**
13+
## 压缩和校验
2014

21-
### 传统加密随机性
15+
针对短文本,本项目使用针对短文本优化的 [**Unishox2**](https://github.com/siara-cc/Unishox2) 压缩算法,避免了通用压缩算法(如 GZIP 等)文件头过重的问题。一般数据(>1KB)则采用GZIP。
2216

23-
第一重随机性来源于 AES-256-CTR 的两字节初始化向量,能够提供 256×256 共 65536 种可能密文。
24-
25-
第二重随机性则来源于密本(不考虑转轮),每个字符至少有 10 种加密可能,即第二重随机性为 10^N。
26-
27-
最终的密文可能性为 65536*10^N,N为Base64字符串长度(近似正比于原文字节数)。
28-
29-
### 仿真加密随机性
17+
针对链接和常见域名编排了字典,有效提高特定链接(例如网盘链接)的压缩效率。
3018

31-
第一重随机性来源于 AES-256-CTR 的两字节初始化向量,能够提供 256×256 共 65536 种可能密文
19+
压缩后会执行效率验证,如果出现无效压缩,则自动回落到原始数据
3220

33-
第二重随机性则来源于密本和句式(不考虑转轮),每个字符至少有 3 种加密可能,即第二重随机性为 3^N。
21+
---
3422

35-
句式本身引入的虚词也提供相当的随机性
23+
项目使用轻量化的 [**卢恩算法**](https://zh.wikipedia.org/zh-cn/%E5%8D%A2%E6%81%A9%E7%AE%97%E6%B3%95)(US2950048, ISO/IEC 7812-1) 来对解密结果做简单校验,能够检出 70%的错误
3624

37-
不考虑句式虚词,最终的密文可能性为 65536*3^N,考虑虚词则更高
25+
卢恩算法比起 Hmac 和 AES-GCM,安全性稍弱,但它十分轻量,校验位仅占一个字节
3826

39-
## 加密安全
27+
## 加密和混淆
4028

4129
### AES-256
4230

@@ -52,49 +40,194 @@ AES-256 是业内公认的安全加密算法,久经考验。
5240

5341
密钥参与的古典转轮混淆很大程度上避免了此问题,如果你在意安全性,请尽可能使用不同的密钥来加密。
5442

43+
---
44+
5545
### 转轮混淆
5646

57-
有关转轮混淆的细节,请见 [**Issue#30**](https://github.com/SheepChef/Abracadabra/issues/30)
47+
转轮混淆之前的原文,是一个使用AES加密后数据编码而成的Base64字符串,转轮混淆对其的处理为彻底打乱Base64字符串的字母/数字/符号,使其无法被正常解码为上一层AES256加密后的字节数据(包括两字节IV在内)。
5848

59-
## 传统加密标志位
49+
#### 密钥和操作数
6050

61-
标志位用来简化加解密操作流程,程序识别到加密标志位便会自动解密,无需用户手动指定解密,提高便利性。
51+
1. 对密钥进行SHA256
52+
2. 对SHA256后得到的32字节数组中的每个元素执行对十取余,得到一个操作数数组(这个数组中每个元素的大小不超过9,不小于0)
6253

63-
没有标志位的密文,在自动模式下将默认被再次加密,你需要手动指定强制解密。
54+
#### 轮转规则
6455

65-
## 文言仿真器
56+
混淆时,每混淆/映射一个字符,就取当前操作数,执行一次转轮轮转,并将当前操作数的索引偏移一位。
6657

67-
文言仿真,本质上是一种数据特征处理手段
58+
下次加密便会从操作数数组中取下一个操作数执行转轮轮转。如果取到数组末尾,则从头开始,循环往复
6859

69-
仿真密文“载荷子”采用单字。载荷子和提前编写好的句式模板构成一个语块,每个句式都有一个固定载荷容量。
60+
轮转方向和距离由当前操作数(N)决定。
61+
遵守以下规则:
7062

71-
在生成密文的时候,会按照和传统一致的策略,对数据进行压缩,加密。然后使用一个特定算法来选取句式。
63+
- 如果操作数为0,将其当作10并继续
7264

73-
分析句式中所有有效载荷的属性(形容词,名词,动词等)和顺序,然后配合三重轮转来匹配选取载荷子,配合标点符号(可选),最终组成一个合法密文。
65+
如果该操作数是偶数(N%2 == 0)
7466

75-
生成出的密文符合古文语法,上下文有似是而非的逻辑关系。
67+
- 将第一个密钥轮向右轮6位
68+
- 将第二个密钥轮向左轮N*2位
69+
- 将第三个密钥轮向右轮(N/2)+1位
7670

77-
有关文言仿真的更多细节,请见 [**Issue#60**](https://github.com/SheepChef/Abracadabra/issues/60)
71+
如果该操作数是奇数(N%2 != 0)
7872

79-
## 压缩算法
73+
- 将第一个密钥轮向左轮3位
74+
- 将第二个密钥轮向右轮N位
75+
- 将第三个密钥轮向左轮(N+7)/2位
8076

81-
项目使用专门针对短文本优化的 [**Unishox2**](https://github.com/siara-cc/Unishox2) 压缩算法,避免了通用压缩算法(如 GZIP 等)文件头过重的问题
77+
其中,第一个和第三个转轮为顺序轮,第二个转轮为乱序(手动打乱)轮
8278

83-
针对链接和常见域名编排了字典,有效提高特定链接(例如网盘链接)的压缩效率。
79+
转轮每次转动方向和距离由操作数组(密钥)决定
80+
可能的密钥空间为10^32。
8481

85-
## 错误校验
82+
#### 映射规则
8683

87-
项目使用轻量化的 [**卢恩算法**](https://zh.wikipedia.org/zh-cn/%E5%8D%A2%E6%81%A9%E7%AE%97%E6%B3%95)(US2950048, ISO/IEC 7812-1) 来对解密结果做简单校验,能够检出 70%的错误
84+
映射采用 字母 -> 索引 -> 字母 -> 索引 的重复操作
8885

89-
卢恩算法比起 Hmac 和 AES-GCM,安全性稍弱,但它十分轻量,校验位仅占一个字节。
86+
设立一个原映射标准字符串(实际比这个要长得多)
87+
```
88+
abcdefjhigk....
89+
```
90+
91+
三个转轮的长度和原字符串一致。
92+
假设三个转轮状态如下。
93+
(下一个字符加密时会轮转)
94+
```
95+
bcdefjhigka....
96+
edfbjichgak....
97+
fjhigkabcde....
98+
```
99+
100+
现在,假设我们要混淆字符 a
101+
102+
1. 在原字符串中找到字符 a 的索引,得到 0
103+
2. 在第一个转轮中查找索引 0,得到字符 b
104+
3. 在原字符串中查找字符 b 的索引,得到 1
105+
4. 在第二个转轮中查找索引 1,得到字符 d
106+
5. 在原字符串中查找字符 d 的索引,得到 3
107+
6. 在第三个转轮中查找索引 3,得到字符 i
108+
109+
由此完成了 a --> i 的转轮映射。
110+
111+
其他所有字符以此类推,均可得到一个映射。
112+
(这个映射可以和原文本相同,修正了Enigma机的弱点)
113+
114+
每轮转一次转轮,都会得到一个完全不同的映射表,轮转规则见上一小节。
115+
116+
更多内容参见 [**Issue#30**](https://github.com/SheepChef/Abracadabra/issues/30)
117+
118+
## 汉字映射
119+
120+
### 映射表和模板
121+
122+
魔曰的密本不同于任何同类型的工具,它由数百个《通用规范汉字表》中的一级字和二级字构成,也有一些非常常见的 **日本和制汉字(Kanji)**,比如 **桜(Sakura)**;没有任何让人眼花缭乱的诡异汉字。
123+
124+
密本是纯人工挑选编纂的,映射表公开可查,查阅 [**映射表(传统)**](https://github.com/SheepChef/Abracadabra/blob/main/src/javascript/mapping.json) 或者 [**映射表(仿真)**](https://github.com/SheepChef/Abracadabra/blob/main/src/javascript/mapping_next.json) 以了解密本的全貌。
125+
126+
古文句式模板编纂时参考了《古文观止》和《古文辞类纂》,资料来自 [**中国哲学书电子化计划**](http://ctext.org/zhs)
127+
128+
---
129+
130+
### 传统模式
131+
132+
>困句夏之全玚凪斋或骏琅咨兆咩谜理金说宙银歌舒
133+
134+
传统模式的密表是几百个常见汉字,加密结果为这些汉字组成的无序字符串。
135+
136+
在传统模式下,会在随机位置对密文添加标志位,用来简化加解密操作流程,程序识别到加密标志位便会自动解密,无需用户手动指定解密,提高便利性。你也可以生成没有标志位的密文,此时需要手动指定强制解密。
137+
138+
传统模式类似此前存在过的诸多加密项目,加密效率高,密文较短,随机性很强,适用于一般场景。
139+
140+
---
141+
142+
### 文言文仿真
143+
144+
>光韵开云,雅于莺茶,停而行之之谓速。是故无悦无谜,无瑞无聪,裳之所走、树之所振也。旧铃之纯水,常为悦水之莹风。人曰:“瑞琴之路,常留于其所允行而不读之处。” 璃非笑而去之者,孰可无鹏。非将选也,非可指也,书非当事涧,仍继叶言,奈何,同森而非航水也,能鸢者益。
145+
146+
文言仿真,会将加密后的字符串映射为仿古文本中的若干个载荷字。
147+
148+
用户可以调整仿真器的随机参数,启用特定风格模板的过滤,最终影响生成的密文风格。
149+
150+
以下是文言仿真的基本步骤:
151+
152+
1. 分配载荷,遇到超大载荷则平均分配,递归分段处理。
153+
2. 在句式库中选择对应载荷量的句式。
154+
3. 在句式模板中插入载荷字,插入时数据经过三重转轮混淆。
155+
4. 在句式和句式之间插入标点符号。
156+
5. 得到完整密文。
157+
158+
用户可以影响载荷分配时的随机因子;在选择句式时,可以打开特定风格的过滤器。
159+
160+
#### 载荷分配
161+
162+
载荷分配本质上是简化了的找零问题。
163+
将一个给定的载荷量(例如37),分解成若干个1~9的整数之和。
164+
165+
载荷将被预先按比例分为 Begin, Main, End 三部分,对应一段密文的三节,每节都拥有一个不同的句式库。
166+
167+
实际上的载荷分配,和句式选择同时进行。有两种策略,分别是贪心算法和随机分配,每个分配步骤都会选择二者之一。
168+
169+
贪心算法在每一步尽可能大地分配载荷,从而得到一个较为整齐的分配结果。
170+
171+
用户可以指定更高的随机因子,增加随机分配的概率(最大100%),从而得到更加零碎的分配结果。
172+
173+
#### 句式模板和密表
174+
175+
句式模板有一个固定的语法,以辅助解析。
176+
177+
```
178+
8D/N/anti/MV/V/N/,/still/继/N/V/,/why/,/and/N/而/anti/V/N/ye/P
179+
180+
// 8 -> 载荷数量
181+
// "/" ->语素分隔符
182+
// N->名词 V->动词 A->形容词 AD->副词
183+
// B->一般句式 C->骈文句式 D->逻辑句式 E->既是骈文句式,又有逻辑
184+
// P->句号 Q->问号 R->冒号和引号 | 依需要添加在句式末尾,代替原有逗号。
185+
// by/why/anti... -> 虚词
186+
187+
// 其他(汉字)原样保留
188+
```
189+
190+
密表则按照词性分类,将动词,形容词,副词,和名词分开映射。
191+
192+
#### 选择句式
193+
194+
给定一个分配的载荷量,以及此时载荷所处的密文节(Begin/Main/End),算法会在对应句式库里过滤出所有匹配该载荷量的句式。
195+
196+
如果用户没有指定任何过滤器,一般情况下,则在所有载荷量匹配的句式中随机选择一个,无论其分类。
197+
有 25% 概率将在这些句式中再次过滤出逻辑/骈文句式,然后随机选用其中的一个,如果没有可用的句式,则在所有载荷量匹配的句式中随机选择一个。
198+
199+
如果用户指定了过滤器(骈文/逻辑),则会再次过滤出可用的骈文/逻辑句式,然后随机选用其中的一个。
200+
如果对应载荷量没有可用的骈文/逻辑句式,则在所有载荷量匹配的句式中随机选择一个。
201+
202+
总体而言,句式选择提供了较强的随机性和灵活度。
203+
204+
#### 插入载荷字和标点
205+
206+
算法将用分隔符"/"将句式分割成数组,然后丢弃句式的开头部分。
207+
208+
再把每个句子分割出的数组,依次压入一个大数组中,得到一个二维数组。
209+
210+
此时将用两层循环依次遍历数组中的每一个元素:
211+
- 遇到N/V/A/AD等载荷位,则对表映射一个载荷字,追加到密文字符串上。
212+
- 遇到虚词指示,则在对应虚词库中随机选择一个追加到字符串上。
213+
- 按照一定的规则,在句式和句式之间插入标点符号,或者换行符(分段标志)。
214+
- 遇到汉字或者其他字符,则原样追加到密文字符串上。
215+
216+
由此得到一个强随机性,包含标点符号的文言文密文字符串。
217+
218+
如果用户指定不需要标点符号,那么会执行最后一次过滤,过滤出不含标点符号的密文结果。
219+
220+
更多内容参见 [**Issue#60**](https://github.com/SheepChef/Abracadabra/issues/60)
221+
222+
## 前端和跨平台操作性
90223

91-
## 跨平台
224+
魔曰加密是一个跨平台的项目,以 JavaScript 实现,提供 WebAssembly 模块,浏览器插件,和APK安装包。
92225

93-
魔曰加密是一个跨平台的项目,以 JavaScript 实现,提供 WebAssembly 模块
226+
项目的前端代码是开源的,拥有完善的配套功能和美观的视觉体验,支持 PWA,可以在各种地方使用
94227

95-
目前项目的 Demo 页已经开源,并且我(开发者)自认为它制作精美,拥有完善的配套功能和美观的视觉体验,且支持 PWA,可以安装到本地离线使用
228+
前端使用 Vue 构建,你可以随时下载源码,在你喜欢的地方轻易地部署它
96229

97-
Demo 页使用 Vue 构建,你可以随时下载源码,在你喜欢的地方轻易地部署它。
230+
[<img src="https://img.shields.io/badge/前端源码-9a10b5?style=for-the-badge" width="103" />](https://github.com/SheepChef/Abracadabra_demo)
98231

99232
## 最佳操作实践
100233

@@ -149,7 +282,7 @@ Demo 页使用 Vue 构建,你可以随时下载源码,在你喜欢的地方
149282

150283
---
151284

152-
### 传统乱字加密
285+
### 传统模式加密
153286

154287
下面列出一些情况下的最佳实践。
155288

@@ -165,4 +298,4 @@ Demo 页使用 Vue 构建,你可以随时下载源码,在你喜欢的地方
165298

166299
你可以不填密码,这将会使程序自动用内部的默认密码`ABRACADABRA`加/解密。
167300

168-
把密文的识别交给标志位,这么做可以让他人很方便地解密。
301+
把密文的识别交给标志位,这么做可以让他人很方便地解密。

0 commit comments

Comments
 (0)