Skip to content

Commit c626871

Browse files
committed
Everything for V2.5.0 Node.js
1 parent 2b5c0fa commit c626871

File tree

9 files changed

+2615
-798
lines changed

9 files changed

+2615
-798
lines changed

README.md

Lines changed: 62 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
44

5-
**Abracadabra** 是一个多表加密之小项目,使用汉字作为密文,支持自定义密文映射和关键词映射,你正在查阅其基于 Node.js 的分支。
5+
**Abracadabra** 是一个文本即时加密/脱敏工具,也可用于加密文件,你正在查阅其基于 Node.js 的分支。
66

77
Abracadabra 是表演魔术 (施魔法) 时所念的咒语。
88

@@ -14,9 +14,12 @@ C++ 版本和 Node.js 版本完全等效,密文可以互相交叉解密。
1414

1515
**查阅 C++ 实现**: [**dev_c Branch**](https://github.com/SheepChef/Abracadabra/tree/dev_c)
1616

17+
Telegram: [@abracadabra_cn](https://t.me/abracadabra_cn)
18+
1719
## 特性
1820

1921
- 方便,密文可以描述自身。
22+
- 简短,密文简短方便传播。
2023
- 随机,加密结果具有随机性。
2124
- 无序,加密的文本如咒语般不可阅读。
2225
- 安心,密码表中已剔除敏感汉字。
@@ -41,7 +44,7 @@ import { Abracadabra } from 'abracadabra-cn'
4144
你可以用以下文本来测试,请使用默认密钥(不要输入密钥)。
4245

4346
```
44-
家他你烃瞐雨峦心夕心已千迷心斋处非了青褔十第个濑总春办硼图客理明到当所分奏汐挽项更动处那上硫雨高分于硫因第部能名协要山每笋雨缬冰设呢位页一坤数琉敬心当作啊雫赴呢心能
47+
边难全您事二起住协踵先铭碘个版赴沢月及务褔集咫氧檀银绮铭学叫涧于路以白盈种四通重都俟沥困栀裳间烯化所德即园湍
4548
```
4649

4750
## 部署说明
@@ -75,32 +78,33 @@ import { Abracadabra } from 'abracadabra-cn'
7578
let Abra = new Abracadabra(); //不附带参数,
7679

7780
/*
78-
Abracadabra.LINK = "LINK";
79-
强制以链接模式加密
81+
MODES:
82+
83+
Abracadabra.ENCRYPT = "ENCRYPT";
84+
强制加密
8085
8186
Abracadabra.DECRYPT = "DECRYPT";
82-
强制解密(一定条件下)
87+
强制解密
8388
8489
Abracadabra.AUTO = "AUTO";
8590
自动(遵循自动逻辑)
8691
87-
Abracadabra.NORMAL = "NORMAL";
88-
强制普通加密
89-
9092
*/
91-
Abra.Input(input,mode,key)
93+
Abra.Input(input,mode,key,q)
9294
```
9395

9496
第一个参数 `input` 接受两种类型的输入,分别是 `String``Uint8Array`,这是此前在实例化的时候指定的输入类型。
9597

9698
如果你指定了 `UINT8` 却传入 `String`,将抛出错误,反之亦然。
9799

98-
第二个参数 `mode` 接受特定字符串的输入,任何其他输入都将被视为 `AUTO` 并被忽略。
100+
第二个参数 `mode` 接受上文中特定字符串的输入,任何其他输入都将被视为 `AUTO` 并被忽略。
99101

100102
第三个参数 `key` 接受字符串类型的密钥输入,如果不提供,则默认使用内置密钥 `ABRACADABRA`
101103

102104
如果指定了错误的密码,那么在解码/解密数据校验过程中会抛出错误。
103105

106+
第四个参数 `q` 接受布尔值的输入,如果传入 `true`,则加密结果中将不含标志位,更加隐蔽,但解密时需要强制解密。
107+
104108
在无错误的情况下, `Input()` 函数的返回值通常是 `0`
105109

106110
### Output()
@@ -110,7 +114,7 @@ import { Abracadabra } from 'abracadabra-cn'
110114

111115
let Abra = new Abracadabra(); //不附带参数,
112116

113-
Abra.Input(input,mode,key)
117+
Abra.Input(input,mode,key,q)
114118

115119
let Result = Abra.Output() //获取输出
116120
```
@@ -129,27 +133,39 @@ Abracadabra 还在积极开发中,这里是一些注意事项。
129133

130134
此分支不存在平台兼容性问题。
131135

136+
### 文件处理速度
137+
138+
鱼与熊掌不可兼得,本算法由于需要频繁查表,故对大文件(>3MB)处理速度较低。
139+
140+
本项目之目的并不是加密大文件,故不会采取积极措施优化大文件的处理速度。
141+
142+
### 标志位污染
143+
144+
加密选择的标志位尽可能地排除了日常情况下出现碰撞的可能。
145+
146+
但有些极其特殊的时候,例如你正在尝试加密日语和中文夹杂的文本/文件,此时有可能出现污染现象。
147+
148+
你可以选择强制加密来解决此问题。
149+
132150
## 加密细节
133151

134152
### 加密过程
135153

136154
```
137-
原数据 -> AES-256-CTR -> Base64 -> 三重转轮 / 映射汉字 -> 密文
155+
原数据 -> 压缩 -> AES-256-CTR -> Base64 -> 三重转轮 / 映射汉字 -> 密文
138156
```
139157

140158
### 映射表
141159

142160
Abracadabra 使用古老的多表加密,以最常用的 3000 个汉字(剔除了可能随机组成敏感词的汉字)为密本,对大小写拉丁字母,阿拉伯数字和部分符号进行映射。
143161

144-
大写字母的映射方式为在小写字母前添加一个汉字的标志位。
145-
146162
你可以自行修改映射表,制造独属于你的加密程序。
147163

148164
### AES-256-CTR
149165

150166
核心安全性由久经考验的 AES 加密算法提供,我们不打算重新发明密码学。
151167

152-
AES 加密密钥和转轮密钥是同一个。
168+
AES 加密密钥和转轮密钥是同一个,均采用哈希值
153169

154170
### 三重转轮
155171

@@ -159,15 +175,15 @@ AES 加密密钥和转轮密钥是同一个。
159175

160176
这个数组中的每个数字,都会决定三重转轮中每个转轮每次迭代的转动方向和转动距离,其复杂程度堪比甚至胜过 Enigma 机。
161177

162-
数字,字母和符号分别拥有一套转轮,即总共九个转轮,改变密钥相当于更换一套完全不同的转轮。
178+
数字/符号,字母分别拥有一套转轮,即总共六个转轮,改变密钥相当于更换一套完全不同的转轮。
163179

164180
转轮显著增加了 Base64 密文的安全性,可以有效抵抗多种攻击,如果你对具体实现方法感兴趣,欢迎查阅代码。
165181

166182
### 随机性
167183

168184
在映射为汉字的时候,每个字母/数字/符号均有多种可能性,完全随机选择。
169185

170-
这进一步降低了密文的规律性,让它看起来像毫无逻辑的乱码
186+
这进一步降低了密文的规律性,让它看起来像毫无意义的汉字字符串
171187

172188
### 标志位
173189

@@ -179,10 +195,38 @@ AES 加密密钥和转轮密钥是同一个。
179195

180196
Abracadabra 的灵感来源于网络上曾流行过的熊曰加密。
181197

198+
## Abracadabra VS 与熊论道
199+
200+
```
201+
愿青空的祝福,与我的羽翼同在
202+
203+
Abracadabra(等效密文,默认密钥):
204+
靛让每菁选名氘添硫业纽定妃祉们间檀飒蛟建去菁畔坞店只玖不班走欲办泉玊靠益登很更雫砥浇惦服谜曳经描芳贮类座钒件
205+
氖霞上铂赛些夕给锗所片奖过达侃五霞裕化鸠带萌芳留欤智请鲤花锻千悟羟短好要铁年萤萤祁莺间营桅无琼氮经店完沢添局
206+
本好房咨至浣理雅茶夏前缬赴款谜玊每客着舒事方何也欣茶在闪图带仅钠祥没沃汨锡鸭院个氘大座去莉纽北款桜氧闭泉描本
207+
208+
与熊论道(唯一密文):
209+
呋食食嘍嗡吖物吃訴吖物嗅喜達拙達發怎嘍襲現嗷既歡嚄類捕歡達哞呆麼出啽吃堅和吖既森寶蜂眠森告發沒破吖歡嘶盜達告爾取襲
210+
```
211+
212+
| 特性 \ 工具 | Abracadabra | 与熊论道 |
213+
| ------------ | ----------------- | --------------- |
214+
| 易用性 | 🟡 稍弱 | ✅ 傻瓜化 |
215+
| 加密文本体积 | ✅ 更短 | 🟡 较短 |
216+
| 加密方式 | ✅ AES-256 / 转轮 | ❌ 非公开算法 |
217+
| 加密过程 | ✅ 密钥参与 | ❌ 无用户密钥 |
218+
| 算法安全 | ✅ 抗多种攻击 | ❌ 易受攻击 |
219+
| 随机性 | ✅ 密文多变 | ❌ 密文固定 |
220+
| 隐私性 | ✅ 完全本地加密 | ❌ 上传到服务器 |
221+
| 密文构成 | ✅ 常见字 | 🟡 罕见字 |
222+
| 密文特征 | ✅ 无明显特征 | ❌ 特征明显 |
223+
| 文件加密 | ✅ 支持(较慢) | ❌ 不支持 |
224+
| 开源 | ✅ 开源 | ❌ 不开源 |
225+
182226
## Todo
183227

184228
- [x] ~~实现更规范地解析命令参数~~
185229
- [x] ~~实现加密任意文件,输出文本文档~~
186230
- [x] ~~用 Node.js 完整实现 Abracadabra 的轮子~~
187231
- [x] ~~实现让嵌入自定义密本更具灵活性~~
188-
- [ ] 数据的可靠压缩
232+
- [x] ~~数据的可靠压缩~~

docs/assets/index-Co398iAN.js

Lines changed: 544 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/assets/index-xgQKxEIX.js

Lines changed: 0 additions & 541 deletions
This file was deleted.

docs/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<meta charset="UTF-8" />
55
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
66
<title>Abracadabra Demo</title>
7-
<script type="module" crossorigin src="./assets/index-xgQKxEIX.js"></script>
7+
<script type="module" crossorigin src="./assets/index-Co398iAN.js"></script>
88
<link rel="stylesheet" crossorigin href="./assets/index-BmpJePLS.css">
99
</head>
1010
<body>

main.js

Lines changed: 14 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ export class Abracadabra {
77
static TEXT = "TEXT"; //常量方便调用
88
static UINT8 = "UINT8";
99

10-
static LINK = "LINK";
10+
static ENCRYPT = "ENCRYPT";
1111
static DECRYPT = "DECRYPT";
1212
static AUTO = "AUTO";
13-
static NORMAL = "NORMAL";
13+
1414
#input = ""; //输入类型,可以是 BLOB 或者 TEXT
1515
#output = ""; //输出类型,可以是 BLOB 或者 TEXT
1616

@@ -38,18 +38,18 @@ export class Abracadabra {
3838
*
3939
* **模式定义**
4040
*
41-
* **DECRYPT** 强制解密,对输入执行预检,然后解密
41+
* **ENCRYPT** 强制加密
4242
*
43-
* **AUTO** 自动判断输入是否是密文,然后自动执行对应操作
43+
* **DECRYPT** 强制解密
4444
*
45-
* **LINK** 强制加密,使用链接模式,将输入强制转换为字符串,进行UrlEncode,再加密
45+
* **AUTO** 自动判断输入是否是密文,然后自动执行对应操作
4646
*
47-
* **NORMAL** 强制加密,使用默认模式。
4847
* @param{string | Uint8Array}input 输入的数据,根据此前指定的输入类型,可能是字符串或字节数组
49-
* @param{string}mode 指定模式,可以是 DECRYPT AUTO LINK NORMAL 中的一种;
50-
* @param{string}key 指定密钥,默认是 ABRADACABRA;
48+
* @param{string}mode 指定模式,可以是 ENCRYPT DECRYPT AUTO 中的一种;
49+
* @param{string}key 指定密钥,默认是 ABRACADABRA;
50+
* @param{bool}q 指定是否在加密后省略标志位,默认 false/不省略;
5151
*/
52-
Input(input, mode, key = "ABRACADABRA") {
52+
Input(input, mode, key = "ABRACADABRA", q = false) {
5353
if (this.#input == Abracadabra.UINT8) {
5454
//如果指定输入类型是UINT8
5555
if (Object.prototype.toString.call(input) != "[object Uint8Array]") {
@@ -72,30 +72,20 @@ export class Abracadabra {
7272
preCheckRes = Util.preCheck(inputString);
7373

7474
if (
75-
(preCheckRes.isEncrypted &&
76-
mode != Abracadabra.LINK &&
77-
mode != Abracadabra.NORMAL) ||
75+
(preCheckRes.isEncrypted && mode != Abracadabra.ENCRYPT) ||
7876
mode == Abracadabra.DECRYPT
7977
) {
8078
//如果是加密的字符串且没有强制指定要再次加密,或者强制执行解密,自动执行解密
8179
//注意,DEFAULT此时不可用(即使指定),在这里如果指定DEFAULT,也会自动执行解密
8280
//如果是加密的字符串,指定AUTO在此处会自动解密
8381
this.#res = Util.deMap(preCheckRes, key);
8482
} else {
85-
this.#res = Util.enMap(
86-
preCheckRes,
87-
mode == Abracadabra.LINK ? true : false,
88-
key
89-
); //在字符串可解码的情况下,加密时不采用文件模式
83+
this.#res = Util.enMap(preCheckRes, key, q); //在字符串可解码的情况下,加密时不采用文件模式
9084
}
9185
} else {
9286
//如果给定的数据不可预检(不可能是密文,此时强制解密无效),直接对数据传递给加密函数
9387
preCheckRes = new Util.PreCheckResult(input, true, false);
94-
this.#res = Util.enMap(
95-
preCheckRes,
96-
mode == Abracadabra.LINK ? true : false,
97-
key
98-
);
88+
this.#res = Util.enMap(preCheckRes, key, q);
9989
}
10090
} else if (this.#input == Abracadabra.TEXT) {
10191
//如果指定输入类型是TEXT
@@ -104,20 +94,14 @@ export class Abracadabra {
10494
}
10595
let preCheckRes = Util.preCheck(input);
10696
if (
107-
(preCheckRes.isEncrypted &&
108-
mode != Abracadabra.LINK &&
109-
mode != Abracadabra.NORMAL) ||
97+
(preCheckRes.isEncrypted && mode != Abracadabra.ENCRYPT) ||
11098
mode == Abracadabra.DECRYPT
11199
) {
112100
//如果是加密的字符串且没有强制指定要再次加密,或者强制执行解密,自动执行解密
113101
//如果是加密的字符串,指定AUTO在此处会自动解密
114102
this.#res = Util.deMap(preCheckRes, key);
115103
} else {
116-
this.#res = Util.enMap(
117-
preCheckRes,
118-
mode == Abracadabra.LINK ? true : false,
119-
key
120-
); //在字符串可解码的情况下,加密时不采用文件模式
104+
this.#res = Util.enMap(preCheckRes, key, q); //在字符串可解码的情况下,加密时不采用文件模式
121105
}
122106
}
123107
return 0;

package-lock.json

Lines changed: 9 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "abracadabra-cn",
33
"description": "Use Chinese to Encode Everything",
44
"private": false,
5-
"version": "2.0.0",
5+
"version": "2.5.0",
66
"main": "./dist/abracadabra-cn.js",
77
"type": "module",
88
"scripts": {
@@ -16,7 +16,8 @@
1616
},
1717
"dependencies": {
1818
"crypto-js": "^4.2.0",
19-
"js-base64": "^3.7.7"
19+
"js-base64": "^3.7.7",
20+
"pako": "^2.1.0"
2021
},
2122
"files": [
2223
"dist"

0 commit comments

Comments
 (0)