密码学入门——各类编码(二)base家族

我们接着上一节。
上一节我们讲述了ASCII编码,接下来的base系列编码与ASCII之间联系非常紧密。好,我们继续讲解。

base系列编码:
ASCII 是用128(2^8)个字符,对二进制数据进行编码的方式,
base64编码是用64(2^6)个字符,对二进制数据进行编码的方式
base32就是用32(2^5)个字符,对二进制数据进行编码的方式
base16就是用16(2^4)个字符,对二进制数据进行编码的方式

这里我们可以清楚的看到,base系列编码之间的不同,在于用于编码的字符数量的多少。

那我们如何直接区分出base16、32、64编码呢?
那可以从编码字符的数量方面入手,对于base16,用于编码的字符只有:1-9,A-F ,只有简单的15个字符。对于base32而言,编码字符有了明显改变,由base16的类型转变为了A-Z,2-7。作为base系列中最完善的base64编码,是在base32的基础上,增加了"a-z,0,1,8,9,+,/",以及特殊填充字符"="
Base-64编码将一个8位子节序列拆散为6位的片段,并为每个6位的片短分配一个字符,这个字符是Base-64字母表中的64个字符之一。

编码解码过程:
base系列编码过程都类似,所以我们用base64来说明

base64填充
base64编码收到一个8位字节序列,将这个二进制序列流划分成6位的块。二进制序列有时不能正好平均地分为6位的块,在这种情况下,就在序列末尾填充零位,使二进制序列的长度成为24的倍数(6和8的最小公倍数)。
对已填充的二进制进行编码时,任何完全填充(不包括原始数组中的位)的6位组都有特殊的第65个符号"=“表示。如果6位组是部分填充的,就将填充位设置为0.
下面会写一个填充实例。初始输入字符串为"a:a"为3个字节(24位)。24是6和8的倍数,因此按照上面给出的例子计算。无需填充就会得到base64编码为"YTph”。
然而,再增加一个字符,输入字符串变为"a:aa",转换为二进制就会有32位长。而6和8的下一个公倍数为48.因此要添加16为的填充码。填充的前4位是与数据位混合在一起的。得到的6位组01xxxx,会被当作010000、十进制中的16,或者base64编码的Q来处理。剩下的两个6位组都是填充码,用=来表示。

    a:a -- 011000 010011 101001 100001 -- YTph

    a:aa -- 011000 010011 101001 100001 011000 01xxxx xxxxxx xxxxxx -- YTphYQ==

    a:aaa -- 011000 010011 101001 100001 011000 010110 0001xx xxxxxx -- YTphYWE=

    a:aaaa -- 011000 010011 101001 100001 011000 010110 000101 1000001 -- YTphYWFh

对于base系列的编码解码,可在下面的在线网站进行解码: base16,base32,base64编码在线

下一节我们讲述Unicode编码

你可能感兴趣的:(密码学入门——各类编码(二)base家族)