1 Base64算法的由來 Base64算法最早應(yīng)用于解決電子郵件傳輸?shù)膯栴}。早期,,由于“歷史問題”,,電子郵件只允許ASCII碼字符,如果郵件中包含非ASCII碼字符,,當(dāng)它通過有“歷史問題”的網(wǎng)關(guān)時(shí),,這個(gè)網(wǎng)關(guān)會(huì)對(duì)該字符的二進(jìn)制位進(jìn)行調(diào)整,即將其8位二進(jìn)制碼的最高位置0,,這樣用戶收到的郵件就會(huì)是一封亂碼,。為了解決這個(gè)問題,,產(chǎn)生了Base64算法。
2 Base64算法的定義 RFC 2045中定義:Base64內(nèi)容傳輸編碼是一種以8位字節(jié)序列組合的描述形式,,這種形式不易被人直接識(shí)別,。 RFC 2045中規(guī)定,在電子郵件中,,每行為76個(gè)字符,,每行末需添加一個(gè)回車換行符("\r\n"),不管每行是否夠76個(gè)字符,,都要添加一個(gè)回車換行符,。不過在實(shí)際應(yīng)用中,根據(jù)實(shí)際需要,,這一要求往往被忽略,。
Base64算法的轉(zhuǎn)換方式類似于古典加密算法里的單表置換算法 。RFC 2045中給出了Base64的字符映射表,,如下圖所示,。
這張字符映射表中,Value是十進(jìn)制編碼,,Encoding是字符,,共映射了64個(gè)字符,這也是Base64算法命名的由來,。映射表的最后一個(gè)字符“=”是用來補(bǔ)位的,。 Base64算法的編碼和解碼操作可用作加密解密,但是Base64的字符映射表是公開的,,因此并不能叫做加密算法,。 Url Base64算法是由Base64算法衍生出來的,用于在http請(qǐng)求中傳遞二進(jìn)制數(shù)據(jù),。將Base64中的“+”,、“/”替換為“-”和“_”符號(hào),對(duì)于補(bǔ)位符“=”,,Bouncy Castle使用“.”替換,,而Commons Codec則不使用補(bǔ)位符。
3 基本原理 Base64算法主要是將給定的字符以字符編碼(如ASCII,、UTF-8等)對(duì)應(yīng)的十進(jìn)制數(shù)為基準(zhǔn),,做編碼操作:
經(jīng)過Base64編碼后的數(shù)據(jù)會(huì)比原始數(shù)據(jù)略長,為原來的4/3倍,,編碼后的字符數(shù)是4的倍數(shù),。 編碼后的字符串最多有2個(gè)補(bǔ)位的“=”,因?yàn)樵紨?shù)據(jù)的二進(jìn)制串的分組是以3個(gè)8位為一組的,,余數(shù) = 原始數(shù)據(jù)字節(jié)數(shù) mod 3,,余數(shù)只能為0、1,、2,。如果余數(shù)為0,3個(gè)8位轉(zhuǎn)換為4個(gè)6位,,高位補(bǔ)0之后是4個(gè)8位,,則不需要補(bǔ)位符;如果余數(shù)為1,,1個(gè)8位只能轉(zhuǎn)換為2個(gè)6位,,高位補(bǔ)0之后是2個(gè)8位,為了讓編碼之后的字符數(shù)是4的倍數(shù),,要補(bǔ)兩個(gè)補(bǔ)位符,;同理,如果余數(shù)為2,,要補(bǔ)一個(gè)補(bǔ)位符,。 ASCII碼進(jìn)行Base64編碼的例子如下圖,字符“A”編碼之后的字符串為“QQ==”,。 非ASCII碼如GBK,、UTF-8等編碼,一個(gè)字符包含多個(gè)字節(jié),,如UTF-8用3個(gè)字節(jié)表示一個(gè)漢字,,GBK用2個(gè)字節(jié)表示一個(gè)漢字。以字符串“密”為例,,對(duì)應(yīng)的UTF-8編碼是-27,、-81、-122,,用Base64編碼如下圖,,編碼后的字符串為“5a+G”,。
4 Base64算法的Java實(shí)現(xiàn)和使用 Java API中沒有Base64的實(shí)現(xiàn),實(shí)際上Sun也有Base64算法的實(shí)現(xiàn),,但是沒有公布,。Bouncy Castle提供了一般Base64算法的實(shí)現(xiàn),Commons Codec提供了基于RFC 2045相關(guān)定義的Base64算法實(shí)現(xiàn),。 Bouncy Castle遵循的是一般Base64算法,,就是根據(jù)字符映射表做了編碼轉(zhuǎn)換。Commons Codec中既支持RFC 2045定義的Base64算法,,也支持一般的Base64算法,。這兩種的差異是RFC 2045定義的算法要求在編碼后的字符串中換行和末尾添加回車換行符。
|
|