Base64编码与解码(含C++代码)

  • Post author:
  • Post category:其他


上午做了一个逆向的题目,有一个函数看了半天没看明白,后来一查WP,才知道是BASE64解码。所以将BASE64编码与解码的过程自己整理整理。



编码原理

比如我们需要对字符串

abcd

进行BASE64编码,我们可以直接搜索一个编码网站,得出结果是

YWJjZA==

。下面我们看看具体算法是如何操作的。

首先将

abcd

转成

ASCII码

对应的二进制表示形式

a b c d
97 98 99 100
0110 0001 0110 0010 0110 0011 0110 0100

每3个字符为一组,也就是

abc

是一组,那

d

只有一个怎么办?,用

=

来代替后面两个字符就是?==(?为d转换后的字符)。

然后每一组里面继续划分

abc组
011 000 010 110 001 001 100 011

如果不足6位就在末尾添0,比如

d(0110 0100)

前6位凑满后,还剩2位,后面添0

d组
011 001 000 000 = =

转成十进制

011 000 010 110 001 001 100 011 011 001 000 000
24 22 9 35 25 0

然后查表

在这里插入图片描述
结果为

YWJjZA==



解码原理

举个例子,比如第一个编码字符为

Y

,我们可以继续查表找到

Y

对应的索引为

24

,但是计算机如何找到这个索引呢?计算机只知道

Y

对应的

ASCII码

值。这个时候需要另外一张表,

index



ASCII码

值,

value

为上一张表中字符对应的索引,如果没有相应的字符,可以用

-1

或者

255

代替。如下面代码中所用的索引表。

static uint8 reverse_map[] =
{
     255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
     255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
     255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63,
     52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255, 255, 255, 255, 255,
     255,  0,  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, 255, 255, 255, 255, 255,
     255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
     41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 255, 255, 255, 255, 255
};

然后再进行拼接,转成ASCII。



C++代码实现

代码不是我写的

转载自

c++代码



ReverseMe-120

再看这个题目,代码中给的提示是“you_know_how_to_remove_junk_code”,但是之前那个函数很复杂不知道在干什么。不过有了上述BASE64知识,可以看

byte_414E40

这个里面的数据。

在这里插入图片描述
比如我们看

3E 7F 7F 7F 3F

这段数据,是不是和

BASE64

解码表中

62, 255, 255, 255, 63

一模一样。所以就推测这个很复杂的函数实现了base64解密的功能。



版权声明:本文为wallacegen原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。