|
12 | 12 | import { Base64 } from "js-base64"; |
13 | 13 | import MersenneTwister from "mersenne-twister"; //兼容性 |
14 | 14 | import CryptoJS from "crypto-js"; |
15 | | -import { random } from "@lukeed/csprng"; //密码学安全随机数的封装 |
16 | | -import { FlexibleTransferConfig } from "./CoreHandler"; |
| 15 | +import { random } from "./CSPRNGHelper"; //密码学安全随机数的封装 |
| 16 | +import { FlexibleTransferConfig, FLEXIBLE_TRANSFER_MAGIC } from "./CoreHandler"; |
17 | 17 |
|
18 | 18 | const SIG_DECRYPT_JP = "桜込凪雫実沢"; |
19 | 19 | const SIG_DECRYPT_CN = "玚俟玊欤瞐珏"; |
@@ -80,8 +80,18 @@ export function GetRandomIndex(length) { |
80 | 80 | // 取随机数 |
81 | 81 | let Rand; |
82 | 82 |
|
| 83 | + Rand = Math.floor(MT.random() * length); |
| 84 | + |
| 85 | + return Rand; |
| 86 | +} |
| 87 | + |
| 88 | +export function GetSecureRandomIndex(length) { |
| 89 | + // 取随机数 |
| 90 | + let Rand; |
| 91 | + Rand = Math.floor(MT.random() * length); |
| 92 | + |
83 | 93 | try { |
84 | | - Rand = Math.floor((random(1).at(0) / 256) * length); |
| 94 | + Rand = Math.floor(random() * length); |
85 | 95 | } catch (err) { |
86 | 96 | Rand = Math.floor(MT.random() * length); |
87 | 97 | } |
@@ -237,13 +247,13 @@ export function packFlexibleTransferConfig( |
237 | 247 | const low24 = ((ser & 0x1ff) << 15) | (aont << 14) | safeIv; |
238 | 248 |
|
239 | 249 | //将 24 位区块映射为 Uint8Array (大端序) |
240 | | - const buffer = new Uint8Array(6); |
241 | | - buffer[0] = (high24 >> 16) & 0xff; |
242 | | - buffer[1] = (high24 >> 8) & 0xff; |
243 | | - buffer[2] = high24 & 0xff; |
244 | | - buffer[3] = (low24 >> 16) & 0xff; |
245 | | - buffer[4] = (low24 >> 8) & 0xff; |
246 | | - buffer[5] = low24 & 0xff; |
| 250 | + const ResultBuffer = new Uint8Array(6); |
| 251 | + ResultBuffer[0] = (high24 >> 16) & 0xff; |
| 252 | + ResultBuffer[1] = (high24 >> 8) & 0xff; |
| 253 | + ResultBuffer[2] = high24 & 0xff; |
| 254 | + ResultBuffer[3] = (low24 >> 16) & 0xff; |
| 255 | + ResultBuffer[4] = (low24 >> 8) & 0xff; |
| 256 | + ResultBuffer[5] = low24 & 0xff; |
247 | 257 |
|
248 | 258 | //加密逻辑(若传入了 KEY) |
249 | 259 | if (key) { |
@@ -285,15 +295,15 @@ export function packFlexibleTransferConfig( |
285 | 295 | } |
286 | 296 |
|
287 | 297 | // 掩码异或,加密前 34 bits |
288 | | - buffer[0] ^= keystream[0]; |
289 | | - buffer[1] ^= keystream[1]; |
290 | | - buffer[2] ^= keystream[2]; |
291 | | - buffer[3] ^= keystream[3]; |
| 298 | + ResultBuffer[0] ^= keystream[0]; |
| 299 | + ResultBuffer[1] ^= keystream[1]; |
| 300 | + ResultBuffer[2] ^= keystream[2]; |
| 301 | + ResultBuffer[3] ^= keystream[3]; |
292 | 302 | // 0xC0 = 11000000,异或高2位,保留低6位和第5字节的8位(合计 14bit IV)绝对明文 |
293 | | - buffer[4] ^= keystream[4] & 0xc0; |
| 303 | + ResultBuffer[4] ^= keystream[4] & 0xc0; |
294 | 304 | } |
295 | 305 |
|
296 | | - return buffer; |
| 306 | + return ResultBuffer; |
297 | 307 | } |
298 | 308 |
|
299 | 309 | /** |
@@ -586,14 +596,18 @@ export function insertEncryptMarks( |
586 | 596 | // 距离就是原字符串剩下的字符数 |
587 | 597 | const distanceToEnd = L - i2; |
588 | 598 | // 生成 sub2 并插入 |
589 | | - const sub2 = sub2EncryptProvider( |
590 | | - distanceToEnd, |
591 | | - FlexibleTransferConfigObj.MessengeID, |
592 | | - FlexibleTransferConfigObj.RecursionSeqNum, |
593 | | - FlexibleTransferConfigObj.UseAONT, |
594 | | - key, |
595 | | - GetRandomIndex(16384) |
596 | | - ); |
| 599 | + const sub2 = |
| 600 | + FLEXIBLE_TRANSFER_MAGIC + |
| 601 | + Base64.fromUint8Array( |
| 602 | + sub2EncryptProvider( |
| 603 | + distanceToEnd, |
| 604 | + FlexibleTransferConfigObj.MessengeID, |
| 605 | + FlexibleTransferConfigObj.RecursionSeqNum, |
| 606 | + FlexibleTransferConfigObj.UseAONT, |
| 607 | + key, |
| 608 | + GetRandomIndex(16384) |
| 609 | + ) |
| 610 | + ); |
597 | 611 | return originalStr.slice(0, i2) + sub2 + originalStr.slice(i2); |
598 | 612 | } |
599 | 613 |
|
@@ -622,7 +636,18 @@ export function insertEncryptMarks( |
622 | 636 | } |
623 | 637 |
|
624 | 638 | // Step 3: 生成并插入 sub2 |
625 | | - const sub2 = sub2EncryptProvider(distanceToEnd); |
| 639 | + const sub2 = |
| 640 | + FLEXIBLE_TRANSFER_MAGIC + |
| 641 | + Base64.fromUint8Array( |
| 642 | + sub2EncryptProvider( |
| 643 | + distanceToEnd, |
| 644 | + FlexibleTransferConfigObj.MessengeID, |
| 645 | + FlexibleTransferConfigObj.RecursionSeqNum, |
| 646 | + FlexibleTransferConfigObj.UseAONT, |
| 647 | + key, |
| 648 | + GetSecureRandomIndex(16384) |
| 649 | + ) |
| 650 | + ); |
626 | 651 | return strAfterSub1.slice(0, i2) + sub2 + strAfterSub1.slice(i2); |
627 | 652 | } |
628 | 653 | } |
|
0 commit comments