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...哈哈,很方便吧