一段明文經過Base64加密後變得面目全非,又經過解密後恢復明文本來的面目,很有加密與解密算法的特徵。Base64不過並不是加密算法,僅僅是比較靠近加密算法。
Base64算法的由來
Base64算法主要最早用於解決電子郵件傳輸問題。在早期,由於歷史問題,電子郵件只允許傳輸ASCII碼字符。當傳輸非ASCII碼時,網關很可能將非ASCII碼的二進位位調整,即將非ASCII碼的8位二進位的最高位置0。當用戶收到郵件時,可想而知,收到的就是 一份亂碼的郵件。基於這個原因產生了Base64算法。
Base64算法的定義
Base64是一種基於64個字符的編碼算法,按照RFC2045的定義,Base64被定義為:Base64內容傳送編碼被設計用來把任意序列的8位字節描述為一種不易被人直接識別的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)。Base64編碼的思想是採用64個基本的ASCII碼字符對數據進行重新編碼。它將需要編碼的數據拆分成字節數組。以3個字節為一組。按順序排列24位數據,再把這24位數據分成4組,即每組6位。再在每組的的最高位前補兩個0湊足一個字節。這樣就把一個3位元組為一組的數據重新編碼成了4個字節。當所要編碼的數據的字節數不是3的整倍數,也就是說在分組時最後一組不夠3個字節。這時在最後一組填充1到2個0位元組。並在最後編碼完成後在結尾添加1到2個"="。
從以上編碼規則可以得知,通過Base64編碼,原來的3個字節編碼後將成為4個字節,即字節增加了33.3%。編碼後數據會比原來的數據略長,為原來的4/3倍。
在RFC2045文件中給出的字符映射表:
在這張映射表中,索引值為十進位,對應字符一共64個,這就是Base64名字的由來。映射表最後一個「=」等號字符是用來補位。
Base64算法實現原理
Base64算法主要是對給定的字符以與字符編碼(如ASCII字符,UTF-8碼)對應的十進位數為基準,做編碼操作:
將給定的字符串以字符為單位轉換為對應的字符編碼(如ASCII碼)。將獲得的字符編碼轉換為二進位碼。對獲得的二進位碼做分組轉換操作,每3個8位二進位碼為一組,轉換為每4個6位二進位碼為一組(不足6位時低位補0)。這是一個分組變化的過程,3個8位二進位碼和4個6位二進位碼的長度都是24位(3*8=4*6)。對獲得的4個6位二進位碼補位,向6位二進位碼添加2位高位0,組成4個8位二進位碼。將獲得的4個8位二進位轉換為十進位碼。將獲得的十進位碼轉換為Base64字符表中對應的字符。
ASCII碼字符編碼
字符串「A」進行Base64編碼,如下所示:
字符 AASCll 65 二進位碼 01000001 4-6二進位碼 010000 010000
4-8二進位碼 00010000 00010000
十進位碼 16 16
字符表映射碼 Q Q = =
字符串「A」經過Base64編碼後得到了「QQ==」這樣一個字符串。經過Base64編碼後的字符串未尾帶著2個等號。原因是原文的二進位碼長度不足24位,最終轉換為十進位時也不足4項,這時就需要用等號補位。經過Base64編碼後的字符串最多只會有2個等號:餘數 = 原文字節數 % 3