5. AES-256-CTR 加密
5.1 完整实现代码
javascript
// 模块 1618 - AES 加密函数
function encryptAES(d, E = S.AES_KEY, g = S.AES_IV) {
const A = T.createCipheriv(
"aes-256-ctr", // 算法:AES-256 CTR 模式
Buffer.from(E, "base64"), // 密钥:Base64 → Buffer (32 字节)
Buffer.from(g, "base64") // IV:Base64 → Buffer (16 字节)
);
let v = A.update(d, "utf8", "base64"); // UTF-8 明文 → Base64 密文
v += A.final("base64"); // 完成加密
return v; // 返回 Base64 密文
}
// 模块 1618 - AES 解密函数
function decryptAES(d, E = S.AES_KEY, g = S.AES_IV) {
const A = T.createDecipheriv(
"aes-256-ctr", // 算法:AES-256 CTR 模式
Buffer.from(E, "base64"), // 密钥:Base64 → Buffer (32 字节)
Buffer.from(g, "base64") // IV:Base64 → Buffer (16 字节)
);
let v = A.update(d, "base64", "utf8"); // Base64 密文 → UTF-8 明文
v += A.final("utf8"); // 完成解密
return v; // 返回 UTF-8 明文
}5.2 密钥与 IV
AES_KEY: 已脱敏
AES_IV: 已脱敏Hex 解码:
- AES_KEY:
603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF6(32 字节 = 256-bit) - AES_IV:
73AEF0857D77811F352C073B6108D72D(16 字节 = 128-bit)
注意:AES_IV 是 AES_KEY 的子串!
AES_KEY: 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF6
AES_IV: 73AEF0857D77811F352C073B6108D72D
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AES_KEY[12:28] 的 Hex 值与 AES_IV 完全一致5.3 加密参数
| 参数 | 值 | 说明 |
|---|---|---|
| 算法 | AES-256-CTR | 256-bit 密钥,CTR 模式 |
| 密钥长度 | 256-bit (32 字节) | Base64 编码 |
| IV 长度 | 128-bit (16 字节) | Base64 编码 |
| 填充 | 无 | CTR 模式不需要填充 |
| 输入编码 | UTF-8 | 明文编码 |
| 输出编码 | Base64 | 密文编码 |
5.4 调用点分析
当前状态:AES-256-CTR 在 encrypt/decrypt 调度器中注册,但 未发现任何业务代码实际调用 encrypt(data, "AES")、decrypt(data, "AES")、encryptAES 或 decryptAES。AES 为预留接口,可能用于 WebSocket 消息加密或未来版本。
6. MD5 哈希
6.1 完整实现代码
javascript
// 模块 1618 - MD5 哈希函数
function cryptoMd5(d) {
return T.createHash("md5").update(d).digest("hex");
// 输入:任意字符串
// 输出:32 字符小写 Hex 字符串
}6.2 调用点分析
调用点 1:代码补全缓存键生成
javascript
// 模块位置:codeGenerateMediator 函数
function codeGenerateMediator(d, E, g, N, O) {
A.default.add(E.requestId, E.token);
A.default.setCompleteStatus(E.requestId, 0);
const { requestId: B, scene: x, model: U } = E;
try {
// 构造缓存键:prefix + suffix + language
const T = { prefix: g, suffix: N, lang: E.language };
// MD5 哈希作为缓存键
const D = (0, I.cryptoMd5)((0, R.json2str)(T));
// 检查缓存
const F = S.default.get(D);
if (F && E?.forcedTrigger === false) {
v.default.attr(d.id, { "complete.cache": `代码补全命中缓存:${B}` });
if (E.stream) {
return w(Object.assign({}, F, { ended: true, fromCache: true }));
}
w(F);
} else {
// 缓存未命中,发起代码补全请求
// ...
S.default.set(D, N, 60 * 60 * 1000); // 缓存 1 小时
}
}
}数据流:
代码补全请求
→ 构造缓存键对象: { prefix, suffix, lang }
→ JSON.stringify()
→ cryptoMd5(jsonString)
→ MD5 哈希 (32 字符 Hex)
→ 查询内存缓存 (Map)
→ 命中:返回缓存结果
→ 未命中:发起补全请求,结果缓存 1 小时调用点 2:方法内容哈希(代码注释场景)
javascript
// 模块位置:代码注释处理
const S = (0, H.cryptoMd5)(E.content); // E.content = 文件内容
const I = A.length; // 方法数量
for (let g = 0; g < I; g++) {
const T = A[g];
if (d.command !== "CODE:COMMENT_RANGE") {
const E = (T.params || []).map((d => d.text)).join(", ");
this.sendData(d.id, {
type: "method",
data: Object.assign({}, T, {
index: g + 1,
total: I,
md5: S, // 文件内容的 MD5 哈希
markdownName: (0, W.escapeHtml)(`${g > 0 ? "\n" : ""}函数名称:${T.name}(${E})\n`)
})
});
}
}数据流:
文件内容 (E.content)
→ cryptoMd5(content)
→ MD5 哈希
→ 作为 md5 字段发送给 WebView
→ 用于标识文件版本/内容唯一性调用点 3:文件 MD5 计算(独立实现)
javascript
// 模块位置:文件工具函数
function getFileMd5(d) {
return new Promise((E) => {
const g = T.existsSync(d);
if (g) {
const g = T.createReadStream(d);
const A = S.createHash("md5");
g.on("data", (d) => A.update(d, "utf8"));
g.on("end", () => {
const d = A.digest("hex");
E(d);
});
} else {
E("");
}
});
}用途:计算文件 MD5 指纹,用于文件变更检测或去重。