Golang實現的Base64加密

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.