陳新龍
現有的字符集非常多,常用的有ASCII、UTF-8、GBK等。ASCII編碼是美國信息交換標準代碼的簡稱,它是現今最通用的單字節編碼系統,只定義了128個字符。其他的編碼內容更豐富,容量也更大。
在各種信息傳輸渠道中并不能很好地支持所有的編碼,比如在郵件傳輸中就不支持ASCII編碼中的控制字符。連最通用的ASCII編碼都不能完全支持,其他編碼我們就更無法保證信息傳輸的完整性了。
為了保證各種信息傳輸渠道都能正確識別信息,Base64編碼誕生了。Base64是一種用64個字符來表示任意二進制數據的方法,將二進制數據轉變為64個“可打印字符”。它是一種編碼方式,而非加密方式。
Base64一般用于在HTTP協議下傳輸二進制數據,由于HTTP協議是文本協議,所以在HTTP協議下傳輸二進制數據前需要將二進制數據轉換為字符數據。
然而簡單的直接轉換是不夠的,因為網絡傳輸只能傳輸可打印字符。這64個字符中包括大小寫字母、數字、+和/,還有用來補缺的特殊字符=(圖1)。

以在VB中將ASCII編碼進行Base64編碼和解碼為例。Base64有64個字符,2^6=64。所以用一個6位的二進制數來表示一個Base64編碼表就夠了。
如果有3個字節(3×8=24)共計24位的二進制數,就剛好可以用4位(4×6=24)Base64字符來表示。
ASCII編碼轉Base64編碼流程的第一步是將ASCII編碼字符串根據ASCII碼對照表轉換成二進制數,然后把二進制數值按每6位進行劃分,然后將6位二進制數轉換為十進制數,然后在對照表中找到Base64編碼字符完成轉碼。
如果待編碼字符串長度不是3的倍數怎么辦呢?不是3的倍數會導致ASCII轉換的二進制數串不能整除于6了,也就不能完整編碼為Base64。為了讓編譯出的數串可以整除,就需要用0補位。如果有連續六位都是0的話,就用字符“=”來表示。
例如英文單詞“Man”對應的ASCII編碼值為77、97、110,通過進制轉換得出24位二進制數,將24位二進制數按6個一組分成四份。然后根據Base64的編碼值找出最終對應的值TWFU(圖2)。

知曉了原理后,我們通過VB編程來實現ASCII編碼轉換為Base64編碼的過程,首先我們創建兩個Text文本框(Text1代表原始字符,Text2代表加密轉換后的字符)。用txt來存儲Base編碼的字符集合(A-Z,a-z,0-9,+,- 64個字符)。
在Text1文本中輸入原始字符Python,通過for循環提取出一個英文字符,將提取的字符通過ASCII編碼方法將字符轉換成數字,接下來將數字除以二取余,倒序輸出排列,高位補零,轉換成最終二進制的數,打印在空白區域。
由于Base64編碼按每6位一組進行劃分,所以根據每六位二進制數(從左往右)進行加權求和公式為(tmp=tmp*2+val(s,i,1);例如原始第一個字符為P,ASCII碼值為80,轉換成二進制后值為01010000,提取前六位010100,通過加權法求出二進制轉十進制為20,找出txt中第20位置編碼的值為U即可(txt的索引初始值為0,所以第20位其實是第21位),以此類推,Python從ASCII碼轉換成Base64碼后值為UH10Ag9u。
小結:Base64編碼是現代密碼學的基礎,把原本8位一組表示數據,改為6位一組表示數據,不足的部分補零,用Base64編碼之后,數據長度會變長約1/3;雖然Base64可以作為簡單加密算法,但是Base64能夠逆運算,非常不安全(圖3)。
