[轉]Base64加密原理及代碼實現

Base64是一種加料置位加密法,那爲什麼叫base64呢?因爲無論明文是什麼(比如漢字,特殊符號等),加密後的密文都只會變成字母A-Z、a-z和0-9 和+和/這64個字符,被他加密體後積一般會變成原來的4/3。

Base64的標準在RFC2045裏的24頁可以看到。

http://wenku.baidu.com/view/bd567523aaea998fcc220e8e.html

下面我就來加密一個astralidea的簡寫AST來說明他的加密原理。

 

 

爲了說明方便,我們用人的思考方式,而不是計算機的方式,下面是上圖的說明。

1.假設有3個字符,首先先將他換成10進制ASCII碼,然後轉成2進制,少位用0補齊,保證8位。

2.因爲ASCII碼大小是一字節也就是8位,3個8位。又因爲3*8=4*6,我們給他分成4分,每份6位。如果少位都用0補齊。

3.把6位碼前2位加兩個0,比如010000轉完後就是00010000,這對計算機來說比較重要,變成了8位碼。

4.將4個8位(也就是一字節)碼按照RFC裏的BASE64標準換算,下面也提供了標準表。
這樣我們就得到了QVNU,也就是AST加密的結果。

下面是標準的BASE64編碼表。

 

 

那麼有3N個字符就是分別把3個轉成4個了,那假如有3N+1個字符怎麼辦呢?

BASE64是這樣規定的,剩下的用“=”補齊。

比如A這個字符轉後爲01000001末尾加4個0變爲010000|010000查表得QQ差2個用=補齊。

因此A加密後是QQ==,對於3N+2情況

同理AS加密後爲QVM=
這樣就有了所有情況了。

說了這麼多,我們給出實現加密的代碼,從這裏更可以看出加密過程簡潔的表達:

當然如果你用.net庫你可以直接調用

byte[] bytes=Encoding.Default.GetBytes("ConvertString");
Convert.ToBase64String(bytes);

即可。

應用:

 

1.由於BASE64可以加密任何的字符,那麼我們可以把一個小程序比如幾K的EXE文件加密,然後就可以發到網頁上,因爲BASE64標準沒有非法字符,放到任何空間都應該不會有問題。然後另一邊複製下來解密就OK了,這樣可以省得傳到網絡硬盤各種原因(比如病毒上傳失敗)之類的問題。

2.BASE64最初是考慮加密後讓你不能一眼看出明文是什麼而出現的,其最主要的應用當然是加密了,比如迅雷就是通過BASE64加料後加密而實現的。

比如我虛擬一個地址http://www.astralidea.com/down.exe

我們知道這個地址根本不存在,假設我們會了BASE64怎麼模擬迅雷的地址呢?

1.迅雷把上面地址加上料AA和ZZ變成:AAhttp://www.astralidea.com/down.exeZZ

2.把上面的字符加密得:QUFodHRwOi8vd3d3LmFzdHJhbGlkZWEuY29tL2Rvd24uZXhlWlo=

3.再前面加上thunder://得:thunder://QUFodHRwOi8vd3d3LmFzdHJhbGlkZWEuY29tL2Rvd24uZXhlWlo=

你會發現加密後的和我虛擬的是一樣的。

FLASHGET原理也是一樣,只不過加的料爲[FLASHGET]。
而QQ旋風乾脆不加料,直接就對地址進行BASE64編碼了。

3.Asp.Net裏的viewstate就是用BASE64加密所得的,如果瞭解了這個可以把他解密就能得到一個XML文件,找到key-value pairs

4.BASE64變體,上面所說的都是標準的BASE64,如果我們把加密表裏的內容替換或打亂順序就成了變異的BASE64,如Uuencode加密方法原理一樣,但是加密表不一樣。

發佈了36 篇原創文章 · 獲贊 19 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章