1. 程式人生 > >[轉]Base64加密原理及程式碼實現

[轉]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加密方法原理一樣,但是加密表不一樣。