Android數據加密之Base64編碼算法

文章來源:http://www.cnblogs.com/whoislcj/p/5887859.html
前言:
前面學習總結了平時開發中遇見的各種數據加密方式,最終都會對加密后的二進制數據進行Base64編碼,起到一種二次加密的效果,其實呢Base64從嚴格意義上來說的話不是一種加密算法,而是一種編碼算法,為何要使用Base64編碼呢?它解決了什么問題?這也是本文探討的東西?
其他幾種加密方式:
Android數據加密之Rsa加密

Android數據加密之Aes加密

Android數據加密之Des加密

Android數據加密之MD5加密

Android數據加密之Base64編碼算法

Android數據加密之異或加密算法

什么Base64算法?
Base64是網絡上最常見的用于傳輸8Bit字節代碼的編碼方式之一,Base64并不是安全領域的加密算法,其實Base64只能算是一個編碼算法,對數據內容進行編碼來適合傳輸。標準Base64編碼解碼無需額外信息即完全可逆,即使你自己自定義字符集設計一種類Base64的編碼方式用于數據加密,在多數場景下也較容易破解。Base64編碼本質上是一種將二進制數據轉成文本數據的方案。對于非二進制數據,是先將其轉換成二進制形式,然后每連續6比特(2的6次方=64)計算其十進制值,根據該值在A--Z,a--z,0--9,+,/ 這64個字符中找到對應的字符,最終得到一個文本字符串。基本規則如下幾點:
標準Base64只有64個字符(英文大小寫、數字和+、/)以及用作后綴等號;
Base64是把3個字節變成4個可打印字符,所以Base64編碼后的字符串一定能被4整除(不算用作后綴的等號);
等號一定用作后綴,且數目一定是0個、1個或2個。這是因為如果原文長度不能被3整除,Base64要在后面添加\0湊齊3n位。為了正確還原,添加了幾個\0就加上幾個等號。顯然添加等號的數目只能是0、1或2;
嚴格來說Base64不能算是一種加密,只能說是編碼轉換。

下圖為Base64編碼表



Base64編碼的用處?
在計算機中任何數據都是按ascii碼存儲的,而ascii碼的128~255之間的值是不可見字符。而在網絡上交換數據時,比如說從A地傳到B地,往往要經過多個路由設備,由于不同的設備對字符的處理方式有一些不同,這樣那些不可見字符就有可能被處理錯誤,這是不利于傳輸的。所以就先把數據先做一個Base64編碼,統統變成可見字符,這樣出錯的可能性就大降低了。
Base64具體實現
1.)字符串進行Base64編碼

 String encodedString = Base64.encodeToString("whoislcj".getBytes(), Base64.DEFAULT);
 Log.e("Base64", "Base64---->" + encodedString);

2.)字符串進行Base64解碼

 String decodedString =new String(Base64.decode(encodedString,Base64.DEFAULT));
 Log.e("Base64", "Base64---->" + decodedString);

3.)對文件進行Base64編碼

File file = new File("/storage/emulated/0/pimsecure_debug.txt");
FileInputStream inputFile = null;
try {
    inputFile = new FileInputStream(file);
    byte[] buffer = new byte[(int) file.length()];
    inputFile.read(buffer);
    inputFile.close();
    encodedString = Base64.encodeToString(buffer, Base64.DEFAULT);
    Log.e("Base64", "Base64---->" + encodedString);
} catch (Exception e) {
    e.printStackTrace();
}

4.)對文件進行Base64解碼

File desFile = new File("/storage/emulated/0/pimsecure_debug_1.txt");
FileOutputStream  fos = null;
try {
    byte[] decodeBytes = Base64.decode(encodedString.getBytes(), Base64.DEFAULT);
    fos = new FileOutputStream(desFile);
    fos.write(decodeBytes);
    fos.close();
} catch (Exception e) {
    e.printStackTrace();
}

5.)針對Base64.DEFAULT參數說明

無論是編碼還是解碼都會有一個參數Flags,Android提供了以下幾種

DEFAULT 這個參數是默認,使用默認的方法來加密

NO_PADDING 這個參數是略去加密字符串最后的”=”

NO_WRAP 這個參數意思是略去所有的換行符(設置后CRLF就沒用了)

CRLF 這個參數看起來比較眼熟,它就是Win風格的換行符,意思就是使用CR LF這一對作為一行的結尾而不是Unix風格的LF

URL_SAFE 這個參數意思是加密時不使用對URL和文件名有特殊意義的字符來作為加密字符,具體就是以-和_取代+和/

總結:

 Base64編碼看似簡單,但是其在實際開發中使用相當廣泛。目前項目中只是用到這么多,以后用到更復雜的情況的時候再做補充。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容