base加密过程
base64 (变表)
三个字节转成四个可打印字符

do
{
v10 = *(v6 - 1);
v9 += 4;
v6 += 3;
*(v9 - 6) = aZyxabcdefghijk[(unsigned __int64)v10 >> 2];
v11 = (unsigned __int8)*(v6 - 3);
v12 = v11 & 0xF;
v13 = (16i64 * (v10 & 3)) | (v11 >> 4);
v14 = (unsigned __int8)*(v6 - 2);
*(v9 - 5) = aZyxabcdefghijk[v13];
*(v9 - 4) = aZyxabcdefghijk[((unsigned __int64)v14 >> 6) | (unsigned int)(4 * v12)];
*(v9 - 3) = aZyxabcdefghijk[v14 & 0x3F];
–v7;
}
while ( v7 );
1 | |
代码行为解读
- 输入分组:
每轮循环处理 3字节输入(v6 += 3),生成 4字节输出(v9 += 4),符合Base64编码的 3 → 4 字节转换规则。 - 位操作逻辑:
- 第一个输出字符:取输入的第一个字节的高6位(
v10 >> 2)。 - 第二个输出字符:组合第一个字节的低2位(
v10 & 0x03)和第二个字节的高4位(v11 >> 4)。 - 第三个输出字符:组合第二个字节的低4位(
v11 & 0x0F)和第三个字节的高2位(v14 >> 6)。 - 第四个输出字符:取第三个字节的低6位(
v14 & 0x3F)。
- 第一个输出字符:取输入的第一个字节的高6位(
- 字符映射表:
通过查表aZyxabcdefghijk将6位索引转换为字符,表明这是一个 自定义Base64字符表(可能与标准表顺序不同)。
验证示例
假设输入为三个字节 0x41 0x42 0x43(ASCII “ABC”),编码步骤如下:
- 第一个字符:
0x41 >> 2 = 0x10→ 查表得到字符。 - 第二个字符:
(0x41 & 0x03) << 4 | (0x42 >> 4) = 0x01 << 4 | 0x04 = 0x14→ 查表。 - 第三个字符:
(0x42 & 0x0F) << 2 | (0x43 >> 6) = 0x02 << 2 | 0x00 = 0x08→ 查表。 - 第四个字符:
0x43 & 0x3F = 0x03→ 查表。
若字符表为 aZyxabcdefghijk,需确认其实际顺序是否与标准Base64表 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ 不同。
总结
这段代码是典型的 自定义Base64编码实现,关键特征包括:
- 3字节输入 → 4字节输出。
- 6位分段和位组合逻辑。
- 查表映射到自定义字符集
aZyxabcdefghijk。
更新: 2025-03-04 13:50:29
原文: https://www.yuque.com/chaye-apqbl/vsc85q/erqlr2pw6dvzoleu