Skip to content

Commit 5357230

Browse files
authored
Update V3.3.0
Update V3.3.0
2 parents 1f28d0f + f91f715 commit 5357230

19 files changed

+1880
-210
lines changed

JavyInputAppendix.js

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,8 @@
2525
"mode":"", // ENCRYPT | DECRYPT | AUTO // AUTO 仅在 method 指定 OLD 时合法
2626
"key":"", // 加密密钥,一个字符串 //如果缺省,自动使用默认值
2727
"q":bool, // OLD模式下,决定是否添加标志位
28-
"WenyanConfig":{ //文言文生成配置,解密时可以缺省。
29-
"PunctuationMark": bool;// 指定是否为密文添加标点符号,默认 true/添加;
30-
"RandomIndex":number, // 仅WENYAN模式下需要:算法的随机程度,越大随机性越强,默认 50,最大100,超过100将会出错;
31-
"PianwenMode":bool, // 仅WENYAN模式下需要:尽可能使用对仗的骈文句式; 与逻辑句式冲突
32-
"LogicMode":bool, // 仅WENYAN模式下需要:尽可能使用逻辑句式; 与骈文句式冲突
33-
"Traditional":bool, // 仅WENYAN模式下需要:输出繁体中文。
34-
},
28+
"WenyanConfig":{...}, //文言文生成配置,详情见JavaScript接口定义。
29+
"AdvancedEncConfig":{...} //高级加密配置,详情见JavaScript接口定义。
3530
}
3631
3732
*/
@@ -68,7 +63,13 @@ function index(input) {
6863
if (input.method == "WENYAN") {
6964
if (input.inputType == "TEXT") {
7065
let Abra = new Abracadabra(input.inputType, input.outputType);
71-
Abra.WenyanInput(input.input, input.mode, input.key, input.WenyanConfig);
66+
Abra.WenyanInput(
67+
input.input,
68+
input.mode,
69+
input.key,
70+
input.WenyanConfig,
71+
input.AdvancedEncConfig
72+
);
7273
let Output = Abra.Output();
7374
if (input.outputType == "UINT8") {
7475
Output = uint8ArrayToBase64(Output);
@@ -77,7 +78,13 @@ function index(input) {
7778
} else if (input.inputType == "UINT8") {
7879
let Abra = new Abracadabra(input.inputType, input.outputType);
7980
let UINT8In = base64ToUint8Array(input.input);
80-
Abra.WenyanInput(UINT8In, input.mode, input.key, input.WenyanConfig);
81+
Abra.WenyanInput(
82+
UINT8In,
83+
input.mode,
84+
input.key,
85+
input.WenyanConfig,
86+
input.AdvancedEncConfig
87+
);
8188
let Output = Abra.Output();
8289
if (input.outputType == "UINT8") {
8390
Output = uint8ArrayToBase64(Output);

README.md

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949

5050
- **仿真,使用文言语法句式**
5151
- 开源,所有源代码公开可查。
52-
- 安全,完全离线的AES加密
52+
- 安全,标配 AES,可选高级加密套件
5353
- 可靠,代码经过严格单元测试。
5454
- 便捷,易于本地部署和使用。
5555

@@ -118,9 +118,9 @@ APK文件可以 [**在 Release 中下载**](https://github.com/SheepChef/Abracad
118118
### 加解密过程
119119

120120
```
121-
明文 -> 压缩 -> AES-256-CTR -> Base64 -> 三重转轮 -> 映射汉字 -> 组句(仅仿真加密时) -> 密文
121+
明文 -> 压缩 -> 加密/高级加密 -> Base64 -> 三重转轮 -> 映射汉字 -> 组句(仅仿真加密时) -> 密文
122122
123-
密文 -> 解仿真(仅仿真加密) -> 转轮逆映射 -> Base64 -> AES-256-CTR 解密 -> 解压缩 -> 明文
123+
密文 -> 解仿真(仅仿真加密) -> 转轮逆映射 -> Base64 -> 解密 -> 解压缩 -> 明文
124124
```
125125

126126
### 映射表
@@ -137,6 +137,19 @@ Abracadabra 以最常用的 3000 个汉字为密本,对大小写拉丁字母
137137

138138
AES 加密密钥和转轮密钥是同一个,均采用哈希值。
139139

140+
### 高级加密套件
141+
142+
魔曰提供高级密码学套件支持,使用者可藉此执行更高安全性的加密。
143+
144+
除 AES-256-CTR 外,下列密码套件受支持:
145+
146+
- **强IV** (初始化向量,16Bytes)
147+
- **HMAC-SHA256** (消息签名,32Bytes)
148+
- **PBKDF2** (密钥衍生算法,200000次哈希迭代,盐值长度 16Bytes)
149+
- **TOTP** (时效性密钥,作为 PBKDF2 之盐值,可自定义多个参数)
150+
151+
启用高级加密套件将导致密文长度显著增加,所有组件均可独立开启和关闭。
152+
140153
### 三重转轮混淆
141154

142155
模拟古老的转轮,每次加密均会对密本映射进行偏移。
@@ -203,11 +216,12 @@ AES 加密密钥和转轮密钥是同一个,均采用哈希值。
203216
以下是本项目的依赖项:
204217

205218
- [**Unishox2**](https://github.com/siara-cc/Unishox2) 短字符串压缩实现 _©Siara-cc_, **Apache-2.0** License.
206-
- [**crypto-js**](https://github.com/brix/crypto-js) AES加密实现 _©Jeff Mott/Evan Vosberg_, **MIT** License.
219+
- [**crypto-js**](https://github.com/brix/crypto-js) 加密算法实现 _©Jeff Mott/Evan Vosberg_, **MIT** License.
207220
- [**pako**](https://github.com/nodeca/pako) GZIP压缩实现 _©Vitaly Puzrin/Andrei Tuputcyn_, **MIT** License.
208221
- [**js-base64**](https://github.com/dankogai/js-base64) Base64编码工具实现 _©Dan Kogai_, **BSD-3-Clause** License.
209222
- [**mersenne-twister**](https://github.com/boo1ean/mersenne-twister) 梅森旋转算法实现 _©Makoto Matsumoto/Takuji Nishimura_, **BSD-3-Clause** License.
210223
- [**opencc-js**](https://github.com/nk2028/opencc-js) 简繁体转换实现 _©nk2028_, **MIT** License.
224+
- [**otplib**](https://github.com/yeojz/otplib) TOTP 实现 _©Gerald Yeo_, **MIT** License.
211225

212226
本项目许可证与所有依赖项的许可证兼容。
213227

docs/document/enc.md

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,66 @@
88

99
然后,对第一次哈希的结果附加两个随机字节,再次哈希,取其值作为加密的 IV。
1010

11+
## 高级加密
12+
13+
魔曰支持数个高级加密套件,允许资深用户增强密文的安全性。
14+
15+
除 AES-256-CTR 外,下列密码套件受支持:
16+
17+
- **StrongIV**
18+
- **HMAC-SHA256**
19+
- **PBKDF2**
20+
- **TOTP**
21+
22+
启用高级加密套件将导致密文长度显著增加,所有组件均可独立开启和关闭。
23+
24+
### StrongIV
25+
26+
为了节省密文长度,魔曰默认使用熵为 16bits 的 2 字节初始化向量(IV)来执行 AES 加密。
27+
28+
开启 StrongIV 后,魔曰将使用熵为 128bits 的 16 字节初始化向量来执行 AES 加密。
29+
30+
开启本功能后,在多次使用相同密钥加密的情况下,出现密钥流重用的概率会大大降低。
31+
同时会将密文增长 16 字节,导致输出结果变长。
32+
33+
### HMAC-SHA256
34+
35+
魔曰默认不对消息进行强完整性验证,仅使用 [**卢恩算法**](https://zh.wikipedia.org/zh-cn/%E5%8D%A2%E6%81%A9%E7%AE%97%E6%B3%95)(US2950048, ISO/IEC 7812-1) 来对解密结果做简单校验。
36+
37+
打开 HMAC 后,魔曰将对密文执行 SHA-256 哈希签名,并将签名附加在密文之后。
38+
39+
开启本功能可防止针对密文的恶意篡改,同时会将密文增长 32 字节,导致输出结果变长。
40+
41+
### PBKDF2
42+
43+
::: tip 提示
44+
45+
启用 PBKDF2 后,由于需要执行二十万次密钥迭代,会导致加密/解密卡顿。
46+
47+
:::
48+
49+
魔曰默认直接使用密钥的一次 SHA-256 哈希作为加密密钥。
50+
51+
打开 PBKDF2 后,魔曰将会取 16 字节的随机盐值,对密钥执行 200000 次哈希迭代,用迭代后的密钥执行加密,并将盐值附加在加密数据之后。
52+
53+
开启本功能可防止针对密钥哈希的彩虹表攻击,同时会将密文增长 16 字节,导致输出结果变长。
54+
55+
### TOTP
56+
57+
::: tip 提示
58+
59+
TOTP 不是安全性的保证,它可以减少 PBKDF2 算法对密文长度的影响,但并不显著增加密钥熵。
60+
61+
用户必须先启用 KDF 才能启用 TOTP。
62+
63+
:::
64+
65+
TOTP 是 PBKDF2 的附加功能,允许用户向密文增加解密时效性。
66+
67+
魔曰使用经过简单修改的 TOTP 算法,使其最终输出 16 位数字而非传统的 6~8 位。并不直接将 TOTP 密钥用于加密,而是将其作为盐值参与 PBKDF2 的密钥派生。
68+
69+
允许用户自定义 TOTP 加密解密所使用的时间戳(默认为系统时间),每步时间大小,和预共享密钥(默认为加密主密钥)。
70+
1171
## 三重转轮混淆
1272

1373
转轮混淆之前的原文,是一个使用 AES 加密后数据编码而成的 Base64 字符串,转轮混淆对其的处理为彻底打乱 Base64 字符串的字母/数字/符号,使其无法被正常解码为上一层 AES256 加密后的字节数据(包括两字节 IV 在内)。
@@ -107,9 +167,9 @@ fjhigkabcde....
107167
graph TD
108168
109169
subgraph "加密"
110-
RANDBYTES["Random IV Generation<br/>2 bytes"]
111-
AES256["AES_256_CTR_E()"]
112-
KEYDERIV["SHA256 Key Derivation"]
170+
RANDBYTES["Random IV Generation"]
171+
AES256["AES-256-CTR/高级加密"]
172+
KEYDERIV["Key Derivation"]
113173
end
114174
115175
subgraph "编码和混淆"

docs/document/js-deploy.md

Lines changed: 85 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ let Abra = new Abracadabra(InputMode, OutputMode);
4444
使用`Uint8Array`作为输入/输出方式,魔曰可以加解密任意二进制(图片/视频/任何文件),但是不推荐这么做。
4545
:::
4646

47-
### WenyanInput() 文言仿真加密函数
47+
### WenyanInput() 文言仿真加解密函数
4848

49-
`WenyanInput()` 函数用来对数据执行文言文仿真加密
49+
`WenyanInput()` 函数用来对数据执行文言文仿真加解密
5050

5151
```js
5252
import { Abracadabra } from "abracadabra-cn";
@@ -60,10 +60,11 @@ let Abra = new Abracadabra(); //不附带参数,
6060
* @param {string} mode 指定模式,可以是 ENCRYPT DECRYPT 中的一种;
6161
* @param {string} key 指定密钥,默认是 ABRACADABRA;
6262
* @param {WenyanConfig} WenyanConfigObj 文言文的生成配置;
63+
* @param {AdvancedEncConfig}AdvancedEncObj 指定安全加密特性;
6364
* @param {any}callback 回调函数,获取执行过程中特定位置的结果
6465
* @return {number} 成功则返回 0(失败不会返回,会抛出异常)
6566
*/
66-
Abra.WenyanInput(input, mode, key, {...}, callback);
67+
Abra.WenyanInput(input, mode, key, {...}, {...}, callback);
6768
```
6869

6970
第一个参数 `input` 接受两种类型的输入,分别是 `String``Uint8Array`,这是此前在实例化的时候指定的输入类型。
@@ -76,7 +77,9 @@ Abra.WenyanInput(input, mode, key, {...}, callback);
7677

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

79-
第五个参数 `callback` 接受一个回调函数,缺省时为 `null`。程序会在执行中关键位置多次调用此函数,以便调试,无调试需求可忽略此项。
80+
第六个参数 `callback` 接受一个回调函数,缺省时为 `null`。程序会在执行中关键位置多次调用此函数,以便调试,无调试需求可忽略此项。
81+
82+
---
8083

8184
第四个参数接受一个`WenyanConfig`配置对象的输入,仅在加密的时候需要:
8285

@@ -107,18 +110,90 @@ export interface WenyanConfig {
107110

108111
`PianwenMode``LogicMode` 不能同时指定为 `true`,否则会抛出错误。
109112

113+
---
114+
115+
第五个参数接受一个`AdvancedEncConfig`配置对象的输入,仅在高级加密的时候需要:
116+
117+
```javascript
118+
export interface AdvancedEncConfig {
119+
/** 指定是否打开高级加密功能,默认 false/不开启; */
120+
Enable?: boolean;
121+
/** 指定是否使用完整16字节IV,默认 true/开启*/
122+
UseStrongIV?: boolean;
123+
/** 指定是否使用HMAC对消息签名,默认 false/不开启; */
124+
UseHMAC?: boolean;
125+
/** 指定是否对密钥加盐并使用密钥衍生函数 false/不开启;*/
126+
UsePBKDF2?: boolean;
127+
/** 指定是否使用TOTP作为密钥衍生的盐值,默认 false/不开启,若不使用密钥衍生函数,则不生效;*/
128+
UseTOTP?: boolean;
129+
/** 指定TOTP时间窗口,取值范围 0~15
130+
* 对应 [3 5 10 30 min] [2 6 12 h] [1 3 5 d] [1 3 Week] [1 2 6 Month] [1 yr], 默认4;
131+
**/
132+
TOTPTimeStep?: number;
133+
/** 指定用于TOTP加密的Unix时间戳记,以毫秒为单位(JS标准),默认为系统时间;*/
134+
135+
TOTPEpoch?: number;
136+
/**
137+
* 指定用于TOTP加密的预共享密钥,默认为加密主密钥,推荐使用网站域名作为此项密钥以提升安全性;
138+
* 注意,TOTP的安全性主要依赖于此BaseKey
139+
**/
140+
TOTPBaseKey?: string;
141+
}
142+
```
143+
144+
::: tip 提示
145+
146+
注意高级加密参数在解密时无需传递,除非需要指定 TOTP BaseKey 和 TOTP Epoch。
147+
148+
:::
149+
150+
`Enable` 是布尔值,默认为 `false`。如果传入 `true`,则将启用高级加密,解密时可以忽略这个参数。
151+
152+
`UseStrongIV` 是布尔值,默认为 `true`,如果传入 `true`,则高级加密时将使用完整 16 字节 IV。解密时可以忽略这个参数。
153+
154+
`UseHMAC` 是布尔值,默认为 `false`。如果传入 `true`,则高级加密时将使用 HMAC 对消息签名。解密时可以忽略这个参数。
155+
156+
`UsePBKDF2` 是布尔值,默认为 `false`。如果传入 `true`,则高级加密时将对密钥加盐并使用密钥衍生函数。解密时可以忽略这个参数。
157+
158+
`UseTOTP` 是布尔值,默认为 `false`。如果传入 `true`,则高级加密时将使用 TOTP 作为密钥衍生的盐值,若 `UsePBKDF2` 传入 `false`,则不生效。解密时可以忽略这个参数。
159+
160+
`TOTPTimeStep` 是整数值,默认为`4`,最小值`0`,最大值`15`,超过范围的输入将会报错。用于指定 TOTP 每步时长,每个值代表的时间见上方注释。解密时可以忽略这个参数。
161+
162+
`TOTPEpoch` 是整数值,默认为系统当前 Unix 时间戳,用于指定 TOTP 加密的 Unix 时间戳记,以毫秒为单位(JS 标准)。解密时可以携带这个参数,以指定用于解密的时间戳。
163+
164+
`TOTPBaseKey` 是字符串,默认为加密主密钥,用于指定 TOTP 加密的预共享密钥。解密时可以携带这个参数,以指定用于解密的 TOTP Basekey。
165+
166+
---
167+
110168
```javascript
111169
//正确调用方式:
112170

113171
import { Abracadabra } from "abracadabra-cn";
114172
let Abra = new Abracadabra(); //不附带参数,
115173

116-
Abra.WenyanInput(TestTemp, "ENCRYPT", "ABRACADABRA", {
117-
RandomIndex: 25,
118-
PianwenMode: true,
119-
}); //指定随机指数为25,并使用骈文模式,缺省项自动使用默认值
120-
121-
Abra.WenyanInput(TestTemp, "DECRYPT", "ABRACADABRA"); //解密不需要传入配置
174+
Abra.WenyanInput(
175+
TestTemp,
176+
"ENCRYPT",
177+
"ABRACADABRA",
178+
{
179+
RandomIndex: 25,
180+
PianwenMode: true,
181+
},
182+
{
183+
Enable: true,
184+
UseStrongIV: true,
185+
UseHMAC: true,
186+
UsePBKDF2: true,
187+
UseTOTP: true,
188+
}
189+
); //指定随机指数为25,并使用骈文模式,启用高级加密,缺省项自动使用默认值
190+
191+
Abra.WenyanInput(TestTemp, "DECRYPT", "ABRACADABRA"); //解密一般不需要传入配置
192+
193+
Abra.WenyanInput(TestTemp, "DECRYPT", "ABRACADABRA", null, {
194+
TOTPBaseKey: "Basekey",
195+
TOTPEpoch: 12345678,
196+
}); //可额外传入TOTP参数用于解密。
122197
```
123198

124199
在无错误的情况下, `WenyanInput()` 函数的返回值通常是 `0`

docs/document/quick-start.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
- **仿真,使用文言语法句式**
88
- 开源,所有源代码公开可查。
9-
- 安全,完全离线的 AES 加密
9+
- 安全,标配 AES,可选高级加密套件
1010
- 可靠,代码经过严格单元测试。
1111
- 便捷,易于本地部署和使用。
1212

docs/document/wasm-deploy.md

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,15 @@
1111
本模块的合法输入为一个 JSON 字符串,输入时请勿附带注释,遵循以下格式:
1212

1313
::: warning 兼容性提示
14+
1415
注意,V3.2 修改了接口标准,WASM 未对旧版本留有兼容,请参照新版接口来编写调用方式。
16+
17+
WASM 不是魔曰的主线开发任务,依赖库未经积极更新,如果遇到问题,请提 Issue。
18+
1519
:::
1620

1721
```json
22+
1823
{
1924
"method":"", // WENYAN | OLD
2025
"inputType":"", // TEXT | UINT8
@@ -23,14 +28,10 @@
2328
"mode":"", // ENCRYPT | DECRYPT | AUTO // AUTO 仅在 method 指定 OLD 时合法
2429
"key":"", // 加密密钥,一个字符串 //如果缺省,自动使用默认值
2530
"q":bool, // OLD模式下,决定是否添加标志位
26-
"WenyanConfig":{ //文言文生成配置,可以缺省,缺省自动使用默认值。
27-
"PunctuationMark": bool, // 指定是否为密文添加标点符号,默认 true/添加;
28-
"RandomIndex": number, // 仅WENYAN模式下需要:算法的随机程度,越大随机性越强,默认 50,最大100,超过100将会出错;
29-
"PianwenMode":bool, // 仅WENYAN模式下需要:尽可能使用对仗的骈文句式; 与逻辑句式冲突
30-
"LogicMode":bool, // 仅WENYAN模式下需要:尽可能使用逻辑句式; 与骈文句式冲突
31-
"Traditional":bool, // 仅WENYAN模式下需要:输出繁体中文。
32-
},
31+
"WenyanConfig":{...}, //文言文生成配置,详情见JavaScript接口定义。
32+
"AdvancedEncConfig":{...} //高级加密配置,详情见JavaScript接口定义。
3333
}
34+
3435
```
3536

3637
用 wasmtime CLI 调用,在不同的命令行里有不同的方式,大多数时候是输入字符串的字符集的区别,以及是否需要在字符串外面加单引号的区别。

docs/index.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ features:
2222
details: 魔曰的密文看起来像逼真的古文,用算法构造字面意义,使加密具有文学色彩。
2323
- icon: 🔐
2424
title: 固若金汤
25-
details: 魔曰重视数据安全,明文数据经过 AES-256 加密。所有代码完全在本地离线执行
25+
details: 魔曰重视数据安全,标配 AES 加密,可选高级加密套件,完全在本地离线执行
2626
- icon: 🌈
2727
title: 不拘一格
2828
details: 魔曰允许你调整加密参数,使用不同的模式,生成高度随机化,不同风格的密文。
@@ -76,7 +76,7 @@ Abracadabra(魔曰) 是开源,安全,高效的文本加密工具。
7676

7777
- **仿真,使用文言语法句式**
7878
- 开源,所有源代码公开可查。
79-
- 安全,完全离线的 AES 加密
79+
- 安全,标配 AES,可选高级加密套件
8080
- 可靠,代码经过严格单元测试。
8181
- 便捷,易于本地部署和使用。
8282

@@ -103,11 +103,12 @@ Abracadabra(魔曰) 是开源,安全,高效的文本加密工具。
103103
以下是本项目的依赖项:
104104

105105
- [**Unishox2**](https://github.com/siara-cc/Unishox2) 短字符串压缩实现 _©Siara-cc_, **Apache-2.0** License.
106-
- [**crypto-js**](https://github.com/brix/crypto-js) AES 加密实现 _©Jeff Mott/Evan Vosberg_, **MIT** License.
106+
- [**crypto-js**](https://github.com/brix/crypto-js) 加密算法实现 _©Jeff Mott/Evan Vosberg_, **MIT** License.
107107
- [**pako**](https://github.com/nodeca/pako) GZIP 压缩实现 _©Vitaly Puzrin/Andrei Tuputcyn_, **MIT** License.
108108
- [**js-base64**](https://github.com/dankogai/js-base64) Base64 编码工具实现 _©Dan Kogai_, **BSD-3-Clause** License.
109109
- [**mersenne-twister**](https://github.com/boo1ean/mersenne-twister) 梅森旋转算法实现 _©Makoto Matsumoto/Takuji Nishimura_, **BSD-3-Clause** License.
110110
- [**opencc-js**](https://github.com/nk2028/opencc-js) 简繁体转换实现 _©nk2028_, **MIT** License.
111+
- [**otplib**](https://github.com/yeojz/otplib) TOTP 实现 _©Gerald Yeo_, **MIT** License.
111112

112113
本项目许可证与所有依赖项的许可证兼容。
113114

0 commit comments

Comments
 (0)