Base64 编码原理 && 实现

查看 155|回复 11
作者:roysue   
Base64 编码原理 && 实现
在本章,我们将开启新的篇章去介绍加解密算法。在众多的商用APP中,混杂着多种算法去实现接口的参数的加密,以及各种位置的鉴权操作。即使厂商把一系列算法做了混合的使用,我们也不用去惧怕,接下来的几章中,笔者将会带领大家把这些常用的加解密算法各个击破。
万变不离其宗,不管算法如何去改变,只是形式上的改变,我们掌握其核心,让算法对我们来说不再陌生。更着笔者,让我们一起把算法打下来。
6.1 算法基本介绍
6.1.1 逆向场景中的加解密算法
在安全工程中,主要有如下几个逆向场景:
  • CTF 挑战赛
  • 爬虫
  • 安全防护

    这里,我们着重讲解爬虫和安全防护,当前主流业务都是围绕这两个方面展开,它们就好像矛与盾的关系。
    在爬虫方面,随着更多爬虫工作者的加入,很多APP的服务器被爬到宕机,以及APP内部的公民个人信息会被不法分子非法抓取。为了对抗这些操作,APP内部的防护也越来越强,最主要的表现形式就是算法的加持。那爬虫工作者想要继续爬取数据,那么破解算法并还原,就成为了必备技能。
    在安全防护端:要对抗爬虫和非法入侵的危险,在APP的业务代码开发完成后,就要对APP的核心业务逻辑上加入算法去保护相关的接口。
    6.1.2 算法的简单分类
    这里,笔者对目前市面上主流的算法做了简单的分类:
  • 常用编码

    Base16、Base32、Base64

  • 哈希算法(散列算法)
  • MD5
  • SHA-1
  • SHA-2 (SHA-224、SHA-256、SHA-384、SHA-512)

  • 对称加解密算法
  • DES
  • 3DES
  • AES


    接下来,将会对这些算法各个击破,从原理出来,带领大家去把它们用Android中实现一遍。所谓,正向的高度决定着逆向的高度。
    6.2 Base 64 基本介绍
    6.2.1 Base 64 简介
    首先,我们先介绍算法的好伴侣Base64。其中64,表示的就是使用64个常见的可打印字符来表示二进制数据的一个table,它们分别是A-Z、a-z、+、/,表的形式如图6-1所示:


    0601.png (44.47 KB, 下载次数: 0)
    下载附件
    2022-11-18 19:28 上传

    64对应的及计算方式如下:
    2^6 = 64
    ascii一个字符,是用8个bit来表示,而Base64就是使用6个bit来表示一个字符。3个字节,即24个bit,对应的就是4个Base64的字符单元,所以它们就是用3个字节来表示4个可打印的字符来表示。
    6.2.2 Base 64 使用场景
    Base64最早是应用于邮件传输协议中,在邮件传输协议中只支持ascii字符的传输。因此,如果想要传递二进制文件,如图片或者视频数据,显然是不可能实现的。那么想要传递,就要把图片或者视频数据转化成ascii字符进行传输。一直以来,最主流的编码就是ascii编码,为了适用于广泛的的编码规格。
    然而,ascii的128~255之间的值是不可见字符。而在网络上做数据交换的时候,中间要经过多个路由器,由于不同的设备,厂商的设定对字符的解码格式也是各不相同,那么这些不可见字符,就有可能被错误的处理。这就很不利于传输。
    不可见字符就是一切的关键,在很多算法中,算法对数据进行加密后,那么每个单元中的,就有可能存在不可见的字符,那么我们想要对其进行稳定的传输,就一定要使用Base64。
    6.3 Base 64 原理详解
    6.3.1 Base 64 编码原理
    在前面6.2.1简介中简单的介绍了Base64的简单计算方式,但是,对大家来说不太直观。接下来使用图的方式给大家介绍。
    在Base64编码时,每3个字节为一组,共有8bit*3=24bit的数据。那么Base64是使用6bit表示一个字节,那么24/6=4个字符。划分前后它们的表现形式如图6-2所示:


    0602.png (25.69 KB, 下载次数: 1)
    下载附件
    2022-11-18 19:28 上传

    图6-2 划分前后比对
    如果这样仍然不直观,我们举个例子,我们对cat进行编码:它的ascii编码,二进制表示,对应的Base64编码表的索引,Base64编码后的内容如图6-3所示:


    0603.png (110.73 KB, 下载次数: 0)
    下载附件
    2022-11-18 19:28 上传

    图6-3 Base64编码案例
    二进制位编码计算如图6-4所示:


    0604.png (28.09 KB, 下载次数: 0)
    下载附件
    2022-11-18 19:28 上传

    图6-4 Base64编码计算方式
    24bit的二进制数据顺次6bit一组进行10进制转换,然后再码表中根据索引得到相应的Base64字符。
    最终,cat通过Base64编码变成了Y2F0。如果待转换的字符不是3的整数倍的时候该怎么处理呢?
  • 剩余一个字符

    在只剩下一个字符的情况下,如图6-5所示:


    0605.png (35.59 KB, 下载次数: 0)
    下载附件
    2022-11-18 19:28 上传

    图6-5 只剩下一个字符
    在图中,只有一个字符c,它的二进制表现形式为
    01100011
    要进行bit拆分
    011000 11
    但是11不够6个bit,那么就要进行补0的操作,这时候要补充4个0。补充完成后,Base64编码只有两个字节为了满足4个字节,要用"="来补充。最终的编码后的字符就是YW==。我们也可以用在先的网站验证一下。验证结果如图6-6所示:


    0606.png (20.04 KB, 下载次数: 0)
    下载附件
    2022-11-18 19:28 上传

    图6-6 只剩下一个字符结果验证
  • 剩余两个字符

    如果只剩下两个字符,它的编码转换如图6-7所示:


    0607.png (38.5 KB, 下载次数: 0)
    下载附件
    2022-11-18 19:28 上传

    图6-7 只剩下两个字符
    两个字符c的二进制表示如下所示:
    01100011 01100001
    进行Base64拆分后,如下所示:
    011000 110110 0001
    这时候最后一个可表示的字符少2个bit去表示,这时候补0即可。补充完0后需要,还少一个Base64字符表示。同样,用"="号表示即可。使用在线网站验证截图如图6-8所示:


    0608.png (21.9 KB, 下载次数: 0)
    下载附件
    2022-11-18 19:28 上传

    图6-8 只剩下两个字符验证结果
    6.3.2 Base64 解码原理
    Base64的解码是编码的逆过程,当然在这个过程,引入了一个解码表,配合着去解码。接下来我们就看看怎么去解码。
    首先,先介绍下解码表,解码表如下所示:
    {
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253, 255,
    255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 253, 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, 254, 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, 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, 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, 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
    };
    解码表共有256个值,计算方式如下所示:
    2^8 = 256
    这是因为ascii的码值是用8bit来表示,而Base64编码后的值,我们仍把它看作是ascii。
    用上面编码好的案例给大家讲解。cat编码后的结果是Y2F0。
    它们的进制表示如下所示:
    [table]
    [tr]
    [td][/td]
    [td]1[/td]
    [td]2[/td]
    [td]3[/td]
    [td]4[/td]
    [/tr]
    [tr]
    [td]Base64 字符

    字符, 算法

  • zhukoov   


    silencemaker 发表于 2022-11-19 16:54
    Base64编码其实最常用的就是:不管可见还是不可见字符通通可以用可见字符来表示,可以把二进制文件base64后 ...

    该种思想是Base64编码和应用的核心了,作者讲的很清楚,您概括的很凝练. 我有些疑问,为什么选取的是64而不是其他的数字?例如128或是32?
    acecttgd   

    发现一点瑕疵:
    “在Base64编码时,每3个字节为一组,共有8bit*3=24bit的数据。那么Base64是使用6bit表示一个字节,那么24/6=4个字符。”
    这里,原文数据用的是3字节;编码后称为4字符;
    后面,原文数据突然换成【字符】
    “图6-5 只剩下一个字符”;是否指的“一个字节”?
    “图6-7 只剩下两个字符”;是否指的“二个字节”?
    虽然按前后文可以理解,但还是建议,前后统一单位。
    瑕不掩瑜,仍然感谢楼主的分享。
    CYLmtthhh   

    膜拜大佬
    ZhuanZhuYuIT   

    感谢分享
    quanjujsq   

    学到了 ~~~
    yippee   

    感谢分享
    maidangdang   

    更着笔者,让我们一起把算法打下来。
    肉师傅,有错别字哈哈
    PPNB666   

    讲得很详细,学习了
    chenran208   

    讲得很详细,学习了
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部