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加密方法原理一樣,但是加密表不一樣。
。。。。。
那么BASE64是怎么解密的呢?只要你動動腦筋自己也寫一寫,一定能寫出來。