c语言将十进制转化为二进制算法_base64算法初探即逆向分析

算法分析

虽说base64严格意义上来说并不能算是加密算法,但的确应用方面来说还算是比较广,在CTF的算法逆向中Base系列算是也比较常见的,萌新刚开始学算法,就以base64为例,对该算法进行一个简单的分析。

c6d8adf27ca425cb784d97ab25b87327.png

简单来说,base64算法就是根据一个base64表,将原始字符的值一一替换。替换规则如下:

3f5a1e9391416644d458d75a384420ea.png
  1. 首先将每三个字节划分为一组,得到24个二进制位
  2. 然后将这24个二进制位划分为4组,得到4组6个二进制位的大小
  3. 在每组前面添加两个00,扩展成32个二进制位,也就是四个字节。
  4. 根据base64的表格对照替换得到base64编码
    表格如下:

c8b9a4b6d3b53d3bd249672a14fd7139.png

定义为字符串数组如下:

"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

如果需要编码的字节不能被三整除,则会多出1个或2个字节,处理方式是加上"="号,也就是平时我们看到的base64编码最后的"="或者"=="

代码实现

根据前面的算法分析,已经知道了base64具体的算法实现,接下来使用c语言实现它。
首先需要定义一个base64的字符串数组,用于替换。

62fa64c9c5d541617767da2d361065cb.png

还是回到这张图

3f5a1e9391416644d458d75a384420ea.png

首先我们需要将第一个字母G的二进制位从8位截取到6位,我能想到的最直接的方法就是直接移位,将G>>2,前面自动补0则会得到00010001,也就是索引17,对应base64的表格得到字母R,第一个字母就替换完成了。

f3662649896362a637a75fb59bb3ed4d.png

155d9ec65880c5901ce14c6fd8240fbe.png

很明显编码的第二个值是由G的最后两个二进制位和u的前面四个二进制位拼接起来的,也就是说接下来应该将这两部分组合起来。

如何得到第一个字母的最后两个字节呢,也是采用移位的方式:

首先将第一个字母左移4位得到01110000,我们这里需要取第一位的最后两位,也就是这里的第三四位。所以将01110000与0x30(十进制48,二进制00110000)得到:

a134d2202aaa64357c17154f81c84753.png

f90dfd63ecc8b8047835e79470135105.png


接下来将第二个字节的前四个二进制位拼接过来即可。

同样的,先将第二个字节右移四位以此得到需要拼接的部分。然后以类似的思路处理第三个字节。处理完毕将会得到新的四个字符。

eb10291de2a8b21150ade36f4d343e05.png

完整流程大致如下:

23cd5a802008a9a3850f426377cdd582.png

完整代码如下:

e1b55bf88ea36250e0c8c883ed63c25e.png

同理,解密函数需要四个字节一次性处理,逻辑一样。

我使用了原生的c语言实现,代码如下:

660871acf5ae2c56c422ad8f9c57a337.png

在main函数中调用:

ea5e88563be233d01a600b93d7223dc0.png

结果如下:

adce9530d37d4b63d52e39d33502ad8a.png

将结果拿到base64网页解密:

36fe1077dd68bf8992bf58ab76d61e0d.png

通过分析过程,我们可以得知base64加解密中我们可控制也最方便控制的是base64的加密表。我们修改base64的加密表即可以实现base64的变异加密,实现起来非常很简单。
将之前的base_table修改为如下:
before:

8441305ce06e340a042ec0b654e3902a.png

然后运行程序即可得到:

7bedde36c887dfc8b4ee1610b549084f.png


然后到网络上使用base64解密工具进行解密将解密失败。

本文由看雪论坛 顾何 原创

原文链接:[原创]base64算法初探即逆向分析-『密码算法』-看雪安全论坛

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值