How does Base64 work

English 简体中文 繁体中文 ภาษาไทย Tiếng Việt
Summary

Base64 is an encoding scheme primarily used for safely transferring arbitrary binary data, such as within HTTP headers, by converting it into a sequence of readable ASCII characters. The process involves breaking 8-bit input into 6-bit chunks, each mapped to one of 64 specific characters from a defined set. This conversion inherently increases the data size by approximately 33%. To handle incomplete blocks, Base64 utilizes padding with the '=' character, specifically ensuring 24-bit (3-byte) alignment, which is critical for maintaining data integrity during decoding, especially when concatenating encoded strings.

Base64 是一种数据编码方案,用于安全的数据传输,例如 HTTP 及其扩展。Base64 编码可以将任意字节组转换为可读的 ASCII 字符序列。这些转换后的字符可以安全地放入 HTTP 标头中,而不会在对等方处理 HTTP 标头时引起任何问题。

Base64 编码是作为 MIME 内容传输编码的一部分发明的。它类似于其他编码方案,例如 UuencodeBinHex,但效率更高。

8 位到 6 位

Base64 会将字节分成 6 位的组。每 6 位将映射到一个字符。该字符将是 Base64 字符表中的 64 个字符之一。这 64 个字符是通用的,可以安全地放入 HTTP 标头中。这些字符包括 a-z、A-Z、0-9、+、/ 和一个特殊用途字符 =(第 65 个字符)

由于 Base64 将使用一个字符来表示 6 位数据,因此 Base64 编码数据的大小将比原始数据大 33%。

下面是一个简单的 Base64 工作原理示例。假设有三个字符“Ow!”要进行 Base64 编码。

  1. 字符“Ow!”将转换为三个 8 位字节 (0x4F, 0x77, 0x21)
  2. 这 3 个字节将转换为 24 位 (01001111 01110111 00100001)
  3. 这 24 位将分为 6 位的组 (010011、110111、011100、1000001)。
  4. 每 6 位将是一个介于 0 和 63 之间的值,它将映射到上面的 64 个字符之一。编码后的最终结果是“T3ch”。

Base64 填充

Base64 将采用字节序列并将其分为 6 位的组。有时不可能将序列分成精确的 6 位组数。在这种情况下,将在序列中填充 0,使其成为精确的 24 位组数(6 和 8 的最小公倍数)。此过程称为填充。

在编码填充数据时,如果存在完全填充的 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

需要填充到 24 位而不是 6 位的原因是,它确保如果两个 Based64 编码的序列连接然后解码,则解码后的数据与原始数据相同。

例如,如果我们编码两个字符串“a.aa”和“a.aa”,如果我们只填充到 6 位,那么“a.aa”的编码字符串将是 011000 010011 101001 100001 011000 010000。现在,如果这两个编码字符串连接在一起,它将变成 010011 101001 100001 011000 010000 010011 101001 100001 011000 010000。如果解码此字符串,结果将是“01001110 10011000 01011000 01000001 00111010 01100001 01100001 0000”,并且无法正确解码。

参考:https://segmentfault.com/a/1190000004533485?_ea=647157

ALGORITHM BASE64

  RELATED

  COMMENTS

2
Jo
Nov 2, 2017 at 4:32 pm

Simple and neat! thanks

Anonymous
Jan 11, 2018 at 6:37 pm
901234-123457