itlgl / note

使用github的issues功能记录日常的笔记
http://itlgl.com/note
5 stars 2 forks source link

Base64、Base64Url、Base32、Base16编码算法 #12

Open itlgl opened 6 years ago

itlgl commented 6 years ago

RFC4648 介绍了 base64、base32 以及 base16编码方案,txt下载

在Guava的包中,有Base64、Base64Url、Base32、Base32Hex、Base16编码算法的实现,实现类为:com.google.common.io.BaseEncoding

Base64和BaseUrl编码原理相同,编码表略有区别。

Base 64 编码

Base 64 编码被设计为允许使用大小写字母但不需要人类可读的形式表示任意八位字节序列。使用US-ASCII的65个字符的子集,用每个可打印字符表示6位。额外的第65个字符=用于编码填充。

                     Table 1: The Base 64 Alphabet

    Value Encoding  Value Encoding  Value Encoding  Value Encoding
        0 A            17 R            34 i            51 z
        1 B            18 S            35 j            52 0
        2 C            19 T            36 k            53 1
        3 D            20 U            37 l            54 2
        4 E            21 V            38 m            55 3
        5 F            22 W            39 n            56 4
        6 G            23 X            40 o            57 5
        7 H            24 Y            41 p            58 6
        8 I            25 Z            42 q            59 7
        9 J            26 a            43 r            60 8
       10 K            27 b            44 s            61 9
       11 L            28 c            45 t            62 +
       12 M            29 d            46 u            63 /
       13 N            30 e            47 v
       14 O            31 f            48 w         (pad) =
       15 P            32 g            49 x
       16 Q            33 h            50 y

对一个被编码的字符串,从左到右,每3个8位输入组形成一个24位输入组,然后将这24位视为4个级联的6位组,每组都被转换为base64字母表中的单个字符。6位组可以表示为0-63的数字,并作为字母表的索引对应到某个字母。

对于编码结尾少于24位的数据,对结尾进行填充处理。由于所有 base64 输入都是整数个八位字节,因此只会出现以下情况:

 1) 结尾为三个字节,此时不用填充
 2) 结尾为两个字节,此时需要填充8个0形成24位,编码结果为⌈16/6⌉=3个编码位,一个"="填充位
 3) 结尾为一个字节,此时需要填充16个0以形成24位,编码结果为⌈8/6⌉=2个编码位,两个"="填充位

当然,依据应用场景的不同,可以将填充位忽略(如数据长度已知的情况下)。

Base64url 编码

该编码应该与base64编码区别对待,除非特殊说明,base64 编码通常为 Table1 中的字母表。

base64url 与 base64 在技术上等同,只是字母表中最后两个编码有所区别。

        Table 2: The "URL and Filename safe" Base 64 Alphabet

    Value Encoding  Value Encoding  Value Encoding  Value Encoding
        0 A            17 R            34 i            51 z
        1 B            18 S            35 j            52 0
        2 C            19 T            36 k            53 1
        3 D            20 U            37 l            54 2
        4 E            21 V            38 m            55 3
        5 F            22 W            39 n            56 4
        6 G            23 X            40 o            57 5
        7 H            24 Y            41 p            58 6
        8 I            25 Z            42 q            59 7
        9 J            26 a            43 r            60 8
       10 K            27 b            44 s            61 9
       11 L            28 c            45 t            62 - (minus)
       12 M            29 d            46 u            63 _
       13 N            30 e            47 v           (underline)
       14 O            31 f            48 w
       15 P            32 g            49 x
       16 Q            33 h            50 y         (pad) =

内容摘抄自:http://zhjwpku.com/rfc/2017/10/10/RFC4648-the-base16-base32-base64-data-encodings.html