base加密过程

base64 (变表)

三个字节转成四个可打印字符

1741067367608-a7ed6078-758d-4cb0-9b19-88bee3dae434.png

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

这段代码是循环处理输入数据,每3字节转换为4个字符。具体来说:

1. `v6`和`v9`分别指向输入和输出的缓冲区,每次处理3字节输入(v6 +=3),生成4字节输出(v9 +=4)。

2. 使用位操作将3个8位字节转换为4个6位索引。

3. 通过查表`aZyxabcdefghijk`将6位索引转换为对应的Base64字符。

例如,第一个字符是取第一个字节的高6位(v10 >> 2),第二个字符结合第一个字节的低2位和第二个字节的高4位,以此类推。这些都是标准Base64编码的步骤,只是字符表不同。

因此,可以确定这段do-while循环就是Base64编码的过程。用户可能希望确认这一点,并理解具体的实现细节。需要注意字符表是否被正确识别,以及是否存在其他可能的混淆点,比如变量命名或额外的操作干扰判断。

在提供的代码中,**Base64编码的核心逻辑**体现在以下代码段:

---

### **关键代码段分析(Base64编码过程)**
c

```plain
// 编码循环(处理3字节输入,生成4字节Base64输出)
do {
v10 = *(v6 - 1); // 取输入的第一个字节
v9 += 4; // 输出指针后移4字节(准备写入4个字符)
v6 += 3; // 输入指针后移3字节(处理下一个3字节组)

// 第一个字符:取第一个字节的高6位(右移2位)
*(v9 - 6) = aZyxabcdefghijk[(unsigned __int64)v10 >> 2];

// 第二个字符:第一个字节低2位(掩码0x03)左移4位 | 第二个字节高4位(右移4位)
v11 = (unsigned __int8)*(v6 - 3);
v12 = v11 & 0xF; // 保留第二个字节的低4位(后续用)
v13 = (16i64 * (v10 & 3)) | (v11 >> 4); // 组合低2位和高4位
*(v9 - 5) = aZyxabcdefghijk[v13];

// 第三个字符:第二个字节低4位左移2位 | 第三个字节高2位(右移6位)
v14 = (unsigned __int8)*(v6 - 2);
*(v9 - 4) = aZyxabcdefghijk[((unsigned __int64)v14 >> 6) | (unsigned int)(4 * v12)];

// 第四个字符:第三个字节低6位(掩码0x3F)
*(v9 - 3) = aZyxabcdefghijk[v14 & 0x3F];

--v7; // 循环控制变量
} while (v7);

代码行为解读

  1. 输入分组
    每轮循环处理 3字节输入v6 += 3),生成 4字节输出v9 += 4),符合Base64编码的 3 → 4 字节转换规则
  2. 位操作逻辑
    • 第一个输出字符:取输入的第一个字节的高6位(v10 >> 2)。
    • 第二个输出字符:组合第一个字节的低2位(v10 & 0x03)和第二个字节的高4位(v11 >> 4)。
    • 第三个输出字符:组合第二个字节的低4位(v11 & 0x0F)和第三个字节的高2位(v14 >> 6)。
    • 第四个输出字符:取第三个字节的低6位(v14 & 0x3F)。
  3. 字符映射表
    通过查表 aZyxabcdefghijk 将6位索引转换为字符,表明这是一个 自定义Base64字符表(可能与标准表顺序不同)。

验证示例

假设输入为三个字节 0x41 0x42 0x43(ASCII “ABC”),编码步骤如下:

  1. 第一个字符0x41 >> 2 = 0x10 → 查表得到字符。
  2. 第二个字符(0x41 & 0x03) << 4 | (0x42 >> 4) = 0x01 << 4 | 0x04 = 0x14 → 查表。
  3. 第三个字符(0x42 & 0x0F) << 2 | (0x43 >> 6) = 0x02 << 2 | 0x00 = 0x08 → 查表。
  4. 第四个字符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


http://example.com/2026/01/19/RE/基础/base加密过程/
Author
chaye
Posted on
January 19, 2026
Licensed under