5

Base64 编码原来这么简单,你知道吗?

 2 years ago
source link: https://www.fly63.com/article/detial/11657
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

更新日期: 2022-06-06阅读量: 21标签: Base64分享

扫一扫分享

做了六七年程序员,经常用到 Base64 编码,但对于为什么要用,以及它的原理,一直是不求甚解。最近在某本书上看到了 Base64 的编码原理,原来这么这么这么简单。

Base64 解决了什么问题

假如我们要在网络中传输下面的问题:

你好  小朋友

我是砖家

你是谁?

这段文本中包含了空格、换行、回车等不可见字符,在网络传输中,各个设备对不可见字符处理机制可能不同,会存在信息传输错误的情况。此时我们就需要一种编码机制,把不可见字符统统转成可见字符。

Base64 编码原理

接下来我们通过将 abcd二字转为 Base64 编码,来了解下它的原理。

  • 把字符三三分组,不够时通过 0 补齐。比如abc三个字符归一组,d 不够三位,通过0 补齐为d00。

629d63bd60efe.jpg

  • 把字符转换成二进制 ASCII 编码。

629d63c1e66ed.jpg

  • 把转换后的二进制,每六位分隔开。
629d63c622805.jpg
Q:为什么第一步需要分三个字符一组?
 
A:因为 ASCII 码每个字符是 8 位二进制,3 * 8 = 24。正好可以被第三步拆分为 4 个 6 位二进制,4 * 6 = 24。
  • 6 位二进制能代表0-63,我们有一个彩虹表,可以将 0-63 分别对应一个字符,彩虹表如下:
629d63cc0f070.jpg

通过彩虹表,我们可以将每 6 位分割后的二进制做一次转换。

629d63d310304.jpg

需要注意的是,凡是补位产生的 0,需要用 = 来表示。所以最后的两位都是 =。

最后 abcd 转换为 Base64 编码后为 YWJjZA==,整体原理还是比较简单的,不涉及到高深的算法。

Base64 周边

  • 由于Base64 转码后会包含+/=字符,在 URL 不能正常传输。所以有一种 URL 友好型的 Base64 编码,它存在使用_-来代替+/,并且不在末尾追加=。
  • Base32、Base16 的原理和 Base64 基本一致。
  • Base64 并不适合加密,因为解密太简单了。
  • 汉字通过gb2312、utf-8、gbk编码后,即可转成二进制处理。这里借用网上的一个图片说明:
629d63d851bac.jpg

Base58 与 Base58Check

Base58 是比特币在生成钱包地址时使用的一种编码形式。它和 Base64 的主要区别是去掉了肉眼容易看错的字符 0(零)、O(大写字母 O)、I(大写字母 i)、l(小写字母 L)和几个影响双击选择的字符:/ 和 + 这种编码的目的比较简单,就是防止在转账时,看错账号,转错账。Base58 的原理更简单一些,只涉及到进制的转换,大致步骤如下:

  • 将字符转成 ASCII 码
  • 将 ASCII 码转换成 58 进制
  • 通过彩虹表映射即可

比如 abcd转换:

  • 转成 ASCII 码 97-98-99-100
  • 转换成 58 进制 3-28-21-49-5-22
  • 通过如下彩虹表映射为 3VNr6P
629d63df0cb9f.jpg

Base58Check 编码,顾名思义是可以对 Base58 编码进行检查。比如我在传输 qH912cvztx编码时,如果网络异常等各种原因,导致数据错乱或丢失,接收方要能够识别出来数据有问题。Base58Check 编码基本原理如下:

  • 在 data 前面添加一个版本标识 prefix,用来识别编码的数据类型,比如比特币地址的前缀是 0(十六进制是 0x00)。
  • 通过 hash 算法计算prefix + data的 hash 值:SHA256(prefix + data)。
  • 将生成的 hash 值截断为前四位,拼接到后面prefix + data + 4 位 hash。
  • 将上一步生成的结果进行 Base58 编码计算,得到最终结果。

来源: 前端技术砖家

链接: https://www.fly63.com/article/detial/11657


Recommend

  • 112
    • opsdev.cn 7 years ago
    • Cache

    对称加密和Base64编码

    对称加密和Base64编码

  • 122

    * 本文作者:艾登——皮尔斯,本文属FreeBuf原创奖励计划,未经许可禁止转载 这篇文章鄙人我主要是教大家如何加密免杀国外NjRAT生成的客户端,以达到逃避360杀软检测目的,希望各位Freebuf小粉喜欢。此文章仅用于教育目的,切勿用...

  • 91

    一.概念简介Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2^6=64,所以每6个比特为一个单元,对应某个可打印字符。3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中的...

  • 85
    • blog.51cto.com 6 years ago
    • Cache

    BASE64编码原理与Golang代码调用

    一.概念简介 Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2^6=64,所以每6个比特为一个单元,对应某个可打印字符。3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。它可用来...

  • 46
    • www.jianshu.com 6 years ago
    • Cache

    了解Base64编码解码 - 简书

  • 58
    • 微信 mp.weixin.qq.com 6 years ago
    • Cache

    base64编码原理之示例分析编码的全过程

  • 80
    • 微信 mp.weixin.qq.com 6 years ago
    • Cache

    base64 编码原理之示例分析编码的全过程

    BASE64的理论知识 BASE64是由64个基本字符组成,那么是哪64个基本字符? 在全世界通用的可见字符(62+2)组成64个字符 a~z 26个 A~Z 26个 0~9 10个...

  • 26
    • www.pengrl.com 5 years ago
    • Cache

    聊聊base64编码

    二进制的数据,每个字符的取值范围都是 [0, 255] ,作为ascii码解析时,只有部分可打印。 比如,我用文本编辑器vim打开一张jpeg图片,会发现内容是乱码。以下是头两行数据: ÿØÿà^...

  • 17
    • semlinker.com 5 years ago
    • Cache

    一文读懂Base64编码

    我们知道一个字节可表示的范围是 0 ~ 255(十六进制:0x00 ~ 0xFF), 其中 ASCII 值的范围为 0 ~ 127(十六进制:0x00 ~ 0x7F);而超过 ASCII 范围的 128~255(十六进制:0x80 ~ 0xFF)之间的值是不可见字符。 ASCII(Am...

  • 15
    • 掘金 juejin.im 5 years ago
    • Cache

    JS 简单实现UTF-8编码,Base64编码

    2020年01月30日 阅读 1754 JS 简单实现UTF-8编码,Base64编码 文章用JS简单的实现UTF-8编码和Base64编码,阅读本文...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK