古詩詞大全網 - 成語查詢 - Base64算法原理及實現

Base64算法原理及實現

Base64算法最開始是被用於解決電子郵件數據傳輸問題。在早期,由於歷史原因問題,電子郵件只允許使用ASCII字符,如果在郵件中出現了非ASCII字符,在通過某些網關進行數據轉發的時候,網關會對這些非ASCII字符做出調整,例如,把ASCII碼8位二進制碼的最高位置為0。此時接收方在收到郵件時就會出現亂碼。基於這個原因,產生了Base64算法。

Base64編碼的思路說白了,就是把傳輸數據的每個字節映射成ASCII碼表中的某些字符,這樣在傳輸的過程中,就不會出現亂碼的問題了。Base64算法定義了壹個映射表,如下所示。

由上表可以看出,之所以稱為Base64編碼,實際上是把原數據映射成了ASCII碼表中的64個字符。但是,64個字符最多能映射的位數是6bit。但是每個數據是8bit的,那怎麽轉換呢?Base64編碼的基本思想: 將原數據每3個字節(24bit)分為壹組,然後將這24bit數據按照每6bit壹組,重新劃分為4組,分組完成之後,再將每每6bit數據為單元進行映射。

Base64編碼的基本流程如下:

例如,將字符串"ABC"進行Base64編碼流程如下。

所以,字符串"ABC"經過Base64編碼後的數據是"QUJD"。

從Base64編碼的原理可以看到,Base64實際上就是把原來數據中的每3個字節壹組進行Base64編碼轉換,編碼之後變成4個Base64字符。但是如果原文數據長度不是3的整數倍的時候該怎麽辦呢?Base64算法規定,如果待加密數據不是3的整數倍,就在原文數據後面補0,直到長度湊夠3的整數倍為止,然後再進行Base64編碼轉換。待編碼轉換完成之後,在結果末尾補充相同個數的"="。

例如,將字符串"ABCD"進行Base64編碼流程如下。

所以,字符串"ABC"經過Base64編碼後的字符串是"QUJDRA=="。

其實這裏有個規律,當原文的數據長度除以3余數為0時,編碼之後後面沒有"=";當余數為1時,後面有兩個"=",當余數是2時,後面有壹個"=","="的個數也就是補充的字節數。

通過Base64的原理可以看到,Base64編碼實際上是把原數據的3個字節映射成了4個字節,所以相比於原數據長度,編碼後的長度會增加1/3。這也會降低傳輸效率。

Get方式和Post方式是Http請求常用的兩種方式,某些情況下會要求使用Get方式來傳遞二進制數據。這時,可以先通過Base64編碼來將二進制數據轉換成字符串數據。由於符號"+"和符號"/"是不允許出現在Url中的,所以,產生了Url安全的Base64算法,所謂的Url安全的Base64算法,其實主要包含兩個方面。

目前,在Java中,我們可以通過以下方式來是使用Base64算法。

在java8之前,JDK官方庫中都沒有內置Base64算法,其實Base64實現很簡單,這個不知道為什麽。但是Java8內置了Base64編碼器和解碼器。

在Java8中,Base64工具類提供了三種BASE64編解碼器:

1.基本Base64編碼

也就是完全按照標準Base64的映射規則來編解碼,不添加任何行標。

2.Url Base64編碼

JDK標準類庫中的Url Base64編碼是用"-"和"_"取代了"+"和"/"

3.MIME Base64編碼

Java類庫中還提供了壹種格式更友好的Base64編碼,這種編碼輸出每行不超過76字符,並且使用'\r'並跟隨'\n'作為分割。

4.去除填充符的Base64

在Java標準類庫中,還提供了壹種方式來去除編碼末尾的"=",就是在構建Encoder 對象後調用withoutPadding()方法,例如:

Commons Codec是Apache為Java開發者提供的壹個開源軟件類庫,該類庫中主要是壹些常用的編碼工具類包,例如DES、SHA1、MD5、Base64,URL等。在使用該類庫之前需要首先在Eclipse中添加依賴。Commons Codec提供了以下Base64編碼方式。

1.基本Base64編碼

Commons Codec和Java標準類庫提供給的Base64編碼方式是壹樣的。

2.Url Base64編碼

Url Base64編碼和Java類庫也是壹樣的,把"+"和"/"替換成了"-"和"_",有壹個不同的地方是Commons Codec中的Url Base64默認去掉了後面的"=",相當於Java類庫中調用了withouPadding方法,例如:

3.類MIME格式輸出

Commons Codec中也提供了類似於Java類庫中的MIME的格式化輸出,在Commons Codec中有壹個方法:

這裏的isChunked置為true,就表示是按照MIME格式輸出編碼結果。

h