Base编码

常见的Base编码分为三种:Base64、Base32、Base16

一、Base64编码

1、主要内容

Base64编码是使用64个可打印的ASCII字符(A-Z、a-z、0-9、+、/)将任意字节序列数据编码成ASCII字符串。另有"="符号用作后缀用途。

Base64编码表
数值字符数值字符数值字符数值字符
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37l531
6G22W38m542
7H23X39n553
8I24Y40o564
9J25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/

由此可见Base64是基于64个可打印字符来表示二进制数据的编解码方式。正因为是可编解码,所以它主要的作用不在于保证安全性,而在于让内容能在各个网关间无错的传输。

2、 实现原理:

将三字节变成四字节 ( 3 * 8=4 * 6)

由于64等于2的6次方,所以一个Base64字符实际上代表着6个二进制位(bit)。
然而,二进制数据1个字节(byte)对应的是8比特(bit),因此,3字节(3 x 8 = 24比特)的字符串/二进制数据正好可以转换成4个Base64字符(4 x 6 = 24比特)。
为什么是3个字节一组呢? 因为6和8的最小公倍数是24,24比特正好是3个字节。

         例:

原文wan
ASCII码11997110
二进制位011101110110000101101110
6 bit 切分011101110110000101101110
高位补全00011101001101100000010100101110
Base64编码d2Fu
 则 'wan' base64 编码后为: d2Fu

但要是遇到转换字节数不是24的倍数怎么办?

在八位转六位时,可能会有余两位或者余四位的情况,此时继续补0凑够八位时,在解码时会出现多余的位。所以为了解决这个问题,base64引入了 ' = ',一个' = '表示六个二进制位0。当补两个0时,补一个=凑够8位;补4个0时时,补两个=,凑够16位变成8的倍数。而在解码的时候,在末尾补的两个0与一个“=”相消表示一个空字符,不影响正常解码。

之所以凑成8的倍数,是因为base64主要用于加密后的数据传送,而传送中认为最小的传送单位是字节,所以总位数都是8的倍数。

则:末尾每需要补两个0时,密文需要补一个=相消。且最多会出现两个=号。

        例: 

原文SB
ASCII码8366
二进制位0101001101000010
切分-补全010100110100001000
高位补全000101000011010000001000
Base32编码U0I
则 'SB' base32 编码后为:U0I=

 3、Base64隐写原理

在对base64进行解码时,存在占位符=的情况下,会将末尾的=跟末尾加上0相消产生空字符,所以不影响原文的读取。那么通过改变末尾补全的几位比特,就会改变base64编码后文本的显示,但是并不会改变解码后原文的内容。

那么我们如何判断一个base64编码后的文本是否使用了隐写呢?

1、我们可以通过对编码进行解码,查看其末尾是否用0进行的填充。

2、我们可以使用base64编码工具进行解码,然后再编码,对比编码后的文本是否一致进行判断。如果不一致则存在base64隐写。

4、特点

  • 将二进制数据转为字符串(ASCII码),方便数据传输。

  • 浏览器能直接展示Base64编码图片,减少请求。

  • 编码后数据会大至少三分之一,需要额外的方法处理编解码。

二、Base32编码

与base64编码原理相同,不过是Base32使用了ASCII编码中可打印的32个字符(大写字母AZ和数字27)对任意字节数据进行编码.Base32将串起来的二进制数据按照5个二进制位分为一组,由于传输数据的单位是字节(即8个二进制位).所以分割之前的二进制位数是40的倍数(40是5和8的最小公倍数).

Base32编码表
数值字符数值字符数值字符数值字符
0A8I16Q24Y
1B9J17R25Z
2C10K18S262
3D11L19T273
4E12M20U284
5F13N21V295
6G14O22W306
7H15P23X317

如何使用=填充呢?

1、首先使用0补全切分后的末尾,使得补全后的二进制位数可以整除5。即可以得到得到完整的base32编码值。

2、补全后由于多了数个0,则在进行解码时需要消除增加在末尾的0,那么依旧采用=相消。每一个=代表五位二进制,与增加在末尾的0凑足能够整除8的二进制位数,目的是在解码时五位 base32编码 转换为八位 ASCII码 时不会有余位。

3、对于在末尾增加不同数的0,分为以下几种情况:
        • input的长度(bit)是5(也可以理解为40)的整数倍,不需要填充

        • 多出来1bit,需要使用4个0在末尾补全,4个0需要四个=相消。即  8 % (4+4×5)==0;

        • 多出来2bit,需要使用3个0在末尾补全,3个0需要一个=相消。即 8 % (3+1×5)==0;
        • 多出来3bit,需要使用2个0在末尾补全,2个0需要六个=相消。即 8 % (2+6×5)==0;
        • 多出来4bit,需要使用1个0在末尾补全,1个0需要三个=相消。即 8 % (1+3×5)==0;

        例:

原文SB
ASCII码8366
二进制位0101001101000010
切分-补全01010011010000100000
Base32编码KNBA
则 'SB' base16 编码后为:KNBA====

三、Base16编码 

Base16编码就是将ASCII字符集中可打印的字符(数字0~9和字母A~F)对应的二进制字节数据进行编码,编码的方式:

1.将数据(根据ASCII编码,UTF-8编码等)转成对应的二进制数,不足8比特位高位补0.然后将所有的二进制全部串起来,4个二进制位为一组,转化成对应十进制数.

2.根据十进制数值找到Base16编码表里面对应的字符.Base16是4个比特位表示一个字符,所以原始是1个字节(8个比特位)刚好可以分成两组,也就是说原先如果使用ASCII编码后的一个字符,现在转化成两个字符.数据量是原先的2倍.

Base16编码表
数值字符数值字符
0088
1199
2210A
3311B
4412C
5513D
6614E
7715F

        例:

原文SB
ASCII码8366
二进制位0101001101000010
切分-补全0101001101000010
Base16编码5342
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

打'更人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值