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

。。。。。

 

那么BASE64是怎么解密的呢?只要你動動腦筋自己也寫一寫,一定能寫出來。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM