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