Base 64 編碼原理簡介和python的base64模組的使用

來源:互聯網
上載者:User

     Base64編碼,首先我們應該搞清楚,為什麼裡面有個64的字樣呢?其實是因為該編碼使用64個明文來編碼任意的二進位檔案,它裡面只使用了A-Z,a-z,0-9,+,/這64個字元,有“略懂”的同學就會說了,裡面還有“=”號啊,不錯,不過等號不屬於編碼字元,而是填充字元。

    還有就是,為什麼發明這麼個編碼呢,其實這個編碼的原理是很簡單的,“破解”也很容易,電子郵件剛出來的時候,只傳遞英文字元,這沒有問題,但是後來,中國人,日本人都要發email,這樣問題就來了,因為這些字元有可能會被郵件伺服器或者網關當成命令處理,故必須得有一種編碼來對郵件進行加密,但是加密的目的是為了能夠使得一些原始的伺服器不出問題(新得牛叉伺服器已經能處理這些亂七八糟得情況了,不過因為已經形成了一套規範,所以郵件還是得經過Base64編碼才能傳遞),這樣加密必須得簡單(那搞個取反,異或加密吧,:-),還是沒解決根本問題咯),加密簡單,這樣用戶端程式加密解密也快,又要是明文Ascii編碼,這樣Base64就誕生了。當初設計人員主要是考慮了兩個問題:

1、密碼編譯演算法複雜程度和效率
2、如何處理傳輸

    Base64基本都能滿足,如果因為發一封郵件把CPU佔到100%或者把記憶體給用完了,那就完全沒必要了,編碼之後只要普通人一眼看不出內容就行了。

    下面談談Base64的編碼原理,按照RFC2045的定義,The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.我之前在網上查Base64的資料時,發現了一個很好的網站,
base64編碼線上轉換器 :http://www.motobit.com/util/base64-decoder-encoder.asp,大家對Base64感興趣的話,可以去看看。Base64編碼要求把3個8位位元組(3*8=24)轉化為4個6位的位元組(4*6=24),之後在6位的前面補兩個0,形成8位一個位元組的形式。6bit2進位能表示的最大數是2的6次方減一,剛好是64,這也是為什麼是64個字元的原因,這樣就需要一張映射表,表如下:

The Base64 Alphabet

      Value Encoding  Value Encoding  Value Encoding  Value Encoding
           0 A            17 R            34 i            51 z
           1 B            18 S            35 j            52 0
           2 C            19 T            36 k            53 1
           3 D            20 U            37 l            54 2
           4 E            21 V            38 m            55 3
           5 F            22 W            39 n            56 4
           6 G            23 X            40 o            57 5
           7 H            24 Y            41 p            58 6
           8 I            25 Z            42 q            59 7
           9 J            26 a            43 r            60 8
          10 K            27 b            44 s            61 9
          11 L            28 c            45 t            62 +
          12 M            29 d            46 u            63 /
          13 N            30 e            47 v
          14 O            31 f            48 w         (pad) =
          15 P            32 g            49 x
          16 Q            33 h            50 y

    編碼原理:將3個位元組轉換成4個位元組((3 X 8)=24=(4X6)),先讀入3個位元組,每讀一個位元組,左移8位,再右移四次,每次6位,這樣就有4個位元組了。
    解碼原理:將4個位元組轉換成3個位元組,先讀入4個6位(用或運算),每次左移6位,再右移3次,每次8位,這樣就還原了。

    Base64將3個位元組轉變為4個位元組,因此,編碼後的代碼量(以位元組為單位,下同)約比編碼前的代碼量多了1/3。如果代碼量正好是3的整數倍,那麼恰好多了1/3。但如果不是呢?這個時候“=”終於派上用場啦,當代碼量不是3的整數倍時,代碼量/3的餘數自然就是2或者1。轉換的時候,結果不夠6位的用0來補上相應的位置,之後再在6位的前面補兩個0。轉換完空出的結果就用就用“=”來補位,總之要保證最後編碼出來得位元組數是4的倍數。

    原理也說了表也給,大家可以編碼了哈……

    再說說python對Base64的支援,有個base64模組,專門幹這個事情的,大家去看看就行了,直接貼點例子代碼。

#!/usr/bin/env python# -*- coding: utf-8 -*-# utility @ Python# Functions: Base64 編解碼模組# Created By MagicTong on 2008-07-16import base64import osimport StringIO# encode,decode, encodestring,decodestring, b64encode,b64decode, urlsafe_b64decode,urlsafe_b64encode    class KBase64:    """    Base 64 編碼和解碼模組,用於對檔案,字串,URL的編解碼    對base64的簡單封裝    """        def __init__(self):        pass        def encodeFile(self, strFileName, strDecName):        """        將一個檔案的內容編碼為Base64        """                if not os.path.exists(strFileName):            return False                f1 = None        f2 = None        try:            f1 = open(strFileName, "r")            f2 = open(strDecName, "w")                    base64.encode(f1, f2)                    except Exception, e:            print e            if f1 != None:                f1.close()            if f1 != None:                f2.close()            return False                        f1.close()        f2.close()        return True        def decodeFile(self, strFileName, strDecName):        """        將一個Base64檔案的內容解碼        """                if not os.path.exists(strFileName):            return False                f1 = None        f2 = None        try:            f1 = open(strFileName, "r")            f2 = open(strDecName, "w")                    base64.decode(f1, f2)                    except Exception, e:            print e            if f1 != None:                f1.close()            if f1 != None:                f2.close()            return False                        f1.close()        f2.close()        return True        def encodeSting(self, strSrc):        """        對字串進行Base64編碼        """        try:            strDec = base64.encodestring(strSrc)        except Exception, e:            print e            return "", False                return strDec, True        def decodeSting(self, strSrc):        """        將Base64字串解碼為源字串        """        try:            strDec = base64.decodestring(strSrc)        except Exception, e:            print e            return "", False                return strDec, True    if __name__ == "__main__":    baseObj = KBase64()    print baseObj.encodeSting("a")

    python還有專門處理郵件的編解碼的email模組,更方便啊,大家先看一份郵件的源檔案:

Received: from dbmail.kingsoft.com (192.168.8.252) by mail.kingsoft.cn
 (192.168.13.1) with Microsoft SMTP Server id 8.1.240.5; Mon, 3 Mar 2008
 10:52:20 +0800
Received: from unknown (HELO linyehui) (linyehui@219.131.196.66)  by localhost
 with SMTP; 3 Mar 2008 03:08:58 -0000
From: =?gb2312?B?wdbStrvU?= <linyehui@kingsoft.com>
To: =?gb2312?B?VG9uZ0xlaSBbza/A2l0=?= <TongLei@kingsoft.com>,
 =?gb2312?B?THVIb25neWFuZyBbwr266dH0XQ==?= <LuHongyang@kingsoft.com>,
 =?gb2312?B?THVZaXdhbmcgW8Ks0ubN+l0=?= <LuYiwang@kingsoft.com>,
 =?gb2312?B?TGluWWVodWkgW8HW0ra71F0=?= <LinYehui@kingsoft.com>,
 =?gb2312?B?TGlKaWFuIFvA7r2jXQ==?= <LiJian@kingsoft.com>,
 =?gb2312?B?TGlEZWhvbmcgW8DutcK66l0=?= <LiDehong@kingsoft.com>,
 =?gb2312?B?SmlhbmdXYW5nc2hlbmcgW72qzfrJ+l0=?= <JiangWangsheng@kingsoft.com>,
 =?gb2312?B?R2VuZ1poYW9oZSBbuaLV17rYXQ==?= <GengZhaohe@kingsoft.com>,
 =?gb2312?B?RGVuZ1BlbmcgW7XLxfRd?= <DengPeng@kingsoft.com>,
 =?gb2312?B?Q2hlbmdIdWkgW7PMu9Rd?= <chenghui@kingsoft.com>,
 =?gb2312?B?Q2hlblpoaXFpYW5nIFuzwta+x79d?= <ChenZhiqiang@kingsoft.com>
Date: Mon, 3 Mar 2008 10:50:54 +0800
Subject: =?gb2312?B?W7vh0um8x8K8XTIwMDgwMzAz1ty1/LT6u+Ff0N7V/bDmsb4=?=
Thread-Topic: =?gb2312?B?W7vh0um8x8K8XTIwMDgwMzAz1ty1/LT6u+Ff0N7V/bDmsb4=?=
Thread-Index: Ach82ZpIBkzrq2yfQl2VA1yMdD4T2g==
Message-ID: <200803031050475158814@kingsoft.com>
Accept-Language: zh-CN, en-US
Content-Language: zh-CN
X-MS-Exchange-Organization-AuthAs: Anonymous
X-MS-Exchange-Organization-AuthSource: mail.kingsoft.cn
X-MS-Has-Attach:
X-MS-Exchange-Organization-SenderIdResult: PermError
X-MS-Exchange-Organization-SCL: 1
X-MS-Exchange-Organization-PCL: 2
X-MS-Exchange-Organization-PRD: kingsoft.com
X-MS-TNEF-Correlator:
x-scanvirus: By EQAVSE AntiVirus Engine
x-scanresult: CLEAN
x-mailfrom: <linyehui@kingsoft.com>
x-rcptto: <tonglei@kingsoft.com>
x-fromip: 219.131.196.66
x-eqmanager-scaned: 1
x-eqauthuser: linyehui
x-received: unknown,219.131.196.66,20080303110858
received-spf: PermError (mail.kingsoft.cn: domain of linyehui@kingsoft.com
 used an invalid SPF mechanism)
Content-Type: text/plain; charset="gb2312"
Content-Transfer-Encoding: base64
MIME-Version: 1.0

yc/W3Lmk1/fX3L3ho7oNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQ0KwdbStrvUDQqjsaGi1ti5ubXEzsi2qLmk1/cNCqOyoaLD3LGjobDR3tXV
w8WhsbCyyKu1urzTx7+5psTcsOaxvs/gudgNCqOzoaLHqNLGtPrC6w0Ko7Shote8sbi907Cy17DG
97W9sLLIq9bQ0MSjqMq1z9ZQcm94eaOpDQqzwta+x78NCqOxoaK/tLT6wusNCqOyoaLI7bz+1f3U
2tTL0NDEo7/pDQqjs6GisLLXsNTL0NC1yMSjv+m1xLLiytQNCqO0oaK199PDza/A2rXExKO/6cqx
o6zO9rm5yrGz9rTtDQqjtaGivMa7rqO6yrXP1qGhtffTw21zabXEyO28/tC21NgNCsDuvaMNCqOx
oaLKtc/WzfjVvsjP1qTR3cq+o8KjyKPPDQqjsqGita+/8s7KzOKjqLLpyv2+3cyrvsPBy7vhta+j
qQ0Ko7OhokhhbzEyM6Gi5dvTzsr9vt0oyKW19NbYuLTT0DHN8jEpDQqjtKGiTWFjZru5yqOjtM3y
tuDK/b7dw7uy6bW9o6zDu7Lptb21xNe8sbi808nP19S2r8nPsai5psTcDQrNr8DaDQqjsaGiRVhF
16qzybf+zvENCqOyoaLN6snG0K3S6crVyKFFWEUNCqOzoaLX1Mb0tq+zzNDyy9HL9w0Ko7ShorzG
u66jurDRtKu13bXEdmVjdG9ysvC31rPJw7vT0LD817C5/bXEyv2+3dTZtKu13aGjDQrA7r78DQqj
saGisNm2yLCyyKvW0NDEt6KyvA0Ko7Khornj1t2z9rLuDQqjs6GivMa7rqO6vdNpbmZvYyiy6dGv
oaLJz7GoKQ0Ko7ShorzGu66jurCyyKvW0NDEvObI3XZpc3RhDQqzzLvUDQqjsaGidHVvdHXPwtTY
xKO/6b3TyOsNCqOyoaLI7bz+udzA7bj3u/mxvrmmxNzN6rPJDQqjs6GisuLK1L27uPizwta+x78N
CqO0oaK/qrv6xvS2r727uPjNr8DaDQqjtaGisb7W3Lmk1/e7+bG+zeqzyaOsu7nT0Ly4uPZCVUcN
Cg0KDQoNCrG+1ty8xruuo7oNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQ0Ko7GhokxZSCCwssir1tDQxNPrsLLXsMb31q685LXEtPrA7aGiyOe5
+9Kqus3N+NPOus/X97XEu7C7udKqsNHW2Lm5sOaxvrXE19S2r9eisuG3/s7xtci808nPDQqjsqGi
x7bN+NKztcRFWEUNCqOzoaLN+NKzo6iworbFo6kNCqO0oaLX9tDFz6LOxLz+tcS5pL7fDQoNCg0K
MjAwOC0wMy0wMw0KwdbStrvUDQo=

    很亂是吧,不知所云,hoho,但是解碼很簡單,解碼代碼如下:

# coding=utf-8import emailfp = open("magicTong.eml", "r")msg = email.message_from_file(fp) # 直接檔案建立message對象,這個時候也會做初步的解碼subject = msg.get("subject") # 取信件頭裡的subject, 也就是主題# 下面的三行代碼只是為瞭解碼象=?gbk?Q?=CF=E0=C6=AC?=這樣的subjecth = email.Header.Header(subject)dh = email.Header.decode_header(h)subject = dh[0][0]print "subject:", subjectprint "from: ", email.utils.parseaddr(msg.get("from"))[1] # 取fromprint "to: ", email.utils.parseaddr(msg.get("to"))[1] # 取toprint "Date: ", email.utils.parsedate(msg.get("Date"))# 迴圈信件中的每一個mime的資料區塊for par in msg.walk():    if not par.is_multipart(): # 這裡要判斷是否是multipart,是的話,裡面的資料是無用的,至於為什麼可以瞭解mime相關知識。        name = par.get_param("name") #如果是附件,這裡就會取出附件的檔案名稱        if name:            #有附件            # 下面的三行代碼只是為瞭解碼象=?gbk?Q?=CF=E0=C6=AC.rar?=這樣的檔案名稱            h = email.Header.Header(name)            dh = email.Header.decode_header(h)            fname = dh[0][0]            print '附件名:', fname            data = par.get_payload(decode=True) # 解碼出附件資料,然後儲存到檔案中                        try:                f = open(fname, 'wb') #注意一定要用wb來開啟檔案,因為附件一般都是二進位檔案            except:                print '附件名有非法字元,自動換一個'                f = open('aaaa', 'wb')            f.write(data)            f.close()        else:            #不是附件,是常值內容            print par.get_payload(decode=True) # 解碼出常值內容,直接輸出來就可以了。                print '+'*60 # 用來區別各個部分的輸出        fp.close()
<這段代碼不知道是哪個老兄的啦,我很久之前從網上拷貝下來的,能用就行啦>

    假設上面那個email的名字是magicTong.eml。解碼內容如下:

subject: [會議記錄]20080303周迭代會_修正版本
from:  linyehui@kingsoft.com
to:  TongLei@kingsoft.com
Date:  (2008, 3, 3, 10, 50, 54, 0, 1, -1)
上周工作總結:

------------------------------------------------------

林葉輝

1、重構的穩定工作

2、密保“豔照門”安全島加強功能版本相關

3、遷移代碼

4、準備接安裝器到資訊安全中心(實現Proxy)

陳志強

1、看代碼

2、軟體正在運行模組

3、安裝運行等模組的測試

4、調用童磊的模組時,析構時出錯

5、計劃:實現 調用msi的軟體卸載

李劍

1、實現網站認證示範BHO

2、彈框問題(查資料太久了會彈)

3、Hao123、遨遊資料(去掉重複有1萬1)

4、Macf還剩4萬多資料沒查到,沒查到的準備加上自動上報功能

童磊

1、EXE轉成服務

2、完善協議收取EXE

3、自啟動程式搜尋

4、計劃:把傳遞的vector拆分成沒有封裝過的資料再傳遞。

李軍

1、百度資訊安全中心發布

2、廣州出差

3、計劃:接infoc(查詢、上報)

4、計劃:資訊安全中心相容vista

程輝

1、tuotu下載模組接入

2、軟體管理各準系統完成

3、測試交給陳志強

4、開機啟動交給童磊

5、本周工作基本完成,還有幾個BUG

 

 

 

本周計劃:

------------------------------------------------------

1、LYH 資訊安全中心與安裝器之間的代理、如果要和網遊合作的話還要把重構版本的自動註冊服務等加上

2、嵌網頁的EXE

3、網頁(阿杜)

4、做資訊檔的工具

 

 

2008-03-03

林葉輝

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

    o(∩_∩)o...哈哈,很方便吧

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.