热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一文速学Base64算法及编解码方法+Python代码

目录前言一、Base64简介可打印字符二、Base64算法原理编码解码base64编码的优点:用途点关注,防走丢,如有纰漏

目录

前言

一、Base64简介

可打印字符

二、Base64算法原理

编码

解码

 base64 编码的优点:

用途

点关注,防走丢,如有纰漏之处,请留言指教,非常感谢







前言

很多网页传输协议都会采取Base64算法对数据进行加密处理,Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据,包括MIME的电子邮件及XML的一些复杂数据。因此掌握此种加解密方法应该是必须要掌握的方法。对于其算法的思想和核心处理可以产生很多衍生的算法以及加密方法。




一、Base64简介

Base64是一种二进制到文本的编码方式。如果要更具体一点的话,可以认为它是一种将 byte数组编码为字符串的方法,而且编码出的字符串只包含ASCII基础字符。所以每6个比特为一个单元,对应某个可打印字符。3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。

Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据,包括MIME的电子邮件及XML的一些复杂数据。由于HTTP协议是文本协议,所以在HTTP协议下传输二进制数据需要将二进制数据转换为字符数据。然而直接转换是不行的。因为网络传输只能传输可打印字符。


可打印字符

在ASCII码中规定,0~31、127这33个字符属于控制字符,32~126这95个字符属于可打印字符,也就是说网络传输只能传输这95个字符,不在这个范围内的字符无法传输。那么该怎么才能传输其他字符呢?其中一种方式就是使用Base64。

 

值得注意的是Base64不是加密算法,其仅仅是一种编码方式,算法也是公开的,所以不能依赖它进行加密。


二、Base64算法原理

Base64算法生成的字符串可以安全地在任何实现了Base64算法的计算机之间传输。对于非二进制数据,是先将其转换成二进制形式,然后每连续6比特(2的6次方=64)计算其十进制值,根据该值在上面的索引表中找到对应的字符,最终得到一个文本字符串。


编码

假设我们要对 Hello! 进行Base64编码,按照ASCII表,其转换过程如下图所示:

这里我们需要先将文本数据转换为二进制格式再进行base64编码:

import base64
#加密
str1="Hello!"
b=base64.b64encode(str1.encode('utf-8')).decode("utf-8")

 那么对于溢出的位数,补零处理,若是少了一组,直接用“=”代替。:

import base64
#加密
str1="Ma"
b=base64.b64encode(str1.encode('utf-8')).decode("utf-8")
b

 

 如果根本不够24位凑成一组,那么仍然使用“=”,代替:

import base64
#加密
str1="M"
b=base64.b64encode(str1.encode('utf-8')).decode("utf-8")
b

 

 基于“=”的填充机制,我们可以通过观察Base64编码的字符串最后有几个“=”来判断最后一组24位中有几个“填充字节”。


解码

解码也就是逆回来根据索引对应的二进制码解码一遍,

 

#解密
c = base64.b64decode(b.encode("utf-8")).decode("utf-8")
print("解密的结果:",c)


 base64 编码的优点:


  • 算法是编码,不是压缩,编码后只会增加字节数(一般是比之前的多1/3,比如之前是3, 编码后是4)
  • 算法简单,基本不影响效率
  • 算法可逆,解码很方便,不用于私密传输。
  • 毕竟编码了,肉眼不能直接读出原始内容。
  • 加密后的字符串只有【0-9a-zA-Z+/=】 不可打印字符(转译字符)也可以传输

用途


  • 对于证书来说,尤其是根证书,一般是 base64 编码的,在网上被很多人下载
  • 电子邮件的附件一般是 base64 编码,因为附件往往有不可见字符
  • xml 中如果像嵌入另外一个 xml 文件,直接嵌入,往往 xml 标签就乱套了, 不容易解析,因此,需要把 xml 编译成字节数组的字符串,编译成可见字符。
  • 网页中的一些小图片,可以直接以 base64 编码的方式嵌入,不用再链接请求消耗网络资源。
    外一个 xml 文件,直接嵌入,往往 xml 标签就乱套了, 不容易解析,因此,需要把 xml 编译成字节数组的字符串,编译成可见字符。
  • 网页中的一些小图片,可以直接以 base64 编码的方式嵌入,不用再链接请求消耗网络资源。
  • 较老的纯文本协议 SMTP ,这些文本偶尔传输一个文件时,需要用 base64

点关注,防走丢,如有纰漏之处,请留言指教,非常感谢

以上就是本期全部内容。我是fanstuck ,有问题大家随时留言讨论 ,我们下期见。



推荐阅读
author-avatar
傻丫丫69_678
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有