加解密算法 之base64 原理

时间:2024-04-12 11:16:15

什么是base64:base64是一种常见的用于传输8Bit字节码的编码方式,是一种基于64个可打印字符来表示二进制数据的方法。

base64所用的字符为A到Z、a到z、0到9、+号符和/号符,他的索引(下标)从0开始,具体如下转换对照所示:

加解密算法 之base64 原理

base64加密方法:

 1、 首先将需要加密的明文的每个字符依次翻译为二进制的ASII码,取八位(不足八位前面填充0补充)
 2 、然后将1中所有二进制组成一串长字符串,然后再将这个字符串以每六个为一组组成几个新的二进制数;如果最后一组二进制数不足六位,则在其后面加0凑成六位(每三个8Bit的字节转换为四个6Bit的字节,空余的bit用0补上)
 3、最后将这些二进制依次转换为十进制,这些十进制对应base64转换表中的索引,根据这些索引获取对应的字符组成的字符串就是密文(密文的个数必须为4的倍数,可以将其分为每4个一组,最后一组不足4的话添加=号补充完整)
 demo:
     明文:AllenYu
     1、首先将这个明文中的每个字符转换成二进制的ASII码(通过查询本文末尾处的ASII码对照表获取)
          A -> 01000001
          l   -> 01101100
          l   -> 01101100
          e  -> 01100101
          n  -> 01101110
          Y  -> 01011001
          u  -> 01110101
     2、 由1获得字符串:01000001011011000110110001100101011011100101100101110101
          将这个字符串以每六个一组,组成新的二进制,然后再将这些二进制转换成十进制,最后以这些十进制为索引找到相应的字符
          二进制:    010000  010110  110001  101100  011001  010110  111001  011001  011101  010000(最后一组补四个0)
          十进制:    16          22          49          44         25          22          57         25          29         16
          对应字符: Q           W           x            s           Z            W          5           Z            d            Q
     3、 由2得到编码:QWxs ZW5Z dQ 每4个一组,不足四个补=号 得到最终加密后的密文QWxsZW5ZdQ==

通过以上步骤可以得出,base64之后的字符串长度要比明文 长1/3 也就是变成了 4/3 倍长度。

 

位数不足情况
上面是按照三个字节来举例说明的,如果字节数不足三个,那么该如何处理?

加解密算法 之base64 原理

如果字节不足3个,要补足到3个,然后把这三个在拆分成4个字符。

两个字节:两个字节共16个二进制位,依旧按照规则进行分组。此时总共16个二进制位,每6个一组,则第三组缺少2位,用0补齐,得到三个Base64编码,第四组完全没有数据则用“=”补上。因此,上图中“BC”转换之后为“QKM=”;
一个字节:一个字节共8个二进制位,依旧按照规则进行分组。此时共8个二进制位,每6个一组,则第二组缺少4位,用0补齐,得到两个Base64编码,而后面两组没有对应数据,都用“=”补上。因此,上图中“A”转换之后为“QQ==”;
 

 

base64解密方法:

 1、 首先将base64加密后需要进行解密的密文(如末尾的有=号,将=号删除)的每个字符通过base64转换表找到索引,然后将这些索引转换为六位的二进制数(不足六位前面补充,凑足六位)
 2、 然后将1中所有二进制组成一个字符串,将这个字符串以每8个为一组,组成几个新的二进制数;如果最后一组不足8个,则这组全部删除(字符长度取模8得到余数,末尾去除这个余数相应的个数的字符)
 3、 通过查找ASII码对照表,找到2中所有二进制所对应的字符,这些字符就是解密后的明文
 demo:
     密文:QWxsZW5ZdQ==
     1、 将结尾的两个=去除,并通过字符去编码表找到对应下标并转换为二进制(六位的)
          字符:                  Q            W          x            s            Z          W           5            Z           d           Q
          对应索引:           16           22         49          44          25         22          57          25         29         16
          索引对应二进制: 010000  010110  110001  101100  011001  010110  111001  011001  011101  010000
     2、由1得到字符串:010000010110110001101100011001010110111001011001011101010000
          每八个一组,组成多个二进制(最后一组不足八个的话,最后一组删除)
          01000001  01101100  01101100  01100101  01101110  01011001  01110101  0000
          最后一组只有四个字符,删除
          二进制:              01000001  01101100  01101100  01100101  01101110  01011001  01110101
          ASII码十进制:    65             108            108           101            110            89              117
          对应ASII码字符:A                l                 l                e                 n               Y                u
          得到最终解密明文:AllenYu
 

 

出现的原因

目前Base64已经成为网络上常见的传输8Bit字节代码的编码方式之一。在做支付系统时,系统之间的报文交互都需要使用Base64对明文进行转码,然后再进行签名或加密,之后再进行(或再次Base64)传输。那么,Base64到底起到什么作用呢?

在参数传输的过程中经常遇到的一种情况:使用全英文的没问题,但一旦涉及到中文就会出现乱码情况。与此类似,网络上传输的字符并不全是可打印的字符,比如二进制文件、图片等。Base64的出现就是为了解决此问题,它是基于64个可打印的字符来表示二进制的数据的一种方法。

电子邮件刚问世的时候,只能传输英文,但后来随着用户的增加,中文、日文等文字的用户也有需求,但这些字符并不能被服务器或网关有效处理,因此Base64就登场了。随之,Base64在URL、Cookie、网页传输少量二进制文件中也有相应的使用。