见到了一题比较离谱的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编码
这些编码不太常用,等到什么时候见到了就来填