见到了一题比较离谱的 base64 题目,VNCTF2022-Web-gocalc0,可能是我太菜的原因,明明 hint 告诉我,flag 在 session 里面,我却怎样都 Base64 出不来,一直说解密出错。
这题对于 Web 没有一点难度,姑且放在 MISC 分类里面。
Base16
使用字符:数字 (0 ~ 9),字母 (A ~ F)
Base16 先获取输入字符串每个字节的二进制值(不足 8bit 在高位补 0),然后将其串联进来,再按照 4bit 一组进行切分 (2^4=16)
,将每组二进制数分别转换成十进制,并对应下述编码。
即二进制转十六进制,对应下表
值 | 编码 | 值 | 编码 | 值 | 编码 | 值 | 编码 |
---|---|---|---|---|---|---|---|
0 | 0 | 4 | 4 | 8 | 8 | 12 | C |
1 | 1 | 5 | 5 | 9 | 9 | 13 | D |
2 | 2 | 6 | 6 | 10 | A | 14 | E |
3 | 3 | 7 | 7 | 11 | B | 15 | F |
Base32
使用字符:数字 (2 ~ 7),字母 (A ~ Z),填充(=)
排除了视觉上容易混淆的字符,因此可以准确的人工录入,例如 1 (I),8 (B),0 (O)
Base32 先获取输入字符串每个字节的二进制值(不足 8bit 在高位补 0),然后将其串联进来,再按照 5bit 一组进行切分 (2^5=32)
,将每组二进制数分别转换成十进制,并对应下述编码。
Base32 按 5bit 切分的二进制数据必须是 40bit 的倍数(5 和 8 的最小公倍数)
例如只用到两组共 10bit,还差 30bit 达到 40bit,按照 5bit 一组还需 6 组,则在末尾填充 6 个 "="
,但是一般来说可以省去
对应下表
值 | 编码 | 值 | 编码 | 值 | 编码 | 值 | 编码 |
---|---|---|---|---|---|---|---|
0 | A | 8 | I | 16 | Q | 24 | Y |
1 | B | 9 | J | 17 | R | 25 | Z |
2 | C | 10 | K | 18 | S | 26 | 2 |
3 | D | 11 | L | 19 | T | 27 | 3 |
4 | E | 12 | M | 20 | U | 28 | 4 |
5 | F | 13 | N | 21 | V | 29 | 5 |
6 | G | 14 | O | 22 | W | 30 | 6 |
7 | H | 15 | P | 23 | X | 31 | 7 |
填充 | = |
Base64
使用字符:数字 (0 ~ 9),字母 (A ~ Z),字母 (a ~ z),符号 (+,/),后缀 (=)
Base64 先获取输入字符串每个字节的二进制值(不足 8bit 在高位补 0),然后将其串联进来,再按照 6bit 一组进行切分 (2^6=64)
,将每组二进制数分别转换成十进制,并对应下述编码。
由于二进制数据是按照 8bit 一组进行传输,因此 Base64 按照 6bit 一组切分的二进制数据必须是 24bit 的倍数(6 和 8 的最小公倍数)
24bit 就是 3 个 byte,若原字节序列数据长度不是 3 的倍数时且剩下 1 个输入数据,则在编码结果后加 2 个 =;若剩下 2 个输入数据,则在编码结果后加 1 个 =
值 | 编码 | 值 | 编码 | 值 | 编码 | 值 | 编码 |
---|---|---|---|---|---|---|---|
0 | A | 16 | Q | 32 | g | 48 | w |
1 | B | 17 | R | 33 | h | 49 | x |
2 | C | 18 | S | 34 | i | 50 | y |
3 | D | 19 | T | 35 | j | 51 | z |
4 | E | 20 | U | 36 | k | 52 | 0 |
5 | F | 21 | V | 37 | l | 53 | 1 |
6 | G | 22 | W | 38 | m | 54 | 2 |
7 | H | 23 | X | 39 | n | 55 | 3 |
8 | I | 24 | Y | 40 | o | 56 | 4 |
9 | J | 25 | Z | 41 | p | 57 | 5 |
10 | K | 26 | a | 42 | q | 58 | 6 |
11 | L | 27 | b | 43 | r | 59 | 7 |
12 | M | 28 | c | 44 | s | 60 | 8 |
13 | N | 29 | d | 45 | t | 61 | 9 |
14 | O | 30 | e | 46 | u | 62 | + |
15 | P | 31 | f | 47 | v | 63 | / |
Base58
使用字符:数字 (除 0),大写字母 (除 O,I),小写字母 (除 l)
base58 编码相比于 base64 编码去掉了几个看起来会产生歧义的字符以及不方便选择的字符 (+,/)
因为 58 不是 2 的整次幂,所以没有使用类似 base64 编码中使用直接截取 3 个字符转 4 个字符 (2^6=64)
的方法进行转换,而是采用我们数学上经常使用的进制转换方法 —— 辗转相除法
本质上,base64 编码是 64 进制,base58 是 58 进制
值 | 编码 | 值 | 编码 | 值 | 编码 | 值 | 编码 |
---|---|---|---|---|---|---|---|
0 | 1 | 15 | G | 30 | X | 45 | n |
1 | 2 | 16 | H | 31 | Y | 46 | o |
2 | 3 | 17 | J | 32 | Z | 47 | p |
3 | 4 | 18 | K | 33 | a | 48 | q |
4 | 5 | 19 | L | 34 | b | 49 | r |
5 | 6 | 20 | M | 35 | c | 50 | s |
6 | 7 | 21 | N | 36 | d | 51 | t |
7 | 8 | 22 | P | 37 | e | 52 | u |
8 | 9 | 23 | Q | 38 | f | 53 | v |
9 | A | 24 | R | 39 | g | 54 | w |
10 | B | 25 | S | 40 | h | 55 | x |
11 | C | 26 | T | 41 | i | 56 | y |
12 | D | 27 | U | 42 | j | 57 | z |
13 | E | 28 | V | 43 | k | ||
14 | F | 29 | W | 44 | m |
Base85,91,92,100 编码
这些编码不太常用,等到什么时候见到了就来填