base64 如何转换其字符列表中不存在的字符?

how base64 converts characters that aren't existing in its character list?

我有一个脚本,每次都生成随机编码的加密文本。为了使用 utf-8 编码将加密文本保存在数据库中,我将加密文本转换为 base64 编码。我认为它转换正确,生成的字符串可能像 ( ÷§úAû‰ñÁyˆÚªÌE).

虽然密文中有base64编码字符集(ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/)中不存在的字符,但base64编码如何转换出奇怪的密文?

参考base64编码字符列表,这里是相关联的RFC

Base64 用于将 any 二进制数据编码为有效的 ASCII。您编码的数据 而不是 必须在 Base64 字符集中(这会使整个操作变得毫无用处)。

Base64 只是获取字节1 的二进制数据字节并将这些位映射到其字符的组合中。因此,除了由字节组成之外,对输入没有其他要求。

÷§úAû‰ñÁyˆÚªÌE的情况下,会这样转换:

你说输入是 UTF-82,所以字节是 C3 B7 C2 A7 C3 BA 41 C3 BB E2 80 B0 C3 B1 C3 81 79 CB 86 C3 9A C2 AA C3 8C 45(即 UTF-8 中的 ÷§úAû‰ñÁyˆÚªÌE)。

所以取前三个字节(C3 B7 C2)并映射它们:

Byte   | C3              | B7              | C2              |
Bits   | 1 1 0 0 0 0 1 1 | 1 0 1 1 0 1 1 1 | 1 1 0 0 0 0 1 0 |
Index  | 48         | 59          | 31          | 2          |
Base64 | w          | 7           | f           | C          |

因此前四个字符是w7fC。然后重复输入的其余部分(如果输入不是三个字节的倍数,则完成一些填充,此处不涉及)。

如你所见,输入可以是任何二进制数据。


1Base64使用8位字节

2 幸运的是,UTF-8 使用 8 位代码单元。


您可以在 Wikipedia.

上阅读更多有关如何完成编码的详细信息