@@ -17,10 +17,16 @@ import {
1717 AddPadding ,
1818 shuffle ,
1919 ValueNoise1D ,
20+ unpackFlexibleTransferConfig ,
2021} from "./Misc.js" ;
2122import { 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" ;
2328import * as OpenCC from "opencc-js" ;
29+ import { Base64 } from "js-base64" ;
2430
2531export 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