From c4ec3ff5a8544665b1e4ca14c1e5dd32a12d08ae Mon Sep 17 00:00:00 2001 From: SheepChef Date: Thu, 27 Mar 2025 22:54:26 +0800 Subject: [PATCH 1/2] Update README --- README.md | 70 +++++++++++++++++++++++++++++++++---------------------- USAGE.md | 40 +++++++------------------------ 2 files changed, 50 insertions(+), 60 deletions(-) diff --git a/README.md b/README.md index ab7f80f..9317c34 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@

Abracadabra 魔曰

-

下一代文本防和谐工具

+

下一代文本加密工具

@@ -24,7 +24,7 @@
-[](https://abracadabra-demo.pages.dev/) +[](https://abra.halu.ca/) [](#浏览器插件) [](https://github.com/SheepChef/Abracadabra_demo) @@ -33,36 +33,30 @@
-**Abracadabra(魔曰)** 是一个安全高效的文本脱敏加密工具,对任意给定数据进行处理。 - -由此使数据不易被自动过滤识别,减低封删率,增加审核成本。 +**Abracadabra(魔曰)** 是一个安全高效的文本加密工具,对任意给定数据进行加密处理。 请查阅 [**部署指南**](DEPLOY.md) 快速开始使用本项目。 要深入了解本项目的设计思路,内部机制和最佳实践,请查阅 [**细节和使用指南**](https://github.com/SheepChef/Abracadabra/blob/main/USAGE.md) -更多延申内容,例如本算法与同类产品的比较,请查阅 [**博客文章**](https://shef.cc/2024/11/30/abracadabra/) - ## 特性 - **仿真,使用文言语法句式**。 -- 简短,密文简短方便传播。 +- 简短,密文简短方便复制。 - 随机,加密结果具有随机性。 -- 安心,密码表中已剔除敏感汉字。 +- 安心,密码表公开可查阅。 - 安全,AES256 + 三重转轮混淆。 - 双模式,同时支持仿真加密和传统加密。 -### **古文仿真:下一代防和谐解决方案** +### **古文仿真:下一代加密方案** -> 虽无灯花之看,亦旅以良开临韵,鹏欲至物航定,但霞梦诚返,鹂当信花泊放,却风森良进,以书现,若走花度岩,舒鸢临笑,兰镜善停。 +> 定雪以关雨,故选速文者,当事浩鹏之纯茶。作必与其雀,而航欲任以铃者,楼也。但欲极者遥,雪无文,无以致花。 > -> 此语有绚绸悠褔,慧涧聪岩,不夏也,鸳可言云探问,且铃涧远奏,茶想彰花称选,且书雪轻赴,此雪有谜鸳少梦,极天莹空,今现韵以泊良雨,以岩,当去瑞花,非韵买鸢所当良画,不可去也。 +> 莺在悦岩,遥城之近,游于璃。乐林曰,是故无极无畅,无纯无静,叶之所走、心之所停也。信俊灯,光善韵银,乃稍旅。秀兰能长雨之怡,行光中之迷,鹤定而瑞裳事也。文欲取庭弹度,却琴心益求,非叶也。 生成高仿真文言文,**参考康熙二十三年《古文观止》真实语料**。 -与传统方案一致的高强度加密,更复杂的组句/语法选择机制,更先进的消息隐写。 - -将链接和短文本隐写在似是而非的文言文中,**_骗过所有传统检测,_**[**_甚至大语言模型_**](https://github.com/SheepChef/Abracadabra/issues/64)(结果因模型而异)。 +与传统方案一致的高强度加密,更复杂的组句/语法选择机制,中西合璧的设计。 密文高度随机,支持用户自行选择密文的随机性。 @@ -110,9 +104,9 @@ echo '{"method":"NEXT","mode":"ENCRYPT","inputType":"TEXT","outputType":"TEXT"," 如果你想自行快速部署这个静态页,可以在Release中下载快速部署文件包。若要自行编译或修改,请前往前端源代码仓库。 -浏览器插件的源码同样在前端源代码仓库,位于crx分支。 +浏览器插件和油猴脚本的源码同样在前端源代码仓库,分别位于 crx 和 userscript 分支。 -[](https://abracadabra-demo.pages.dev/) +[](https://abra.halu.ca/) [](https://github.com/SheepChef/Abracadabra_demo) ### 浏览器插件 @@ -129,6 +123,20 @@ echo '{"method":"NEXT","mode":"ENCRYPT","inputType":"TEXT","outputType":"TEXT"," > **提示:Edge 插件商店的上架审核速度十分缓慢,因此更新速度也更慢。不推荐从Edge商店下载本插件。** +### 油猴脚本 + +油猴脚本基于本项目的 JavaScript 实现,已上传到 **Greasy Fork** 网站。 + +![image](https://github.com/user-attachments/assets/1f8420f2-0c67-43d0-a280-1215d38e47a5) + +油猴脚本在部分网站页面中提供一个小型悬浮窗,助你快速调用本项目的核心功能。 + +点击加密/解密,将自动复制结果到剪切板。 + +[](https://greasyfork.org/zh-CN/scripts/529514-abracadabra-%E9%AD%94%E6%9B%B0) + +>目前支持:百度贴吧、Bilibili + ## 注意 Abracadabra 还在积极开发中,这里是一些注意事项。 @@ -159,7 +167,7 @@ Abracadabra 还在积极开发中,这里是一些注意事项。 Abracadabra 以最常用的 3000 个汉字为密本,对大小写拉丁字母,阿拉伯数字和部分符号进行映射。 -密表为纯人工编纂,剔除了可能随机组成敏感词的汉字,不含任何贬义字。 +密表为纯人工编纂,没有让人眼花缭乱的生僻字。 映射表公开可查,查阅 [**映射表(传统)**](https://github.com/SheepChef/Abracadabra/blob/main/src/javascript/mapping.json) 或者 [**映射表(仿真)**](https://github.com/SheepChef/Abracadabra/blob/main/src/javascript/mapping_next.json) 以了解密本的全貌。 @@ -185,7 +193,7 @@ AES 加密密钥和转轮密钥是同一个,均采用哈希值。 在映射为汉字的时候,每个字母/数字/符号均有多种可能性,完全随机选择。 -这进一步降低了密文的规律性,让关键词分词识别难以奏效。 +这显著增强了密文的安全性,使得各种攻击难以奏效。 ## 功能比较 @@ -223,7 +231,7 @@ AES 加密密钥和转轮密钥是同一个,均采用哈希值。 ❌ -仿真伪装 +仿真 ✅ ❌ ❌ @@ -255,14 +263,6 @@ AES 加密密钥和转轮密钥是同一个,均采用哈希值。 🟡 -抗识别 -✅ -❌ -❌ -❌ -✅ - - 自判断 ✅ ❌ @@ -288,6 +288,20 @@ AES 加密密钥和转轮密钥是同一个,均采用哈希值。 +``` +明文:Abracadabra + +魔曰(仿真):铃有将报,局有竟然。故探盈声者,当度青莺之静云。非木也,琴与树换,振棋以至雁。 +魔曰(传统):困句夏之全玚凪斋或骏琅咨兆咩谜理金说宙银歌舒 + +熊曰:呋食性類啽家現出爾常肉嘿達嗷很 +佛曰:諸南隸僧南降南吽諸陀南摩隸南僧南缽南薩咤南心彌嚴迦聞婆吽願南眾南色南兜南眾南如婆如南 +社会主义:自由民主公正文明法治文明公正民主公正和谐公正民主公正自由公正民主公正文明法治文明公正民主 +兽音:~呜嗷嗷嗷嗷呜呜啊呜嗷呜嗷呜呜~嗷啊呜啊嗷啊呜嗷呜~呜~嗷~呜呜嗷嗷嗷嗷嗷嗷呜啊嗷呜啊呜嗷呜呜~嗷啊嗷啊嗷啊呜嗷嗷~~~嗷~呜呜嗷嗷嗷嗷嗷嗷呜啊嗷呜呜呜嗷呜呜~呜啊呜啊嗷啊呜嗷嗷~嗷啊 +火星文:(不支持英文) + +``` + ## 鸣谢 感谢 [**Unishox2**](https://github.com/siara-cc/Unishox2) 提供高效的短文本压缩方案。 diff --git a/USAGE.md b/USAGE.md index ad1f34e..1b7466b 100644 --- a/USAGE.md +++ b/USAGE.md @@ -1,32 +1,18 @@ # 魔曰 细节和使用指南 -[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) +![License](https://img.shields.io/github/license/SheepChef/Abracadabra?color=yellow) **Abracadabra(魔曰)** 是一个用于加密短文本/链接的工具。 -其主要目的是为了防范各种平台上的关键词审查,以及基于语义的人工智能审查。 - ## 密本安全 -魔曰的密本不同于任何同类型的工具,它由数百个《通用规范汉字表》中的一级字和二级字构成,也有一些非常常见的 **日本和制汉字(Kanji)**,比如 **桜(Sakura)**;但没有任何可能造成关键词屏蔽的汉字,也不存在笔画超过二十二画的生僻字。 - -为了增加审查难度,本工具的密表中主要涵盖自然鸟名(鸢/鹤/莺/鸳/鸯/鹂/雀),自然植物名(兰/竹),自然事物(灯/花/火/铃/琴/月...) - -**您可能要问:它是如何增加审核难度的?** - -本工具的核心目标在于 **增加审核的成本到不可接受的程度**,由于使用的所有汉字都是汉语中的常用字,机械屏蔽它们中的任何一个或几个都会导致日常/专业交流中灾难性的词汇缺失,以至于不得不被叫停。密本也不存在组成敏感关键词的可能,关键词识别将不会奏效。 - -基于人工智能的识别也显然完全无法理解这些字符的含义,因为它们仅包含随机汉字,无法组成任何意义连贯的文字。 - -我(开发者)使用 ChatGPT 和文心一言做过测试,测试显然成功,即使是资源开销很大的大语言模型也对这类密文无从下手,仅能给出十分模糊的判断意见。 - -比起任何一种密文单一且全是生僻字的类似工具,魔曰加密做到了优秀水准。 +魔曰的密本不同于任何同类型的工具,它由数百个《通用规范汉字表》中的一级字和二级字构成,也有一些非常常见的 **日本和制汉字(Kanji)**,比如 **桜(Sakura)**;没有任何让人眼花缭乱的诡异汉字。 ## 随机性 相同原文,相同密钥的情况下,本程序的加密结果随机性很高,不同于其他类似工具的单一密文。 -随机性可以显著增强本工具的抗审查性能,使得针对密文的模式审查难以奏效。 +随机性可以显著增强本工具的安全性,抵抗各种攻击, 在明文和密钥都一样的情况下,每次加密出来的密文可以说是**完全不同**。 @@ -72,13 +58,11 @@ AES-256 是业内公认的安全加密算法,久经考验。 标志位用来简化加解密操作流程,程序识别到加密标志位便会自动解密,无需用户手动指定解密,提高便利性。 -但标志位会引入少许密文特征,虽然被针对性识别的可能性很低,但本项目仍然增加了加密时不添加标志位的选项,提供更好的抗审查能力。如果未来发生任何标志位的针对性检查,会酌情考虑移除它。 - 没有标志位的密文,在自动模式下将默认被再次加密,你需要手动指定强制解密。 ## 文言仿真器 -文言仿真,本质上是一种隐写。 +文言仿真,本质上是一种数据特征处理手段。 仿真密文“载荷子”采用单字。载荷子和提前编写好的句式模板构成一个语块,每个句式都有一个固定载荷容量。 @@ -118,7 +102,7 @@ Demo 页使用 Vue 构建,你可以随时下载源码,在你喜欢的地方 如果你需要最高的安全性,则在加密时设置一个尽可能长和复杂的密码。 -最好勾选“去除标志”,来让密文不存在任何可以被识别的特征。 +最好勾选“去除标志”,来提升密文随机性。 解密时将需要对方勾选强制解密。 @@ -128,12 +112,6 @@ Demo 页使用 Vue 构建,你可以随时下载源码,在你喜欢的地方 把密文的识别交给标志位,这么做可以让他人很方便地解密。 -### 混杂 - -你可以把密文夹杂在一个常规的文本中来增加隐蔽性。 - -但是注意不要在密文中增加或删除任何字(这会影响转轮解密步骤,导致密文损坏)。 - ## 最佳操作实践(仿真加密) 下面列出一些情况下的最佳实践。 @@ -141,13 +119,11 @@ Demo 页使用 Vue 构建,你可以随时下载源码,在你喜欢的地方 ### 仿真随机性 用户在菜单中可以通过滑条来选择句式的随机程度。 -如果想要降低AI“判定出密文”的概率,那么请调整至"长句优先",挑选句式的时候会优先使用最长的可用句。 -句子越长,逻辑性也越强,但加密随机性可能受影响。 +如果想增强句子逻辑性,那么请调整至"长句优先",挑选句式的时候会优先使用最长的可用句,但加密随机性可能受影响。 如果想要更随机,语块长短不一的密文,则推荐选择“适中”或更高。 -### 语义通顺 +### 通顺 如果嫌生成的句子过于生硬,不妨多次尝试生成(多点几下加密),选择一个看起来最好的密文。 -只要密钥和原文相同,生成出的所有密文均可以正常解密。 - +只要密钥和原文相同,生成出的所有密文均可以正常解密。 \ No newline at end of file From f17a967d6ab75d4ce339bbcf071a7455d4200db3 Mon Sep 17 00:00:00 2001 From: SheepChef Date: Mon, 31 Mar 2025 21:45:46 +0800 Subject: [PATCH 2/2] Update V3.0.11 --- JavyInputAppendix.js | 110 +++---- package-lock.json | 4 +- package.json | 2 +- src/javascript/main.js | 42 ++- src/javascript/mapping_next.json | 57 ++-- src/javascript/utils.js | 20 +- src/javascript/utils_next.js | 475 ++++++++++++++++++------------- vite.config.js | 31 +- 8 files changed, 416 insertions(+), 325 deletions(-) diff --git a/JavyInputAppendix.js b/JavyInputAppendix.js index 7ebd094..d59de3c 100644 --- a/JavyInputAppendix.js +++ b/JavyInputAppendix.js @@ -20,19 +20,19 @@ */ function base64ToUint8Array(base64) { - // 将Base64字符串转换为二进制字符串 - const binaryString = _atob(base64); - // 将二进制字符串转换为Uint8Array - const len = binaryString.length; - const bytes = new Uint8Array(len); - for (let i = 0; i < len; i++) { - bytes[i] = binaryString.charCodeAt(i); - } - return bytes; + // 将Base64字符串转换为二进制字符串 + const binaryString = _atob(base64); + // 将二进制字符串转换为Uint8Array + const len = binaryString.length; + const bytes = new Uint8Array(len); + for (let i = 0; i < len; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + return bytes; } function uint8ArrayToBase64(uint8Array) { - return _btoa(String.fromCharCode.apply(null, uint8Array)); + return _btoa(String.fromCharCode.apply(null, uint8Array)); } // Read input from stdin @@ -44,53 +44,53 @@ JavywriteOutput(Javyresult); // The main function. function index(input) { - if(input === "ERROR"){ + if (input === "ERROR") { return "INCORRECT JSON"; } - if(input.method == "NEXT"){ - if(input.inputType == "TEXT"){ - let Abra = new Abracadabra(input.inputType,input.outputType); - Abra.Input_Next(input.input,input.mode,input.key,input.q,input.r); - let Output = Abra.Output(); - if(input.outputType == "UINT8"){ - Output = uint8ArrayToBase64(Output); - } - return Output; - }else if(input.inputType == "UINT8"){ - let Abra = new Abracadabra(input.inputType,input.outputType); - let UINT8In = base64ToUint8Array(input.input); - Abra.Input_Next(UINT8In,input.mode,input.key,input.q,input.r); - let Output = Abra.Output(); - if(input.outputType == "UINT8"){ - Output = uint8ArrayToBase64(Output); - } - return Output; - }else{ - return "ERROR inputType"; + if (input.method == "NEXT") { + if (input.inputType == "TEXT") { + let Abra = new Abracadabra(input.inputType, input.outputType); + Abra.Input_Next(input.input, input.mode, input.key, input.q, input.r); + let Output = Abra.Output(); + if (input.outputType == "UINT8") { + Output = uint8ArrayToBase64(Output); + } + return Output; + } else if (input.inputType == "UINT8") { + let Abra = new Abracadabra(input.inputType, input.outputType); + let UINT8In = base64ToUint8Array(input.input); + Abra.Input_Next(UINT8In, input.mode, input.key, input.q, input.r); + let Output = Abra.Output(); + if (input.outputType == "UINT8") { + Output = uint8ArrayToBase64(Output); + } + return Output; + } else { + return "ERROR inputType"; } - }else if(input.method == "OLD"){ - if(input.inputType == "TEXT"){ - let Abra = new Abracadabra(input.inputType,input.outputType); - Abra.Input(input.input,input.mode,input.key,input.q); - let Output = Abra.Output(); - if(input.outputType == "UINT8"){ - Output = uint8ArrayToBase64(Output); - } - return Output; - }else if(input.inputType == "UINT8"){ - let Abra = new Abracadabra(input.inputType,input.outputType); - let UINT8In = base64ToUint8Array(input.input); - Abra.Input(UINT8In,input.mode,input.key,input.q); - let Output = Abra.Output(); - if(input.outputType == "UINT8"){ - Output = uint8ArrayToBase64(Output); - } - return Output; - }else{ - return "ERROR inputType"; + } else if (input.method == "OLD") { + if (input.inputType == "TEXT") { + let Abra = new Abracadabra(input.inputType, input.outputType); + Abra.Input(input.input, input.mode, input.key, input.q); + let Output = Abra.Output(); + if (input.outputType == "UINT8") { + Output = uint8ArrayToBase64(Output); + } + return Output; + } else if (input.inputType == "UINT8") { + let Abra = new Abracadabra(input.inputType, input.outputType); + let UINT8In = base64ToUint8Array(input.input); + Abra.Input(UINT8In, input.mode, input.key, input.q); + let Output = Abra.Output(); + if (input.outputType == "UINT8") { + Output = uint8ArrayToBase64(Output); + } + return Output; + } else { + return "ERROR inputType"; } - }else{ + } else { return "ERROR method"; } } @@ -122,12 +122,12 @@ function JavyreadInput() { context.bufferOffset += chunk.length; return context; }, - { bufferOffset: 0, finalBuffer: new Uint8Array(totalBytes) }, + { bufferOffset: 0, finalBuffer: new Uint8Array(totalBytes) } ); const InputDecoded = new TextDecoder().decode(finalBuffer); try { - return JSON.parse(InputDecoded);; + return JSON.parse(InputDecoded); } catch { return "ERROR"; } @@ -140,4 +140,4 @@ function JavywriteOutput(output) { // Stdout file descriptor const fd = 1; Javy.IO.writeSync(fd, buffer); -} \ No newline at end of file +} diff --git a/package-lock.json b/package-lock.json index 09eba1a..aef6c8d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "abracadabra-cn", - "version": "3.0.9", + "version": "3.0.11", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "abracadabra-cn", - "version": "3.0.9", + "version": "3.0.11", "dependencies": { "crypto-js": "^4.2.0", "js-base64": "^3.7.7", diff --git a/package.json b/package.json index 285bc2d..d9685d5 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "abracadabra-cn", "description": "Use Chinese to Encode Everything", "private": false, - "version": "3.0.10", + "version": "3.0.11", "main": "./dist/abracadabra-cn.js", "type": "module", "scripts": { diff --git a/src/javascript/main.js b/src/javascript/main.js index aa8bf16..2bb26ef 100644 --- a/src/javascript/main.js +++ b/src/javascript/main.js @@ -172,7 +172,7 @@ export class Abracadabra { } } } - /** + /** * 输入数据以处理,请注意指定的类型 * * **模式定义** @@ -188,38 +188,36 @@ export class Abracadabra { * @param{bool}q 指定是否为密文添加标点符号,默认 true/添加; * @param{int}r 密文算法的随机程度,越大随机性越强,默认 50,最大100,超过100将会出错; */ - Input_Next(input, mode, key = "ABRACADABRA", q = true , r = 50) { + Input_Next(input, mode, key = "ABRACADABRA", q = true, r = 50) { if (this.#input == Abracadabra.UINT8) { //如果指定输入类型是UINT8 if (Object.prototype.toString.call(input) != "[object Uint8Array]") { throw "Unexpected Input Type"; } - if(mode == Abracadabra.ENCRYPT){ - let Nextinput = new Object(); - Nextinput.output = input; - this.#res = Util_Next.enMap(Nextinput, key, q, r); - }else if(mode == Abracadabra.DECRYPT){ - let Nextinput = new Object(); - Nextinput.output = input; - this.#res = Util_Next.deMap(Nextinput, key); - } - return 0; - + if (mode == Abracadabra.ENCRYPT) { + let Nextinput = new Object(); + Nextinput.output = input; + this.#res = Util_Next.enMap(Nextinput, key, q, r); + } else if (mode == Abracadabra.DECRYPT) { + let Nextinput = new Object(); + Nextinput.output = input; + this.#res = Util_Next.deMap(Nextinput, key); + } + return 0; } else if (this.#input == Abracadabra.TEXT) { //如果指定输入类型是TEXT if (Object.prototype.toString.call(input) != "[object String]") { throw "Unexpected Input Type"; } - let Nextinput = new Object(); - Nextinput.output = Util.stringToUint8Array(input); - if(mode == Abracadabra.ENCRYPT){ - this.#res = Util_Next.enMap(Nextinput, key, q, r); - }else if(mode == Abracadabra.DECRYPT){ - this.#res = Util_Next.deMap(Nextinput, key); - } - return 0; + let Nextinput = new Object(); + Nextinput.output = Util.stringToUint8Array(input); + if (mode == Abracadabra.ENCRYPT) { + this.#res = Util_Next.enMap(Nextinput, key, q, r); + } else if (mode == Abracadabra.DECRYPT) { + this.#res = Util_Next.deMap(Nextinput, key); + } + return 0; } return 0; } - } diff --git a/src/javascript/mapping_next.json b/src/javascript/mapping_next.json index 278eb51..71b752a 100644 --- a/src/javascript/mapping_next.json +++ b/src/javascript/mapping_next.json @@ -146,7 +146,7 @@ "=": "言" } }, - "MV": ["欲", "应", "可", "能", "将", "请", "想","必", "当"], + "MV": ["欲", "应", "可", "能", "将", "请", "想", "必", "当"], "A": { "alphabet": { "a": "莹", @@ -296,30 +296,30 @@ "zhe": ["者"], "ye": ["也"], "for": ["为"], - "ba":["把"], - "le":["了"], - "er":["而"], - "this":["此","斯"], - "still":["仍"], - "with":["与","同"], - "also":["亦","也"], - "is":["是","乃"], - "not":["未","莫"], - "or":["或"], - "more":["更"], - "make":["使","将","让"], + "ba": ["把"], + "le": ["了"], + "er": ["而"], + "this": ["此", "斯"], + "still": ["仍"], + "with": ["与", "同"], + "also": ["亦", "也"], + "is": ["是", "乃"], + "not": ["未", "莫"], + "or": ["或"], + "more": ["更"], + "make": ["使", "将", "让"], "and": ["与", "同"], "anti": ["非", "不"], - "why": ["为何", "奈何","何哉"], + "why": ["为何", "奈何", "何哉"], "but": ["但", "却", "则", "而", "况", "且"], "like": ["似", "如", "若"], - "if":["若","倘"], + "if": ["若", "倘"], "int": ["哉", "呼", "噫"], - "self":["自"], - "by":["以","于"] + "self": ["自"], + "by": ["以", "于"] }, - "Sentences":{ - "Begin":[ + "Sentences": { + "Begin": [ "1/非/N/ye", "1/N/曰", "1/若夫/N", @@ -353,6 +353,7 @@ "5/今/N/乃/A/N/A/N", "5/A/N/V/A/N", "5/夫/N/、/N/不/MV/AD/V/N", + "5/不/有/A/N/,/何/V/A/N/Q", "6/以/N/V/,/like/V/N/V/N", "6/A/N/zhi/N/,/V/zhi/以/V/其/N", "6/A/N/V/于/N/而/V/N", @@ -384,7 +385,7 @@ "9/此/N/有/A/N/A/N/,/A/N/A/N/P", "9/是/N/ye/,/N/A/N/A/,/N/A/N/A/P" ], - "Main":[ + "Main": [ "1/非/N/ye", "1/anti/MV/V/ye", "2/N/make/N/zhi", @@ -401,12 +402,14 @@ "4/N/有/MV/V/,/N/有/AD/然/P", "4/N/非/V/而/V/之/者/,/孰/MV/无/N/P", "4/A/N/常有/,/而/A/N/不常有/P", + "4/不/以/N/V/,/不/以/N/V/P", "5/今/V/N/以/V/A/N", "5/N/乃/V/V/N/zhi/N", "5/本/MV/V/A/,/anti/V/N/N", "5/今/N/乃/A/N/A/N", "5/每/有/V/N/,/便/AD/然/V/N/P", "5/N/V/而/A/N/V/也", + "5/不/有/A/N/,/何/V/A/N/Q", "6/以/N/V/,/like/V/N/V/N", "6/N/V/,/V/N/V/N", "6/虽/V/V/A/A/,/A/A/不/同/P", @@ -416,6 +419,7 @@ "6/V/A/N/,/V/A/N", "6/V/MV/with/其/N/,/而/V/MV/V/以/N/者/,/N/也/P", "6/A/N/必/有/A/N/V/之者/、/予/可/无/N/也/P", + "6/将/有/V/,/则/V/A/N/以/V/N/P", "7/N/V/以/N/V/,/V/不/V/N", "7/N/N/V/N/,/A/于/N/N", "7/MV/AD/V/A/N/,/but/V/V/不/A", @@ -425,6 +429,7 @@ "7/A/N/之/N/不在/N/,/在乎/A/N/之/N/也/P", "7/A/N/之/N/,/V/之/N/而/V/之/N/也/P", "7/是故/A/N/不必不如/N/,/N/不必/A/于/A/N/P", + "7/有/A/N/、/A/N/、/A/N/之/N/P", "8/N/anti/MV/V/N/,/still/继/N/V/,/why/,/and/N/而/anti/V/N/ye/P", "8/是/故/无/A/无/A/,/无/A/无/A/,/N/之/所/V/、/N/之/所/V/ye/P", "8/V/N/A/A/,/V/N/A/A", @@ -437,15 +442,15 @@ "8/N/V/于/A/N/,/而/N/V/于/A/N", "8/A/N/MV/A/N/之/A/,/V/N/中/之/A", "8/N/V/于/A/N/之上/,/AD/V/于/A/N/之间/P", + "8/使/其/A/N/AD/V/,/A/N/AD/V/P", "9/N/MV/V/N/V/V/,/but/N/N/AD/V", "9/A/N/V/zhi/而不/V/zhi/、亦/make/A/N/er/复/V/A/N/ye/P", "9/以/N/,/当/V/A/N/,/非/N/V/N/所/MV/AD/V/P", "9/此/N/有/A/N/A/N/,/A/N/A/N/P", "9/是/N/ye/,/N/A/N/A/,/N/A/N/A", "9/V/A/N/,/N/A/N/A/,/乃/AD/V" - ], - "End":[ + "End": [ "1/非/N/ye", "1/anti/MV/V/ye", "2/唯/N/V/zhi", @@ -464,12 +469,14 @@ "4/V/N/以/V/N", "4/N/无/N/,/无以/V/N", "4/噫/,/A/N/ye/,/N/谁/与/V/Q", + "4/不/以/N/V/,/不/以/N/V/P", "5/请/V/N/zhi/N/中/,/是/N/zhi/N/P", "5/今/V/N/以/V/A/N", "5/N/乃/V/V/N/zhi/N", "5/本/MV/V/A/,/anti/V/N/N", "5/今/N/乃/A/N/A/N", "5/N/V/而/A/N/V/也", + "5/不/有/A/N/,/何/V/A/N/Q", "6/以/N/V/,/like/V/N/V/N", "6/A/zhi/V/N/,/亦/like/今/zhi/V/N/,/A/夫/P", "6/N/V/,/V/N/V/N", @@ -477,6 +484,7 @@ "6/V/MV/with/其/N/,/而/V/MV/V/以/N/者/,/N/也/P", "6/A/N/必/有/A/N/V/之者/、/予/可/无/N/也/P", "6/虽/V/V/A/A/,/A/A/不/同/P", + "6/将/有/V/,/则/V/A/N/以/V/N/P", "7/N/V/以/N/V/,/V/不/V/N", "7/N/N/V/N/,/A/于/N/N", "7/MV/AD/V/A/N/,/but/V/V/不/A", @@ -484,6 +492,7 @@ "7/A/N/之/N/不在/N/,/在乎/A/N/之/N/也/P", "7/A/N/之/N/,/V/之/N/而/V/之/N/也/P", "7/是故/A/N/不必不如/N/,/N/不必/A/于/A/N/P", + "7/有/A/N/、/A/N/、/A/N/之/N/P", "8/虽/N/A/N/A/,/所/以/V/N/,其/N/A/ye/P", "8/何必/V/N/V/N/,/V/N/zhi/N/N/哉/P", "8/N/anti/MV/V/N/,/still/继/N/V/,/why/,/and/N/而/anti/V/N/ye/P", @@ -493,6 +502,7 @@ "8/虽/无/N/N/zhi/V/,/亦/V/以/AD/V/A/N/P", "8/故/V/A/N/者/,/当/V/A/N/之/A/N/P", "8/N/V/于/A/N/之上/,/AD/V/于/A/N/之间/P", + "8/使/其/A/N/AD/V/,/A/N/AD/V/P", "9/A/N/V/zhi/而不/V/zhi/、亦/make/A/N/er/复/V/A/N/ye/P", "9/N/MV/V/N/V/V/,/but/N/N/AD/V", "9/以/N/,/当/V/A/N/,/非/N/V/N/所/MV/AD/V/P", @@ -514,6 +524,5 @@ //Q 问号 //依需要添加在句式末尾,代替原有逗号。 - // by... -> 虚词 -// 其他->不做修改/替换 \ No newline at end of file +// 其他->不做修改/替换 diff --git a/src/javascript/utils.js b/src/javascript/utils.js index f6bfd4c..ec0b445 100644 --- a/src/javascript/utils.js +++ b/src/javascript/utils.js @@ -542,22 +542,22 @@ function CheckLuhnBit(Data) { } } -function RemovePadding(Base64String){ +function RemovePadding(Base64String) { let PaddingCount = 0; - for(let i = Base64String.length - 1; i >= Base64String.length - 4 ;i--){ - if(Base64String[i] == "="){ - PaddingCount ++; + for (let i = Base64String.length - 1; i >= Base64String.length - 4; i--) { + if (Base64String[i] == "=") { + PaddingCount++; } } - return Base64String.slice(0,Base64String.length - PaddingCount); + return Base64String.slice(0, Base64String.length - PaddingCount); } -function AddPadding(Base64String){ - if(Base64String.length % 4 == 3 ){ +function AddPadding(Base64String) { + if (Base64String.length % 4 == 3) { return Base64String + "="; - }else if(Base64String.length % 4 == 2 ){ + } else if (Base64String.length % 4 == 2) { return Base64String + "=="; - }else{ + } else { return Base64String; } } @@ -586,7 +586,7 @@ function setCharOnIndex(string, index, char) { } function GetRandomIndex(length) { - let MT = new MersenneTwister(Math.floor(Math.random() * 1000000000)) + let MT = new MersenneTwister(Math.floor(Math.random() * 1000000000)); let Rand = Math.floor(MT.random() * length); return Rand; diff --git a/src/javascript/utils_next.js b/src/javascript/utils_next.js index ea9caeb..2443455 100644 --- a/src/javascript/utils_next.js +++ b/src/javascript/utils_next.js @@ -33,7 +33,8 @@ import * as Unishox from "./unishox2.js"; import "pako"; import MersenneTwister from "mersenne-twister"; -const Map = '{\"Actual\":{\"N\":{\"alphabet\":{\"a\":\"人\",\"b\":\"镜\",\"c\":\"鹏\",\"d\":\"曲\",\"e\":\"霞\",\"f\":\"绸\",\"g\":\"裳\",\"h\":\"路\",\"i\":\"岩\",\"j\":\"叶\",\"k\":\"鲤\",\"l\":\"月\",\"m\":\"雪\",\"n\":\"冰\",\"o\":\"局\",\"p\":\"恋\",\"q\":\"褔\",\"r\":\"铃\",\"s\":\"琴\",\"t\":\"家\",\"u\":\"天\",\"v\":\"韵\",\"w\":\"书\",\"x\":\"莺\",\"y\":\"璃\",\"z\":\"雨\",\"A\":\"文\",\"B\":\"涧\",\"C\":\"水\",\"D\":\"花\",\"E\":\"风\",\"F\":\"棋\",\"G\":\"楼\",\"H\":\"鹤\",\"I\":\"鸢\",\"J\":\"灯\",\"K\":\"雁\",\"L\":\"星\",\"M\":\"声\",\"N\":\"树\",\"O\":\"茶\",\"P\":\"竹\",\"Q\":\"兰\",\"R\":\"苗\",\"S\":\"心\",\"T\":\"语\",\"U\":\"礼\",\"V\":\"梦\",\"W\":\"庭\",\"X\":\"木\",\"Y\":\"驿\",\"Z\":\"火\"},\"numbersymbol\":{\"0\":\"森\",\"1\":\"夏\",\"2\":\"光\",\"3\":\"林\",\"4\":\"物\",\"5\":\"云\",\"6\":\"夜\",\"7\":\"城\",\"8\":\"春\",\"9\":\"空\",\"+\":\"雀\",\"/\":\"鹂\",\"=\":\"鸳\"}},\"V\":{\"alphabet\":{\"a\":\"关\",\"b\":\"赴\",\"c\":\"呈\",\"d\":\"添\",\"e\":\"停\",\"f\":\"成\",\"g\":\"走\",\"h\":\"达\",\"i\":\"行\",\"j\":\"称\",\"k\":\"见\",\"l\":\"学\",\"m\":\"听\",\"n\":\"买\",\"o\":\"作\",\"p\":\"弹\",\"q\":\"写\",\"r\":\"定\",\"s\":\"谈\",\"t\":\"动\",\"u\":\"旅\",\"v\":\"返\",\"w\":\"度\",\"x\":\"开\",\"y\":\"筑\",\"z\":\"选\",\"A\":\"流\",\"B\":\"指\",\"C\":\"换\",\"D\":\"探\",\"E\":\"放\",\"F\":\"看\",\"G\":\"报\",\"H\":\"事\",\"I\":\"泊\",\"J\":\"现\",\"K\":\"迸\",\"L\":\"彰\",\"M\":\"需\",\"N\":\"飞\",\"O\":\"游\",\"P\":\"求\",\"Q\":\"御\",\"R\":\"航\",\"S\":\"歌\",\"T\":\"读\",\"U\":\"振\",\"V\":\"登\",\"W\":\"任\",\"X\":\"留\",\"Y\":\"奏\",\"Z\":\"连\"},\"numbersymbol\":{\"0\":\"知\",\"1\":\"至\",\"2\":\"致\",\"3\":\"去\",\"4\":\"画\",\"5\":\"说\",\"6\":\"进\",\"7\":\"信\",\"8\":\"取\",\"9\":\"问\",\"+\":\"笑\",\"/\":\"视\",\"=\":\"言\"}},\"MV\":[\"欲\",\"应\",\"可\",\"能\",\"将\",\"请\",\"想\",\"必\",\"当\"],\"A\":{\"alphabet\":{\"a\":\"莹\",\"b\":\"畅\",\"c\":\"新\",\"d\":\"高\",\"e\":\"静\",\"f\":\"美\",\"g\":\"绿\",\"h\":\"佳\",\"i\":\"善\",\"j\":\"良\",\"k\":\"瀚\",\"l\":\"明\",\"m\":\"早\",\"n\":\"宏\",\"o\":\"青\",\"p\":\"遥\",\"q\":\"速\",\"r\":\"慧\",\"s\":\"绚\",\"t\":\"绮\",\"u\":\"寒\",\"v\":\"冷\",\"w\":\"银\",\"x\":\"灵\",\"y\":\"绣\",\"z\":\"北\",\"A\":\"临\",\"B\":\"南\",\"C\":\"俊\",\"D\":\"捷\",\"E\":\"骏\",\"F\":\"益\",\"G\":\"雅\",\"H\":\"舒\",\"I\":\"智\",\"J\":\"谜\",\"K\":\"彩\",\"L\":\"余\",\"M\":\"短\",\"N\":\"秋\",\"O\":\"乐\",\"P\":\"怡\",\"Q\":\"瑞\",\"R\":\"惠\",\"S\":\"和\",\"T\":\"纯\",\"U\":\"悦\",\"V\":\"迷\",\"W\":\"长\",\"X\":\"少\",\"Y\":\"近\",\"Z\":\"清\"},\"numbersymbol\":{\"0\":\"远\",\"1\":\"极\",\"2\":\"安\",\"3\":\"聪\",\"4\":\"秀\",\"5\":\"旧\",\"6\":\"浩\",\"7\":\"盈\",\"8\":\"快\",\"9\":\"悠\",\"+\":\"后\",\"/\":\"轻\",\"=\":\"坚\"}},\"AD\":{\"alphabet\":{\"a\":\"诚\",\"b\":\"畅\",\"c\":\"新\",\"d\":\"高\",\"e\":\"静\",\"f\":\"恒\",\"g\":\"愈\",\"h\":\"谨\",\"i\":\"善\",\"j\":\"良\",\"k\":\"频\",\"l\":\"笃\",\"m\":\"早\",\"n\":\"湛\",\"o\":\"昭\",\"p\":\"遥\",\"q\":\"速\",\"r\":\"朗\",\"s\":\"祗\",\"t\":\"攸\",\"u\":\"徐\",\"v\":\"咸\",\"w\":\"皆\",\"x\":\"灵\",\"y\":\"恭\",\"z\":\"弥\",\"A\":\"临\",\"B\":\"允\",\"C\":\"公\",\"D\":\"捷\",\"E\":\"淳\",\"F\":\"益\",\"G\":\"雅\",\"H\":\"舒\",\"I\":\"嘉\",\"J\":\"勤\",\"K\":\"协\",\"L\":\"永\",\"M\":\"短\",\"N\":\"歆\",\"O\":\"乐\",\"P\":\"怡\",\"Q\":\"已\",\"R\":\"忻\",\"S\":\"和\",\"T\":\"谧\",\"U\":\"悦\",\"V\":\"稍\",\"W\":\"长\",\"X\":\"少\",\"Y\":\"近\",\"Z\":\"尚\"},\"numbersymbol\":{\"0\":\"远\",\"1\":\"极\",\"2\":\"安\",\"3\":\"竟\",\"4\":\"悉\",\"5\":\"渐\",\"6\":\"颇\",\"7\":\"辄\",\"8\":\"快\",\"9\":\"悠\",\"+\":\"后\",\"/\":\"轻\",\"=\":\"曾\"}}},\"Virtual\":{\"zhi\":[\"之\"],\"hu\":[\"乎\"],\"zhe\":[\"者\"],\"ye\":[\"也\"],\"for\":[\"为\"],\"ba\":[\"把\"],\"le\":[\"了\"],\"er\":[\"而\"],\"this\":[\"此\",\"斯\"],\"still\":[\"仍\"],\"with\":[\"与\",\"同\"],\"also\":[\"亦\",\"也\"],\"is\":[\"是\",\"乃\"],\"not\":[\"未\",\"莫\"],\"or\":[\"或\"],\"more\":[\"更\"],\"make\":[\"使\",\"将\",\"让\"],\"and\":[\"与\",\"同\"],\"anti\":[\"非\",\"不\"],\"why\":[\"为何\",\"奈何\",\"何哉\"],\"but\":[\"但\",\"却\",\"则\",\"而\",\"况\",\"且\"],\"like\":[\"似\",\"如\",\"若\"],\"if\":[\"若\",\"倘\"],\"int\":[\"哉\",\"呼\",\"噫\"],\"self\":[\"自\"],\"by\":[\"以\",\"于\"]},\"Sentences\":{\"Begin\":[\"1/非/N/ye\",\"1/N/曰\",\"1/若夫/N\",\"1/anti/MV/V/ye/P\",\"2/A/N/曰\",\"2/N/以/A\",\"2/N/anti/在/A\",\"2/N/make/N/zhi\",\"2/MV/N/zhe/A\",\"2/有/N/则/A\",\"2/V/zhe/V/zhi\",\"2/but/MV/A/zhe/A\",\"3/初,/N/V/by/N\",\"3/夫/N/anti/V/by/N\",\"3/AD/V/zhi/谓/A\",\"3/V/而/V/zhi/zhi/谓/A\",\"3/N/,/N/zhi/N/ye/P\",\"3/A/之/V/者/必/有/N/P\",\"4/非/N/不/A/,/V/不/A\",\"4/A/N/AD/V\",\"4/V/N/以/V/N\",\"4/N/不在/A/,/有/N/则/A/P\",\"4/A/N/常有/,/而/A/N/不常有/P\",\"4/N/有/MV/V/,/N/有/AD/然/P\",\"4/N/无/N/,/无以/V/N\",\"5/V/N/而/V/A/,/V/zhi/道/ye/P\",\"5/N/zhi/V/V/,/实为/A/A/P\",\"5/本/MV/V/A/,/anti/V/N/N\",\"5/今/V/N/以/V/A/N\",\"5/N/乃/V/V/N/zhi/N\",\"5/今/N/乃/A/N/A/N\",\"5/A/N/V/A/N\",\"5/夫/N/、/N/不/MV/AD/V/N\",\"6/以/N/V/,/like/V/N/V/N\",\"6/A/N/zhi/N/,/V/zhi/以/V/其/N\",\"6/A/N/V/于/N/而/V/N\",\"6/A/N/未/V/N/、/N/之/N\",\"7/N/以/A/A/,/AD/V/A/N\",\"7/V/N/A/,/A/N/V/N\",\"7/N/V/以/N/V/,/V/不/V/N\",\"7/N/N/V/N/,/A/于/N/N\",\"7/MV/AD/V/A/N/,/but/V/V/不/A\",\"7/或/V/N/V/N/,/V/N/于/N\",\"7/则有/N/A/N/A/,/N/N/具/V\",\"7/V/A/N/zhe/,/常/V/其/所/A/,/而/V/其/所/A/P\",\"7/A/N/之/N/不在/N/,/在乎/A/N/之/N/也/P\",\"8/V/A/N/,/V/A/N/,/by/MV/A/zhi/N/P\",\"8/N/anti/AD/V/zhe/by/AD/V/zhe/V/,/anti/MV/AD/V/P\",\"8/N/anti/MV/V/N/,/still/继/N/V/,/why/,/and/N/而/anti/V/N/ye/P\",\"8/V/N/A/A/,/V/N/A/A\",\"8/N/V/A/N/,/N/V/A/N\",\"8/N/在/A/N/,/A/N/zhi/A/,/V/于/N/P\",\"8/A/N/AD/V/,/N/N/AD/V\",\"8/A/N/V/N/,/N/N/V/N/P\",\"8/尝/V/A/N/,/AD/V/A/N/zhi/N\",\"8/予/V/夫/A/N/A/N/,/在/A/N/之/N\",\"8/N/V/于/A/N/,/而/N/V/于/A/N\",\"8/虽/无/N/N/zhi/V/,/亦/V/以/AD/V/A/N/P\",\"9/A/N/V/zhi/而不/V/zhi/、亦/make/A/N/er/复/V/A/N/ye/P\",\"9/N/MV/V/N/V/V/,/but/N/N/AD/V/P\",\"9/以/N/,/当/V/A/N/,/非/N/V/N/所/MV/AD/V/P\",\"9/此/N/有/A/N/A/N/,/A/N/A/N/P\",\"9/是/N/ye/,/N/A/N/A/,/N/A/N/A/P\"],\"Main\":[\"1/非/N/ye\",\"1/anti/MV/V/ye\",\"2/N/make/N/zhi\",\"2/MV/N/zhe/A\",\"2/有/N/则/A\",\"2/V/zhe/V/zhi\",\"2/but/MV/A/zhe/A\",\"3/N/with/N/V\",\"3/N/曰,何/A/zhi/V/Q\",\"4/A/N/AD/V\",\"4/V/N/以/V/N\",\"4/N/无/N/,/无以/V/N/P\",\"4/N/不在/A/,/有/N/则/A/P\",\"4/N/有/MV/V/,/N/有/AD/然/P\",\"4/N/非/V/而/V/之/者/,/孰/MV/无/N/P\",\"4/A/N/常有/,/而/A/N/不常有/P\",\"5/今/V/N/以/V/A/N\",\"5/N/乃/V/V/N/zhi/N\",\"5/本/MV/V/A/,/anti/V/N/N\",\"5/今/N/乃/A/N/A/N\",\"5/每/有/V/N/,/便/AD/然/V/N/P\",\"5/N/V/而/A/N/V/也\",\"6/以/N/V/,/like/V/N/V/N\",\"6/N/V/,/V/N/V/N\",\"6/虽/V/V/A/A/,/A/A/不/同/P\",\"6/而/A/N/zhi/N/,/V/zhi/以/V/其/N/P\",\"6/A/N/V/于/N/而/V/N\",\"6/A/N/未/V/N/、/N/之/N\",\"6/V/A/N/,/V/A/N\",\"6/V/MV/with/其/N/,/而/V/MV/V/以/N/者/,/N/也/P\",\"6/A/N/必/有/A/N/V/之者/、/予/可/无/N/也/P\",\"7/N/V/以/N/V/,/V/不/V/N\",\"7/N/N/V/N/,/A/于/N/N\",\"7/MV/AD/V/A/N/,/but/V/V/不/A\",\"7/或/V/N/V/N/,/V/N/于/N\",\"7/V/A/N/zhe/,/常/V/其/所/A/,/而/V/其/所/A/P\",\"7/A/N/之/不/V/也/AD/矣/,/欲/N/之/无/N/也/AD/矣/P\",\"7/A/N/之/N/不在/N/,/在乎/A/N/之/N/也/P\",\"7/A/N/之/N/,/V/之/N/而/V/之/N/也/P\",\"7/是故/A/N/不必不如/N/,/N/不必/A/于/A/N/P\",\"8/N/anti/MV/V/N/,/still/继/N/V/,/why/,/and/N/而/anti/V/N/ye/P\",\"8/是/故/无/A/无/A/,/无/A/无/A/,/N/之/所/V/、/N/之/所/V/ye/P\",\"8/V/N/A/A/,/V/N/A/A\",\"8/N/在/A/N/,/A/N/zhi/A/,/V/于/N/P\",\"8/A/N/AD/V/,/N/N/AD/V\",\"8/A/N/V/N/,/N/N/V/N/P\",\"8/虽/无/N/N/zhi/V/,/亦/V/以/AD/V/A/N/P\",\"8/予/V/夫/A/N/A/N/,/在/A/N/之/N\",\"8/故/V/A/N/者/,/当/V/A/N/之/A/N/P\",\"8/N/V/于/A/N/,/而/N/V/于/A/N\",\"8/A/N/MV/A/N/之/A/,/V/N/中/之/A\",\"8/N/V/于/A/N/之上/,/AD/V/于/A/N/之间/P\",\"9/N/MV/V/N/V/V/,/but/N/N/AD/V\",\"9/A/N/V/zhi/而不/V/zhi/、亦/make/A/N/er/复/V/A/N/ye/P\",\"9/以/N/,/当/V/A/N/,/非/N/V/N/所/MV/AD/V/P\",\"9/此/N/有/A/N/A/N/,/A/N/A/N/P\",\"9/是/N/ye/,/N/A/N/A/,/N/A/N/A\",\"9/V/A/N/,/N/A/N/A/,/乃/AD/V\"],\"End\":[\"1/非/N/ye\",\"1/anti/MV/V/ye\",\"2/唯/N/V/zhi\",\"2/V/by/N\",\"2/其/also/A/hu/其/V/ye/P\",\"2/N/make/N/zhi\",\"2/MV/N/zhe/A\",\"2/有/N/则/A\",\"2/V/zhe/V/zhi\",\"2/but/MV/A/zhe/A\",\"3/V/在/A/N\",\"3/今/zhi/V/zhe/,/亦将有/V/于/this/N/P\",\"3/某也/A/,/某也/A/,/可/不/A/哉\",\"4/V/N/zhi/N/by/N\",\"4/A/N/AD/V\",\"4/V/N/以/V/N\",\"4/N/无/N/,/无以/V/N\",\"4/噫/,/A/N/ye/,/N/谁/与/V/Q\",\"5/请/V/N/zhi/N/中/,/是/N/zhi/N/P\",\"5/今/V/N/以/V/A/N\",\"5/N/乃/V/V/N/zhi/N\",\"5/本/MV/V/A/,/anti/V/N/N\",\"5/今/N/乃/A/N/A/N\",\"5/N/V/而/A/N/V/也\",\"6/以/N/V/,/like/V/N/V/N\",\"6/A/zhi/V/N/,/亦/like/今/zhi/V/N/,/A/夫/P\",\"6/N/V/,/V/N/V/N\",\"6/V/N/之/N/,/为/N/V/者/,/可以/V/矣/P\",\"6/V/MV/with/其/N/,/而/V/MV/V/以/N/者/,/N/也/P\",\"6/A/N/必/有/A/N/V/之者/、/予/可/无/N/也/P\",\"6/虽/V/V/A/A/,/A/A/不/同/P\",\"7/N/V/以/N/V/,/V/不/V/N\",\"7/N/N/V/N/,/A/于/N/N\",\"7/MV/AD/V/A/N/,/but/V/V/不/A\",\"7/或/V/N/V/N/,/V/N/于/N\",\"7/A/N/之/N/不在/N/,/在乎/A/N/之/N/也/P\",\"7/A/N/之/N/,/V/之/N/而/V/之/N/也/P\",\"7/是故/A/N/不必不如/N/,/N/不必/A/于/A/N/P\",\"8/虽/N/A/N/A/,/所/以/V/N/,其/N/A/ye/P\",\"8/何必/V/N/V/N/,/V/N/zhi/N/N/哉/P\",\"8/N/anti/MV/V/N/,/still/继/N/V/,/why/,/and/N/而/anti/V/N/ye/P\",\"8/V/N/A/A/,/V/N/A/A\",\"8/N/在/A/N/,/A/N/zhi/A/,/V/于/N/P\",\"8/A/N/AD/V/,/N/N/AD/V\",\"8/虽/无/N/N/zhi/V/,/亦/V/以/AD/V/A/N/P\",\"8/故/V/A/N/者/,/当/V/A/N/之/A/N/P\",\"8/N/V/于/A/N/之上/,/AD/V/于/A/N/之间/P\",\"9/A/N/V/zhi/而不/V/zhi/、亦/make/A/N/er/复/V/A/N/ye/P\",\"9/N/MV/V/N/V/V/,/but/N/N/AD/V\",\"9/以/N/,/当/V/A/N/,/非/N/V/N/所/MV/AD/V/P\",\"9/此/N/有/A/N/A/N/,/A/N/A/N/P\",\"9/是/N/ye/,/N/A/N/A/,/N/A/N/A/P\"]}}'; +const Map = + '{"Actual":{"N":{"alphabet":{"a":"人","b":"镜","c":"鹏","d":"曲","e":"霞","f":"绸","g":"裳","h":"路","i":"岩","j":"叶","k":"鲤","l":"月","m":"雪","n":"冰","o":"局","p":"恋","q":"褔","r":"铃","s":"琴","t":"家","u":"天","v":"韵","w":"书","x":"莺","y":"璃","z":"雨","A":"文","B":"涧","C":"水","D":"花","E":"风","F":"棋","G":"楼","H":"鹤","I":"鸢","J":"灯","K":"雁","L":"星","M":"声","N":"树","O":"茶","P":"竹","Q":"兰","R":"苗","S":"心","T":"语","U":"礼","V":"梦","W":"庭","X":"木","Y":"驿","Z":"火"},"numbersymbol":{"0":"森","1":"夏","2":"光","3":"林","4":"物","5":"云","6":"夜","7":"城","8":"春","9":"空","+":"雀","/":"鹂","=":"鸳"}},"V":{"alphabet":{"a":"关","b":"赴","c":"呈","d":"添","e":"停","f":"成","g":"走","h":"达","i":"行","j":"称","k":"见","l":"学","m":"听","n":"买","o":"作","p":"弹","q":"写","r":"定","s":"谈","t":"动","u":"旅","v":"返","w":"度","x":"开","y":"筑","z":"选","A":"流","B":"指","C":"换","D":"探","E":"放","F":"看","G":"报","H":"事","I":"泊","J":"现","K":"迸","L":"彰","M":"需","N":"飞","O":"游","P":"求","Q":"御","R":"航","S":"歌","T":"读","U":"振","V":"登","W":"任","X":"留","Y":"奏","Z":"连"},"numbersymbol":{"0":"知","1":"至","2":"致","3":"去","4":"画","5":"说","6":"进","7":"信","8":"取","9":"问","+":"笑","/":"视","=":"言"}},"MV":["欲","应","可","能","将","请","想","必","当"],"A":{"alphabet":{"a":"莹","b":"畅","c":"新","d":"高","e":"静","f":"美","g":"绿","h":"佳","i":"善","j":"良","k":"瀚","l":"明","m":"早","n":"宏","o":"青","p":"遥","q":"速","r":"慧","s":"绚","t":"绮","u":"寒","v":"冷","w":"银","x":"灵","y":"绣","z":"北","A":"临","B":"南","C":"俊","D":"捷","E":"骏","F":"益","G":"雅","H":"舒","I":"智","J":"谜","K":"彩","L":"余","M":"短","N":"秋","O":"乐","P":"怡","Q":"瑞","R":"惠","S":"和","T":"纯","U":"悦","V":"迷","W":"长","X":"少","Y":"近","Z":"清"},"numbersymbol":{"0":"远","1":"极","2":"安","3":"聪","4":"秀","5":"旧","6":"浩","7":"盈","8":"快","9":"悠","+":"后","/":"轻","=":"坚"}},"AD":{"alphabet":{"a":"诚","b":"畅","c":"新","d":"高","e":"静","f":"恒","g":"愈","h":"谨","i":"善","j":"良","k":"频","l":"笃","m":"早","n":"湛","o":"昭","p":"遥","q":"速","r":"朗","s":"祗","t":"攸","u":"徐","v":"咸","w":"皆","x":"灵","y":"恭","z":"弥","A":"临","B":"允","C":"公","D":"捷","E":"淳","F":"益","G":"雅","H":"舒","I":"嘉","J":"勤","K":"协","L":"永","M":"短","N":"歆","O":"乐","P":"怡","Q":"已","R":"忻","S":"和","T":"谧","U":"悦","V":"稍","W":"长","X":"少","Y":"近","Z":"尚"},"numbersymbol":{"0":"远","1":"极","2":"安","3":"竟","4":"悉","5":"渐","6":"颇","7":"辄","8":"快","9":"悠","+":"后","/":"轻","=":"曾"}}},"Virtual":{"zhi":["之"],"hu":["乎"],"zhe":["者"],"ye":["也"],"for":["为"],"ba":["把"],"le":["了"],"er":["而"],"this":["此","斯"],"still":["仍"],"with":["与","同"],"also":["亦","也"],"is":["是","乃"],"not":["未","莫"],"or":["或"],"more":["更"],"make":["使","将","让"],"and":["与","同"],"anti":["非","不"],"why":["为何","奈何","何哉"],"but":["但","却","则","而","况","且"],"like":["似","如","若"],"if":["若","倘"],"int":["哉","呼","噫"],"self":["自"],"by":["以","于"]},"Sentences":{"Begin":["1/非/N/ye","1/N/曰","1/若夫/N","1/anti/MV/V/ye/P","2/A/N/曰","2/N/以/A","2/N/anti/在/A","2/N/make/N/zhi","2/MV/N/zhe/A","2/有/N/则/A","2/V/zhe/V/zhi","2/but/MV/A/zhe/A","3/初,/N/V/by/N","3/夫/N/anti/V/by/N","3/AD/V/zhi/谓/A","3/V/而/V/zhi/zhi/谓/A","3/N/,/N/zhi/N/ye/P","3/A/之/V/者/必/有/N/P","4/非/N/不/A/,/V/不/A","4/A/N/AD/V","4/V/N/以/V/N","4/N/不在/A/,/有/N/则/A/P","4/A/N/常有/,/而/A/N/不常有/P","4/N/有/MV/V/,/N/有/AD/然/P","4/N/无/N/,/无以/V/N","5/V/N/而/V/A/,/V/zhi/道/ye/P","5/N/zhi/V/V/,/实为/A/A/P","5/本/MV/V/A/,/anti/V/N/N","5/今/V/N/以/V/A/N","5/N/乃/V/V/N/zhi/N","5/今/N/乃/A/N/A/N","5/A/N/V/A/N","5/夫/N/、/N/不/MV/AD/V/N","5/不/有/A/N/,/何/V/A/N/Q","6/以/N/V/,/like/V/N/V/N","6/A/N/zhi/N/,/V/zhi/以/V/其/N","6/A/N/V/于/N/而/V/N","6/A/N/未/V/N/、/N/之/N","7/N/以/A/A/,/AD/V/A/N","7/V/N/A/,/A/N/V/N","7/N/V/以/N/V/,/V/不/V/N","7/N/N/V/N/,/A/于/N/N","7/MV/AD/V/A/N/,/but/V/V/不/A","7/或/V/N/V/N/,/V/N/于/N","7/则有/N/A/N/A/,/N/N/具/V","7/V/A/N/zhe/,/常/V/其/所/A/,/而/V/其/所/A/P","7/A/N/之/N/不在/N/,/在乎/A/N/之/N/也/P","8/V/A/N/,/V/A/N/,/by/MV/A/zhi/N/P","8/N/anti/AD/V/zhe/by/AD/V/zhe/V/,/anti/MV/AD/V/P","8/N/anti/MV/V/N/,/still/继/N/V/,/why/,/and/N/而/anti/V/N/ye/P","8/V/N/A/A/,/V/N/A/A","8/N/V/A/N/,/N/V/A/N","8/N/在/A/N/,/A/N/zhi/A/,/V/于/N/P","8/A/N/AD/V/,/N/N/AD/V","8/A/N/V/N/,/N/N/V/N/P","8/尝/V/A/N/,/AD/V/A/N/zhi/N","8/予/V/夫/A/N/A/N/,/在/A/N/之/N","8/N/V/于/A/N/,/而/N/V/于/A/N","8/虽/无/N/N/zhi/V/,/亦/V/以/AD/V/A/N/P","9/A/N/V/zhi/而不/V/zhi/、亦/make/A/N/er/复/V/A/N/ye/P","9/N/MV/V/N/V/V/,/but/N/N/AD/V/P","9/以/N/,/当/V/A/N/,/非/N/V/N/所/MV/AD/V/P","9/此/N/有/A/N/A/N/,/A/N/A/N/P","9/是/N/ye/,/N/A/N/A/,/N/A/N/A/P"],"Main":["1/非/N/ye","1/anti/MV/V/ye","2/N/make/N/zhi","2/MV/N/zhe/A","2/有/N/则/A","2/V/zhe/V/zhi","2/but/MV/A/zhe/A","3/N/with/N/V","3/N/曰,何/A/zhi/V/Q","4/A/N/AD/V","4/V/N/以/V/N","4/N/无/N/,/无以/V/N/P","4/N/不在/A/,/有/N/则/A/P","4/N/有/MV/V/,/N/有/AD/然/P","4/N/非/V/而/V/之/者/,/孰/MV/无/N/P","4/A/N/常有/,/而/A/N/不常有/P","4/不/以/N/V/,/不/以/N/V/P","5/今/V/N/以/V/A/N","5/N/乃/V/V/N/zhi/N","5/本/MV/V/A/,/anti/V/N/N","5/今/N/乃/A/N/A/N","5/每/有/V/N/,/便/AD/然/V/N/P","5/N/V/而/A/N/V/也","5/不/有/A/N/,/何/V/A/N/Q","6/以/N/V/,/like/V/N/V/N","6/N/V/,/V/N/V/N","6/虽/V/V/A/A/,/A/A/不/同/P","6/而/A/N/zhi/N/,/V/zhi/以/V/其/N/P","6/A/N/V/于/N/而/V/N","6/A/N/未/V/N/、/N/之/N","6/V/A/N/,/V/A/N","6/V/MV/with/其/N/,/而/V/MV/V/以/N/者/,/N/也/P","6/A/N/必/有/A/N/V/之者/、/予/可/无/N/也/P","6/将/有/V/,/则/V/A/N/以/V/N/P","7/N/V/以/N/V/,/V/不/V/N","7/N/N/V/N/,/A/于/N/N","7/MV/AD/V/A/N/,/but/V/V/不/A","7/或/V/N/V/N/,/V/N/于/N","7/V/A/N/zhe/,/常/V/其/所/A/,/而/V/其/所/A/P","7/A/N/之/不/V/也/AD/矣/,/欲/N/之/无/N/也/AD/矣/P","7/A/N/之/N/不在/N/,/在乎/A/N/之/N/也/P","7/A/N/之/N/,/V/之/N/而/V/之/N/也/P","7/是故/A/N/不必不如/N/,/N/不必/A/于/A/N/P","7/有/A/N/、/A/N/、/A/N/之/N/P","8/N/anti/MV/V/N/,/still/继/N/V/,/why/,/and/N/而/anti/V/N/ye/P","8/是/故/无/A/无/A/,/无/A/无/A/,/N/之/所/V/、/N/之/所/V/ye/P","8/V/N/A/A/,/V/N/A/A","8/N/在/A/N/,/A/N/zhi/A/,/V/于/N/P","8/A/N/AD/V/,/N/N/AD/V","8/A/N/V/N/,/N/N/V/N/P","8/虽/无/N/N/zhi/V/,/亦/V/以/AD/V/A/N/P","8/予/V/夫/A/N/A/N/,/在/A/N/之/N","8/故/V/A/N/者/,/当/V/A/N/之/A/N/P","8/N/V/于/A/N/,/而/N/V/于/A/N","8/A/N/MV/A/N/之/A/,/V/N/中/之/A","8/N/V/于/A/N/之上/,/AD/V/于/A/N/之间/P","8/使/其/A/N/AD/V/,/A/N/AD/V/P","9/N/MV/V/N/V/V/,/but/N/N/AD/V","9/A/N/V/zhi/而不/V/zhi/、亦/make/A/N/er/复/V/A/N/ye/P","9/以/N/,/当/V/A/N/,/非/N/V/N/所/MV/AD/V/P","9/此/N/有/A/N/A/N/,/A/N/A/N/P","9/是/N/ye/,/N/A/N/A/,/N/A/N/A","9/V/A/N/,/N/A/N/A/,/乃/AD/V"],"End":["1/非/N/ye","1/anti/MV/V/ye","2/唯/N/V/zhi","2/V/by/N","2/其/also/A/hu/其/V/ye/P","2/N/make/N/zhi","2/MV/N/zhe/A","2/有/N/则/A","2/V/zhe/V/zhi","2/but/MV/A/zhe/A","3/V/在/A/N","3/今/zhi/V/zhe/,/亦将有/V/于/this/N/P","3/某也/A/,/某也/A/,/可/不/A/哉","4/V/N/zhi/N/by/N","4/A/N/AD/V","4/V/N/以/V/N","4/N/无/N/,/无以/V/N","4/噫/,/A/N/ye/,/N/谁/与/V/Q","4/不/以/N/V/,/不/以/N/V/P","5/请/V/N/zhi/N/中/,/是/N/zhi/N/P","5/今/V/N/以/V/A/N","5/N/乃/V/V/N/zhi/N","5/本/MV/V/A/,/anti/V/N/N","5/今/N/乃/A/N/A/N","5/N/V/而/A/N/V/也","5/不/有/A/N/,/何/V/A/N/Q","6/以/N/V/,/like/V/N/V/N","6/A/zhi/V/N/,/亦/like/今/zhi/V/N/,/A/夫/P","6/N/V/,/V/N/V/N","6/V/N/之/N/,/为/N/V/者/,/可以/V/矣/P","6/V/MV/with/其/N/,/而/V/MV/V/以/N/者/,/N/也/P","6/A/N/必/有/A/N/V/之者/、/予/可/无/N/也/P","6/虽/V/V/A/A/,/A/A/不/同/P","6/将/有/V/,/则/V/A/N/以/V/N/P","7/N/V/以/N/V/,/V/不/V/N","7/N/N/V/N/,/A/于/N/N","7/MV/AD/V/A/N/,/but/V/V/不/A","7/或/V/N/V/N/,/V/N/于/N","7/A/N/之/N/不在/N/,/在乎/A/N/之/N/也/P","7/A/N/之/N/,/V/之/N/而/V/之/N/也/P","7/是故/A/N/不必不如/N/,/N/不必/A/于/A/N/P","7/有/A/N/、/A/N/、/A/N/之/N/P","8/虽/N/A/N/A/,/所/以/V/N/,其/N/A/ye/P","8/何必/V/N/V/N/,/V/N/zhi/N/N/哉/P","8/N/anti/MV/V/N/,/still/继/N/V/,/why/,/and/N/而/anti/V/N/ye/P","8/V/N/A/A/,/V/N/A/A","8/N/在/A/N/,/A/N/zhi/A/,/V/于/N/P","8/A/N/AD/V/,/N/N/AD/V","8/虽/无/N/N/zhi/V/,/亦/V/以/AD/V/A/N/P","8/故/V/A/N/者/,/当/V/A/N/之/A/N/P","8/N/V/于/A/N/之上/,/AD/V/于/A/N/之间/P","8/使/其/A/N/AD/V/,/A/N/AD/V/P","9/A/N/V/zhi/而不/V/zhi/、亦/make/A/N/er/复/V/A/N/ye/P","9/N/MV/V/N/V/V/,/but/N/N/AD/V","9/以/N/,/当/V/A/N/,/非/N/V/N/所/MV/AD/V/P","9/此/N/有/A/N/A/N/,/A/N/A/N/P","9/是/N/ye/,/N/A/N/A/,/N/A/N/A/P"]}}'; var RoundFlip = 0; //标志现在到哪了 var RoundControl = new Uint8Array(32); //一个数组,用密钥哈希来控制轮转的行为 @@ -51,7 +52,6 @@ var NUMBERSYMBOL_ROUND_1 = "0123456789+/="; var NUMBERSYMBOL_ROUND_2 = "5=0764+389/12"; //手动随机打乱的乱序轮 var NUMBERSYMBOL_ROUND_3 = "0123456789+/="; - //const SIG_DECRYPT_JP = "桜込凪雫実沢"; //const SIG_DECRYPT_CN = "玚俟玊欤瞐珏"; const NULL_STR = "孎"; //默认忽略的占位字符,一个生僻字。 @@ -129,34 +129,64 @@ const Map_Obj = JSON.parse(Map); let DecodeTable = {}; let PayloadLetter = ""; - -function InitDecodeTable(){ +function InitDecodeTable() { DecodeTable = {}; PayloadLetter = ""; - for(let i = 0; i < 52 ; i++){ + for (let i = 0; i < 52; i++) { DecodeTable[LETTERS[i]] = []; - DecodeTable[LETTERS[i]].push(Map_Obj["Actual"]["N"]["alphabet"][LETTERS[i]]); - DecodeTable[LETTERS[i]].push(Map_Obj["Actual"]["A"]["alphabet"][LETTERS[i]]); - DecodeTable[LETTERS[i]].push(Map_Obj["Actual"]["V"]["alphabet"][LETTERS[i]]); - PayloadLetter = PayloadLetter + Map_Obj["Actual"]["N"]["alphabet"][LETTERS[i]]; - PayloadLetter = PayloadLetter + Map_Obj["Actual"]["A"]["alphabet"][LETTERS[i]]; - PayloadLetter = PayloadLetter + Map_Obj["Actual"]["V"]["alphabet"][LETTERS[i]]; - if(Map_Obj["Actual"]["A"]["alphabet"][LETTERS[i]] != Map_Obj["Actual"]["AD"]["alphabet"][LETTERS[i]]){ - DecodeTable[LETTERS[i]].push(Map_Obj["Actual"]["AD"]["alphabet"][LETTERS[i]]); - PayloadLetter = PayloadLetter + Map_Obj["Actual"]["AD"]["alphabet"][LETTERS[i]]; + DecodeTable[LETTERS[i]].push( + Map_Obj["Actual"]["N"]["alphabet"][LETTERS[i]] + ); + DecodeTable[LETTERS[i]].push( + Map_Obj["Actual"]["A"]["alphabet"][LETTERS[i]] + ); + DecodeTable[LETTERS[i]].push( + Map_Obj["Actual"]["V"]["alphabet"][LETTERS[i]] + ); + PayloadLetter = + PayloadLetter + Map_Obj["Actual"]["N"]["alphabet"][LETTERS[i]]; + PayloadLetter = + PayloadLetter + Map_Obj["Actual"]["A"]["alphabet"][LETTERS[i]]; + PayloadLetter = + PayloadLetter + Map_Obj["Actual"]["V"]["alphabet"][LETTERS[i]]; + if ( + Map_Obj["Actual"]["A"]["alphabet"][LETTERS[i]] != + Map_Obj["Actual"]["AD"]["alphabet"][LETTERS[i]] + ) { + DecodeTable[LETTERS[i]].push( + Map_Obj["Actual"]["AD"]["alphabet"][LETTERS[i]] + ); + PayloadLetter = + PayloadLetter + Map_Obj["Actual"]["AD"]["alphabet"][LETTERS[i]]; } } - for(let i = 0; i < 13 ; i++){ + for (let i = 0; i < 13; i++) { DecodeTable[NUMBERSYMBOL[i]] = []; - DecodeTable[NUMBERSYMBOL[i]].push(Map_Obj["Actual"]["N"]["numbersymbol"][NUMBERSYMBOL[i]]); - DecodeTable[NUMBERSYMBOL[i]].push(Map_Obj["Actual"]["A"]["numbersymbol"][NUMBERSYMBOL[i]]); - DecodeTable[NUMBERSYMBOL[i]].push(Map_Obj["Actual"]["V"]["numbersymbol"][NUMBERSYMBOL[i]]); - PayloadLetter = PayloadLetter + Map_Obj["Actual"]["N"]["numbersymbol"][NUMBERSYMBOL[i]]; - PayloadLetter = PayloadLetter + Map_Obj["Actual"]["A"]["numbersymbol"][NUMBERSYMBOL[i]]; - PayloadLetter = PayloadLetter + Map_Obj["Actual"]["V"]["numbersymbol"][NUMBERSYMBOL[i]]; - if(Map_Obj["Actual"]["A"]["numbersymbol"][NUMBERSYMBOL[i]] != Map_Obj["Actual"]["AD"]["numbersymbol"][NUMBERSYMBOL[i]]){ - DecodeTable[NUMBERSYMBOL[i]].push(Map_Obj["Actual"]["AD"]["numbersymbol"][NUMBERSYMBOL[i]]); - PayloadLetter = PayloadLetter + Map_Obj["Actual"]["AD"]["numbersymbol"][NUMBERSYMBOL[i]]; + DecodeTable[NUMBERSYMBOL[i]].push( + Map_Obj["Actual"]["N"]["numbersymbol"][NUMBERSYMBOL[i]] + ); + DecodeTable[NUMBERSYMBOL[i]].push( + Map_Obj["Actual"]["A"]["numbersymbol"][NUMBERSYMBOL[i]] + ); + DecodeTable[NUMBERSYMBOL[i]].push( + Map_Obj["Actual"]["V"]["numbersymbol"][NUMBERSYMBOL[i]] + ); + PayloadLetter = + PayloadLetter + Map_Obj["Actual"]["N"]["numbersymbol"][NUMBERSYMBOL[i]]; + PayloadLetter = + PayloadLetter + Map_Obj["Actual"]["A"]["numbersymbol"][NUMBERSYMBOL[i]]; + PayloadLetter = + PayloadLetter + Map_Obj["Actual"]["V"]["numbersymbol"][NUMBERSYMBOL[i]]; + if ( + Map_Obj["Actual"]["A"]["numbersymbol"][NUMBERSYMBOL[i]] != + Map_Obj["Actual"]["AD"]["numbersymbol"][NUMBERSYMBOL[i]] + ) { + DecodeTable[NUMBERSYMBOL[i]].push( + Map_Obj["Actual"]["AD"]["numbersymbol"][NUMBERSYMBOL[i]] + ); + PayloadLetter = + PayloadLetter + + Map_Obj["Actual"]["AD"]["numbersymbol"][NUMBERSYMBOL[i]]; } } } @@ -577,22 +607,22 @@ function CheckLuhnBit(Data) { } } -function RemovePadding(Base64String){ +function RemovePadding(Base64String) { let PaddingCount = 0; - for(let i = Base64String.length - 1; i >= Base64String.length - 4 ;i--){ - if(Base64String[i] == "="){ - PaddingCount ++; + for (let i = Base64String.length - 1; i >= Base64String.length - 4; i--) { + if (Base64String[i] == "=") { + PaddingCount++; } } - return Base64String.slice(0,Base64String.length - PaddingCount); + return Base64String.slice(0, Base64String.length - PaddingCount); } -function AddPadding(Base64String){ - if(Base64String.length % 4 == 3 ){ +function AddPadding(Base64String) { + if (Base64String.length % 4 == 3) { return Base64String + "="; - }else if(Base64String.length % 4 == 2 ){ + } else if (Base64String.length % 4 == 2) { return Base64String + "=="; - }else{ + } else { return Base64String; } } @@ -606,17 +636,13 @@ function wordArrayToUint8Array(data) { return dataArray; } -function stringToUint8Array(str) { - let tempBase64 = Base64.encode(str); - return Base64.toUint8Array(tempBase64); -} function Uint8ArrayTostring(fileData) { let tempBase64 = Base64.fromUint8Array(fileData); return Base64.decode(tempBase64); } function GetRandomIndex(length) { - let MT = new MersenneTwister(Math.floor(Math.random() * 1000000000)) + let MT = new MersenneTwister(Math.floor(Math.random() * 1000000000)); let Rand = Math.floor(MT.random() * length); return Rand; @@ -767,25 +793,30 @@ export class PreCheckResult { } } - -export function selectSentence(PayloadLength,RandomIndex = 0){ //句式选择算法 +export function selectSentence(PayloadLength, RandomIndex = 0) { + //句式选择算法 //RandomIndex 随机指数,越大,给出的句式越随机,最大100。 let selectRand; - let DividedPayload = distributeInteger(PayloadLength);//把Payload平均分配给三个部分。 - - let ElementResult = []; //最终要返回的语素序列 + let DividedPayload = distributeInteger(PayloadLength); //把Payload平均分配给三个部分。 - for(let i=0;i<3;i++){ //第一重循环,选择Payload + let ElementResult = []; //最终要返回的语素序列 + + for (let i = 0; i < 3; i++) { + //第一重循环,选择Payload let Payload = DividedPayload[i]; - if(i == 0){ //在Begin句式库中选择。 + if (i == 0) { + //在Begin句式库中选择。 - for(let a=0 ;a < Payload;){ //第二重循环,用算法选择句式,满足载荷 + for (let a = 0; a < Payload; ) { + //第二重循环,用算法选择句式,满足载荷 selectRand = GetRandomIndex(101) + RandomIndex; let PossiblePayload = []; - for(let b = 1;b <= Payload - a;b++){ //三重,求取所有可能载荷。 - if(b == 9){ //最大为9 + for (let b = 1; b <= Payload - a; b++) { + //三重,求取所有可能载荷。 + if (b == 9) { + //最大为9 PossiblePayload.push(b); break; } @@ -793,44 +824,54 @@ export function selectSentence(PayloadLength,RandomIndex = 0){ //句式选择算 } //这里给出的可能载荷数组应当是从小到大的。 let TargetPayload; - if(selectRand <= 100){ //选择贪心最优解之一 - if(PossiblePayload[PossiblePayload.length-1] > 6){ //如果可以选到6以上 + if (selectRand <= 100) { + //选择贪心最优解之一 + if (PossiblePayload[PossiblePayload.length - 1] > 6) { + //如果可以选到6以上 let GreedyRand = GetRandomIndex(91); //在三个多逻辑句式的载荷量之间随机选一个 - if(GreedyRand<30){ - TargetPayload = PossiblePayload[PossiblePayload.length-3]; - }else if(GreedyRand >=30 && GreedyRand < 60){ - TargetPayload = PossiblePayload[PossiblePayload.length-2]; - }else{ - TargetPayload = PossiblePayload[PossiblePayload.length-1]; + if (GreedyRand < 30) { + TargetPayload = PossiblePayload[PossiblePayload.length - 3]; + } else if (GreedyRand >= 30 && GreedyRand < 60) { + TargetPayload = PossiblePayload[PossiblePayload.length - 2]; + } else { + TargetPayload = PossiblePayload[PossiblePayload.length - 1]; } - }else{ + } else { TargetPayload = PossiblePayload.pop(); //目标Payload,参照这个去库里寻句式。 } - }else if(selectRand > 100 && selectRand <= 200){ //随机选择一个,不一定是最优解 - TargetPayload = PossiblePayload[GetRandomIndex(PossiblePayload.length)]; - PossiblePayload = PossiblePayload.filter(item => item > TargetPayload); + } else if (selectRand > 100 && selectRand <= 200) { + //随机选择一个,不一定是最优解 + TargetPayload = + PossiblePayload[GetRandomIndex(PossiblePayload.length)]; + PossiblePayload = PossiblePayload.filter( + (item) => item > TargetPayload + ); } let PossibleSentences = []; //所有挑选出来的可能句式,选择时任选其一。 - for(let c = 0;c 6){ //如果可以选到6以上 + if (selectRand <= 100) { + //选择贪心最优解 + if (PossiblePayload[PossiblePayload.length - 1] > 6) { + //如果可以选到6以上 let GreedyRand = GetRandomIndex(91); //在三个多逻辑句式的载荷量之间随机选一个 - if(GreedyRand<30){ - TargetPayload = PossiblePayload[PossiblePayload.length-3]; - }else if(GreedyRand >=30 && GreedyRand < 60){ - TargetPayload = PossiblePayload[PossiblePayload.length-2]; - }else{ - TargetPayload = PossiblePayload[PossiblePayload.length-1]; + if (GreedyRand < 30) { + TargetPayload = PossiblePayload[PossiblePayload.length - 3]; + } else if (GreedyRand >= 30 && GreedyRand < 60) { + TargetPayload = PossiblePayload[PossiblePayload.length - 2]; + } else { + TargetPayload = PossiblePayload[PossiblePayload.length - 1]; } - }else{ + } else { TargetPayload = PossiblePayload.pop(); //目标Payload,参照这个去库里寻句式。 } - }else if(selectRand > 100 && selectRand <= 200){ //随机选择一个,不一定是最优解 - TargetPayload = PossiblePayload[GetRandomIndex(PossiblePayload.length)]; - PossiblePayload = PossiblePayload.filter(item => item > TargetPayload); + } else if (selectRand > 100 && selectRand <= 200) { + //随机选择一个,不一定是最优解 + TargetPayload = + PossiblePayload[GetRandomIndex(PossiblePayload.length)]; + PossiblePayload = PossiblePayload.filter( + (item) => item > TargetPayload + ); } let PossibleSentences = []; //所有挑选出来的可能句式,选择时任选其一。 - for(let c = 0;c 6){ //如果可以选到6以上 + if (selectRand <= 100) { + //选择贪心最优解 + if (PossiblePayload[PossiblePayload.length - 1] > 6) { + //如果可以选到6以上 let GreedyRand = GetRandomIndex(91); //在三个多逻辑句式的载荷量之间随机选一个 - if(GreedyRand<30){ - TargetPayload = PossiblePayload[PossiblePayload.length-3]; - }else if(GreedyRand >=30 && GreedyRand < 60){ - TargetPayload = PossiblePayload[PossiblePayload.length-2]; - }else{ - TargetPayload = PossiblePayload[PossiblePayload.length-1]; + if (GreedyRand < 30) { + TargetPayload = PossiblePayload[PossiblePayload.length - 3]; + } else if (GreedyRand >= 30 && GreedyRand < 60) { + TargetPayload = PossiblePayload[PossiblePayload.length - 2]; + } else { + TargetPayload = PossiblePayload[PossiblePayload.length - 1]; } - }else{ + } else { TargetPayload = PossiblePayload.pop(); //目标Payload,参照这个去库里寻句式。 } - }else if(selectRand > 100 && selectRand <= 200){ //随机选择一个,不一定是最优解 - TargetPayload = PossiblePayload[GetRandomIndex(PossiblePayload.length)]; - PossiblePayload = PossiblePayload.filter(item => item > TargetPayload); + } else if (selectRand > 100 && selectRand <= 200) { + //随机选择一个,不一定是最优解 + TargetPayload = + PossiblePayload[GetRandomIndex(PossiblePayload.length)]; + PossiblePayload = PossiblePayload.filter( + (item) => item > TargetPayload + ); } let PossibleSentences = []; //所有挑选出来的可能句式,选择时任选其一。 - for(let c = 0;c=3 && j != Sentence.length -2){ //最大逗号数量也不能超过门槛 - TempStr1 = TempStr1 + "。"; - CommaCounter = 0; - }else{ - TempStr1 = TempStr1 + ","; - CommaCounter += (CommaNumInSentence + 1); - } - }else{ //超过门槛就加上句号,然后重置逗号计数器 + if (i == size) { + Finished = true; + } + } + if (Finished) { + if (q && !hasSpecialEndSymbol) { + TempStr1 = TempStr1 + "。"; + break; + } + } else { + if (q && !hasSpecialEndSymbol) { + let TestCommaCount = CommaCounter + (CommaNumInSentence + 1); //计算本句添加后可能的最大逗号数量 + if (CommaCounter < 3 || j == Sentence.length - 2) { + //如果逗号数量没到门槛,而且这不是倒数第二个句式,那么就添加逗号 + if (TestCommaCount >= 3 && j != Sentence.length - 2) { + //最大逗号数量也不能超过门槛 TempStr1 = TempStr1 + "。"; CommaCounter = 0; + } else { + TempStr1 = TempStr1 + ","; + CommaCounter += CommaNumInSentence + 1; } - } - if(hasSpecialEndSymbol){ + } else { + //超过门槛就加上句号,然后重置逗号计数器 + TempStr1 = TempStr1 + "。"; CommaCounter = 0; } } + if (hasSpecialEndSymbol) { + CommaCounter = 0; + } } + } - if(!q){ - let TempStrQ = ""; - for(let i = 0;i