陳新龍
現(xiàn)有的字符集非常多,常用的有ASCII、UTF-8、GBK等。ASCII編碼是美國信息交換標(biāo)準(zhǔn)代碼的簡稱,它是現(xiàn)今最通用的單字節(jié)編碼系統(tǒng),只定義了128個字符。其他的編碼內(nèi)容更豐富,容量也更大。
在各種信息傳輸渠道中并不能很好地支持所有的編碼,比如在郵件傳輸中就不支持ASCII編碼中的控制字符。連最通用的ASCII編碼都不能完全支持,其他編碼我們就更無法保證信息傳輸?shù)耐暾粤恕?/p>
為了保證各種信息傳輸渠道都能正確識別信息,Base64編碼誕生了。Base64是一種用64個字符來表示任意二進(jìn)制數(shù)據(jù)的方法,將二進(jìn)制數(shù)據(jù)轉(zhuǎn)變?yōu)?4個“可打印字符”。它是一種編碼方式,而非加密方式。
Base64一般用于在HTTP協(xié)議下傳輸二進(jìn)制數(shù)據(jù),由于HTTP協(xié)議是文本協(xié)議,所以在HTTP協(xié)議下傳輸二進(jìn)制數(shù)據(jù)前需要將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為字符數(shù)據(jù)。
然而簡單的直接轉(zhuǎn)換是不夠的,因?yàn)榫W(wǎng)絡(luò)傳輸只能傳輸可打印字符。這64個字符中包括大小寫字母、數(shù)字、+和/,還有用來補(bǔ)缺的特殊字符=(圖1)。
以在VB中將ASCII編碼進(jìn)行Base64編碼和解碼為例。Base64有64個字符,2^6=64。所以用一個6位的二進(jìn)制數(shù)來表示一個Base64編碼表就夠了。
如果有3個字節(jié)(3×8=24)共計24位的二進(jìn)制數(shù),就剛好可以用4位(4×6=24)Base64字符來表示。
ASCII編碼轉(zhuǎn)Base64編碼流程的第一步是將ASCII編碼字符串根據(jù)ASCII碼對照表轉(zhuǎn)換成二進(jìn)制數(shù),然后把二進(jìn)制數(shù)值按每6位進(jìn)行劃分,然后將6位二進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù),然后在對照表中找到Base64編碼字符完成轉(zhuǎn)碼。
如果待編碼字符串長度不是3的倍數(shù)怎么辦呢?不是3的倍數(shù)會導(dǎo)致ASCII轉(zhuǎn)換的二進(jìn)制數(shù)串不能整除于6了,也就不能完整編碼為Base64。為了讓編譯出的數(shù)串可以整除,就需要用0補(bǔ)位。如果有連續(xù)六位都是0的話,就用字符“=”來表示。
例如英文單詞“Man”對應(yīng)的ASCII編碼值為77、97、110,通過進(jìn)制轉(zhuǎn)換得出24位二進(jìn)制數(shù),將24位二進(jìn)制數(shù)按6個一組分成四份。然后根據(jù)Base64的編碼值找出最終對應(yīng)的值TWFU(圖2)。
知曉了原理后,我們通過VB編程來實(shí)現(xiàn)ASCII編碼轉(zhuǎn)換為Base64編碼的過程,首先我們創(chuàng)建兩個Text文本框(Text1代表原始字符,Text2代表加密轉(zhuǎn)換后的字符)。用txt來存儲Base編碼的字符集合(A-Z,a-z,0-9,+,- 64個字符)。
在Text1文本中輸入原始字符Python,通過for循環(huán)提取出一個英文字符,將提取的字符通過ASCII編碼方法將字符轉(zhuǎn)換成數(shù)字,接下來將數(shù)字除以二取余,倒序輸出排列,高位補(bǔ)零,轉(zhuǎn)換成最終二進(jìn)制的數(shù),打印在空白區(qū)域。
由于Base64編碼按每6位一組進(jìn)行劃分,所以根據(jù)每六位二進(jìn)制數(shù)(從左往右)進(jìn)行加權(quán)求和公式為(tmp=tmp*2+val(s,i,1);例如原始第一個字符為P,ASCII碼值為80,轉(zhuǎn)換成二進(jìn)制后值為01010000,提取前六位010100,通過加權(quán)法求出二進(jìn)制轉(zhuǎn)十進(jìn)制為20,找出txt中第20位置編碼的值為U即可(txt的索引初始值為0,所以第20位其實(shí)是第21位),以此類推,Python從ASCII碼轉(zhuǎn)換成Base64碼后值為UH10Ag9u。
小結(jié):Base64編碼是現(xiàn)代密碼學(xué)的基礎(chǔ),把原本8位一組表示數(shù)據(jù),改為6位一組表示數(shù)據(jù),不足的部分補(bǔ)零,用Base64編碼之后,數(shù)據(jù)長度會變長約1/3;雖然Base64可以作為簡單加密算法,但是Base64能夠逆運(yùn)算,非常不安全(圖3)。