這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
base64加密是我們經常看到的一種加密方法,比如ESMTP的驗證過程和二進位檔案的網際傳輸等都會用到這種編碼。
base64的加密方法算是比較簡單的一種了,其編碼過程是將原文按照每 6bit (記住,是以'位'為單位的)為一組對原文進行替換,因為6bit 可以表示的值的範圍在0~63(2的6次方,一共64個),所以可以用一個長度為64的字元表對這 6bit 的值進行映射。
這個映射表通常是A-Z、a-z、0-9加上 + 和 / 兩個符號,即"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"。
不過,在進行加密之前,我們要先解決一個問題,那就是一個字元通常為一個位元組(byte),位元組是 8bit 的,可是加密的時候是按照每 6bit 為單位進行的,那要怎麼加密呢?
其實,base64編碼的時候是以三個位元組為一組進行的,這樣三個位元組就是 24bit ,那麼 24bit ÷ 6bit = 4(個字元),所以說,經過base64加密後,每3個字元就會被加密成4個字元。也就是說,如果按照正常情況的話,被base64加密後的原文就比原來長了3/4。
當然,這事"正常"情況下,那麼如果出現原文的長度不是3的倍數這種不正常的情況該怎麼辦呢?
如果原文的長度不夠3的整數倍,那麼就用"="號來填充。比如,如果最後剩餘1個字元,不夠3個,那麼就在密文末尾加上兩個"=",如果最後剩餘1個字元,就在密文末尾添加一個"="。
再有,就是要填充位的問題,比如如果最後剩餘了1個字元,那麼這1個字元只有 8bit,這樣將前 6bit 編碼後就只剩下 2bit了,加密就辦法再繼續下去。所以要對不足的位用0來填充,下面舉個例子就明白了:
現在要對"abcde"進行base64編碼,那麼加密完前三個字元後只剩下了"de",這兩個字元的2進位表示是
"01100100 01100101",一共16位,如果要進行base64加密,就必須再填充兩個0成為"01100100 01100101 00"。
這樣就成了6的整數倍了,可以順利完成加密。加密完後別忘了加上一個"="。
下面是實現代碼,如果有錯誤,請留言指正:
func EncodeBase64(plain string) (cipher string) {const key string = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"var (length int = len(plain)loop_time int = length / 3left int = length % 3bytes_catnate int32index int)for i := 0; i < loop_time; i++ {bytes_catnate = int32(plain[index])<<16 + int32(plain[index+1])<<8 + int32(plain[index+2])index += 3cipher += string(key[(bytes_catnate>>18)&0x3F])cipher += string(key[(bytes_catnate>>12)&0x3F])cipher += string(key[(bytes_catnate>>6)&0x3F])cipher += string(key[bytes_catnate&0x3F])}if left == 1 {bytes_catnate = int32(plain[index]) << 4cipher += string(key[(bytes_catnate>>6)&0x3F])cipher += string(key[bytes_catnate&0x3F])cipher += "=="}if left == 2 {bytes_catnate = (int32(plain[index])<<8 + int32(plain[index+1])) << 2cipher += string(key[(bytes_catnate>>12)&0x3F])cipher += string(key[(bytes_catnate>>6)&0x3F])cipher += string(key[bytes_catnate&0x3F])cipher += "="}return cipher}
如果轉載請註明出處:http://blog.csdn.net/gophers/article/details/22793357