现有的字符集非常多,常用的有ASCII、UTF-8、GBK等。ASCII编码是美国信息交换标准代码的简称,它是现今最通用的单字节编码系统,只定义了128个字符。其他的编码内容更丰富,容量也更大。
在各种信息传输渠道中并不能很好的支持所有的编码,比如在邮件传输中就不支持ASCII编码中的控制字符。连最通用的ASCII编码都不能完全支持,其他编码我们就更无法保证信息传输的完整性了。
为了保证各种信息传输渠道都能正确识别信息,Base64编码诞生了。Base64是一种用64个字符来表示任意二进制数据的方法,将二进制数据转变为64个“可打印字符”。它是一种编码方式,而非加密方式。
Base64一般用于在HTTP协议下传输二进制数据,由于HTTP协议是文本协议,所以在HTTP协议下传输二进制数据前需要将二进制数据转换为字符数据。
然而简单的直接转换是不够的,因为网络传输只能传输可打印字符。这64个字符中包括大小写字母、数字、+和/,还有用来补缺的特殊字符=(图1)。
以在VB中将ASCII编码进行Base64编码和解码为例。Base64有64个字符,2^6=64。所以用一个6位的二进制数来表示一个Base64编码表就够了。
如果有3个字节(3×8=24)共计24位的二进制数,就刚好可以用4位(4×6=24)Base64字符来表示。
ASCII编码转Base64编码流程的第一步是将ASCII编码字符串根据ASCII码对照表转换成二进制数,然后把二进制数值按每6位进行划分,然后6位二进制数转化为十进制数,然后根据对照表中找到Base64编码字符完成转码。
如果待编码字符串长度不是3的倍数怎么办呢?不是3的倍数会导致ASCII转化的二进制数串不能整除于6了,也就不能完整编码为Base64。为了让编译出的数串可以整除,就需要用0补位。如果有连续六位都是0的话,就用字符“=”来表示。
例如英文单词“Man”对应的ASCII编码值为77,97,110,通过进制转化得出24位二进制数,将24位二进制数按6个一组分成四份。然后根据Base64的编码值找出最终对应的值TWFU(图2)。
知晓了原理后,我们通过VB编程来实现ASCII编码转换Base64编码过程,首先我们创建两个Text文本框(Text1代表原始字符,Text2代表加密转换后的字符)。用txt来存储Base编码的字符集合(A-Z,a-z,0-9,+,- 64个字符)。
在Text1文本中输入原始字符Python,通过for循环提取出一个英文字符,将提取的字符通过ASCII编码方法将字符转化成数字,接下来将数字除二取余,倒叙输出排列,高位补零,转化成最终二进制的数,打印在空白区域。
由于Base64编码按每6位一组进行划分,所以根据每六位二进制数(从左往右)进行加权求和公式为(tmp=tmp*2+val(s,i,1);例如原始第一个字符为P,ASCII码值为80,转化成二进制后值为01010000,提取前六位010100,通过加权法求出二进制转十进制为20,找出txt中第20位置编码的值为U即可(txt的索引初始值为0,所以第20位其实是第21位),以此类推,Python从ASCII码转化成Base64码后值为UH10Ag9u。
小结,Base64编码是现代密码学的基础,把原本8位一组表示数据,改为6位一组表示数据,不足的部分补零,用Base64编码之后,数据长度会变长约1/3;虽然Base64可以作为简单加密算法,但是Base64能够逆运算,非常不安全。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.