Skip to content

Commit 4cbd9e5

Browse files
committed
Finishing Decryption of FlexibleTransfer
Fix (nearly) all the problems. Error handling and some code clean up are WIP.
1 parent 9434cd6 commit 4cbd9e5

7 files changed

Lines changed: 493 additions & 56 deletions

File tree

src/javascript/ChineseMappingHelper.js

Lines changed: 146 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,16 @@ import {
1717
AddPadding,
1818
shuffle,
1919
ValueNoise1D,
20+
unpackFlexibleTransferConfig,
2021
} from "./Misc.js";
2122
import { RoundObfusOLD, RoundObfus } from "./RoundObfusHelper.js";
22-
import { CallbackObj } from "./CoreHandler.js";
23+
import {
24+
CallbackObj,
25+
FlexibleTransferDataObj,
26+
FLEXIBLE_TRANSFER_MAGIC,
27+
} from "./CoreHandler.js";
2328
import * as OpenCC from "opencc-js";
29+
import { Base64 } from "js-base64";
2430

2531
export class WenyanSimulator {
2632
/**
@@ -959,9 +965,10 @@ export class WenyanSimulator {
959965
* 汉字逆映射总流程函数(解密)
960966
*
961967
* @param{string}OriginStr 需要逆映射的字符串(一串汉字)
962-
* @returns{string} 返回Base64字符串(逆映射结果)
968+
* @param{string}key 明文密钥,用于解密灵活传输标头
969+
* @returns{string|FlexibleTransferDataObj[]} 返回Base64字符串(逆映射结果)
963970
*/
964-
deMap(OriginStr) {
971+
deMap(OriginStr, key) {
965972
let TempStr1 = "",
966973
TempStrz = "";
967974
let temp = "",
@@ -1017,27 +1024,157 @@ export class WenyanSimulator {
10171024
}
10181025
size = TempStrz.length;
10191026
OriginStr = TempStrz;
1020-
this.RoundKey(); //开始轮转逆映射字符,还原Base64字符串
1027+
//灵活传输介入所需要的暂存
1028+
let FlexibleTransferMarkerDecCounter = -1;
1029+
let FlexibleTransferDecCounter = -1;
1030+
let FlexibleTransferDecCounterTarget = -1;
1031+
let FlexibleMarkerTemp = "";
1032+
let FlexibleTransferDataArray = [];
1033+
//开始轮转逆映射字符,还原Base64字符串,在一切开始前先转动一次转轮
1034+
this.RoundKey();
10211035
for (let i = 0; i < size; ) {
10221036
temp = OriginStr[i];
10231037

1024-
findtemp = this.findOriginText(temp); //查找第一个字符的原文
1038+
findtemp = this.findOriginText(temp); //查找字符的原文
10251039
if (findtemp == this.NULL_STR) {
10261040
/* v8 ignore next 2 */
1027-
throw "Bad Input. Try force encrypt if intended.";
1041+
throw "Bad Input.";
10281042
}
1029-
TempStr1 = TempStr1 + findtemp; //把找到的原文增加到字符串上
1043+
1044+
//>>>>>>>>>>>>>>>>↓
1045+
//这里是灵活传输的介入,在每一轮转步骤的字符串追加前和追加后都要执行拦截操作
1046+
1047+
if (FlexibleTransferMarkerDecCounter >= 8) {
1048+
//这个判断用来拦截灵活传输标头的末尾,灵活传输到这里,是第九次循环。针对标头的判断在追加字符串之后。
1049+
//在此处提前拦截可避免复杂一些的字符串截取操作。
1050+
FlexibleMarkerTemp = TempStr1.slice(-8); //把标头截取下来
1051+
TempStr1 = TempStr1.slice(0, -8); //把标头从主字符串上丢掉
1052+
1053+
let RawDataObj = unpackFlexibleTransferConfig(
1054+
Base64.toUint8Array(FlexibleMarkerTemp),
1055+
key
1056+
);
1057+
FlexibleTransferDecCounterTarget = RawDataObj.lengthToBoundary; //确定当前位置到本段边界的距离。
1058+
FlexibleTransferDecCounter = 0; //把Counter设置为0;
1059+
FlexibleTransferMarkerDecCounter = -1; //重置标头计数器
1060+
}
1061+
1062+
if (
1063+
FlexibleTransferDecCounter == FlexibleTransferDecCounterTarget &&
1064+
FlexibleTransferDecCounter != -1
1065+
) {
1066+
//刚好位于本段末尾;
1067+
//TempStr1 就是本段的全部Base64密文数据,可能含有高级加密标头,但是这不由拦截器考虑。
1068+
1069+
let FlexibleMarkerData = unpackFlexibleTransferConfig(
1070+
Base64.toUint8Array(FlexibleMarkerTemp),
1071+
key
1072+
); //把灵活传输标头解开
1073+
1074+
//把本段灵活传输的数据给加入到数组里
1075+
FlexibleTransferDataArray.push(
1076+
new FlexibleTransferDataObj(
1077+
FlexibleMarkerData.UseAONT,
1078+
FlexibleMarkerData.messageID,
1079+
TempStr1,
1080+
FlexibleMarkerData.SerialNumber
1081+
)
1082+
);
1083+
1084+
//重置所有暂存变量
1085+
FlexibleTransferMarkerDecCounter = -1;
1086+
FlexibleTransferDecCounter = -1;
1087+
FlexibleTransferDecCounterTarget = -1;
1088+
FlexibleMarkerTemp = "";
1089+
1090+
this.RoundObufsHelper.RoundReset(); //重置当前转轮。
1091+
TempStr1 = ""; //重置暂存的字符串
1092+
this.RoundKey(); //轮换一次转轮
1093+
continue;
1094+
//开始下一次循环,下一次循环将会再截取新的标头和数据。
1095+
}
1096+
//>>>>>>>>>>>>>>>>↑
1097+
1098+
//核心操作,追加字符串
1099+
TempStr1 = TempStr1 + findtemp; //把找到的原文追加到字符串上
1100+
1101+
//>>>>>>>>>>>>>>>>↓
1102+
if (
1103+
FlexibleTransferMarkerDecCounter > -1 &&
1104+
FlexibleTransferMarkerDecCounter < 8
1105+
) {
1106+
FlexibleTransferMarkerDecCounter++; //后续八个高级加密标头字符,在解混淆的时候递增计数器
1107+
}
1108+
1109+
if (TempStr1.endsWith(FLEXIBLE_TRANSFER_MAGIC)) {
1110+
//识别到高级加密标头,开始介入
1111+
if (FlexibleTransferMarkerDecCounter > -1) {
1112+
throw "Bad Input."; //连续两次以上检测到高级加密标头,是不可能的情况,直接丢出错误。
1113+
}
1114+
FlexibleTransferMarkerDecCounter++;
1115+
//首次识别到标头,此时只解混淆到 =/,后续有八个字符。
1116+
TempStr1 = TempStr1.slice(0, -2); //把标头丢掉
1117+
}
1118+
1119+
if (FlexibleTransferDecCounter > -1) {
1120+
//灵活传输,此时位于标头到段落边界之间的位置
1121+
if (FlexibleTransferDecCounter < FlexibleTransferDecCounterTarget) {
1122+
//如果没解密到本段到末尾,那么继续解密
1123+
FlexibleTransferDecCounter++;
1124+
}
1125+
}
1126+
//>>>>>>>>>>>>>>>>↑
10301127
this.RoundKey(); //轮换密钥
10311128
i++;
1129+
//>>>>>>>>>>>>>>>>↓
1130+
//分段传输在循环到最后的时候,需要执行一次收尾判断。判断体和前面的一样。
1131+
if (i == size && FlexibleTransferDecCounter != -1) {
1132+
if (FlexibleTransferDecCounter == FlexibleTransferDecCounterTarget) {
1133+
//刚好位于本段末尾;
1134+
//TempStr1 就是本段的全部Base64密文数据,可能含有高级加密标头,但是这不由拦截器考虑。
1135+
1136+
let FlexibleMarkerData = unpackFlexibleTransferConfig(
1137+
Base64.toUint8Array(FlexibleMarkerTemp),
1138+
key
1139+
); //把灵活传输标头解开
1140+
1141+
//把本段灵活传输的数据给加入到数组里
1142+
FlexibleTransferDataArray.push(
1143+
new FlexibleTransferDataObj(
1144+
FlexibleMarkerData.UseAONT,
1145+
FlexibleMarkerData.messageID,
1146+
TempStr1,
1147+
FlexibleMarkerData.SerialNumber
1148+
)
1149+
);
1150+
1151+
//重置所有暂存变量
1152+
FlexibleTransferMarkerDecCounter = -1;
1153+
FlexibleTransferDecCounter = -1;
1154+
FlexibleTransferDecCounterTarget = -1;
1155+
FlexibleMarkerTemp = "";
1156+
1157+
this.RoundObufsHelper.RoundReset(); //重置当前转轮。
1158+
TempStr1 = ""; //重置暂存的字符串
1159+
this.RoundKey(); //轮换一次转轮
1160+
continue;
1161+
}
1162+
}
1163+
//>>>>>>>>>>>>>>>>↑
10321164
try {
10331165
if (this.callback != null)
10341166
this.callback(new CallbackObj("DEC_BASE64", TempStr1));
10351167
} catch (err) {
10361168
// continue regardless of error
10371169
}
10381170
}
1039-
TempStr1 = AddPadding(TempStr1); //轮转完成之后,为Base64字符串添加Padding
1040-
return TempStr1;
1171+
1172+
if (FlexibleTransferDataArray.length == 0) {
1173+
TempStr1 = TempStr1; //轮转完成之后,为Base64字符串添加Padding
1174+
return TempStr1;
1175+
} else {
1176+
return FlexibleTransferDataArray;
1177+
}
10411178
}
10421179
}
10431180

0 commit comments

Comments
 (0)