一文看懂Base64原理(并使用java實(shí)現(xiàn))

Base64編碼解碼算是網(wǎng)絡(luò)安全領(lǐng)域的很小而且很簡(jiǎn)單的一個(gè)知識(shí)點(diǎn)了党瓮,雖然簡(jiǎn)單但是應(yīng)用場(chǎng)景卻極其廣泛萤捆,可以這樣說(shuō)叹哭,開發(fā)者要是不懂Base64谷羞,基本上可以告別程序猿生涯了帝火。這篇文章從原理入手,并給出java的Base64實(shí)現(xiàn)湃缎。方便你掌握Base64犀填。

一、Base64由來(lái)

很早之前嗓违,電子郵件剛剛問(wèn)世九巡,那時(shí)候消息的傳遞都是英文,后來(lái)中國(guó)開通了互聯(lián)網(wǎng)之后蹂季,對(duì)郵件的使用量也大量增加冕广,這時(shí)候電子郵件就有了中文的需求疏日。但是中文在傳輸?shù)臅r(shí)候不能被有效地處理,這時(shí)候Base就出來(lái)了撒汉,Base64通過(guò)對(duì)這些中文進(jìn)行編碼沟优,轉(zhuǎn)化為服務(wù)器和網(wǎng)關(guān)能夠識(shí)別的數(shù)據(jù)。這時(shí)候就能夠使用電子郵件有效地傳輸了睬辐。

上面的這個(gè)例子不是說(shuō)Base64專門為電子郵件而生的挠阁,從其誕生之初,就開始在各大領(lǐng)域有了廣泛的應(yīng)用溯饵。比如說(shuō)網(wǎng)絡(luò)上傳遞圖片侵俗,我們可以Base64先對(duì)圖片進(jìn)行處理,然后就可以有效的傳輸了丰刊。

OK隘谣,我們大致知道其用途,然后我們就好好的分析一下他的原理藻三,到底是如何對(duì)這些數(shù)據(jù)進(jìn)行編碼的洪橘。

二、Base64原理

1棵帽、Base64編碼

Base64的原理超級(jí)簡(jiǎn)單熄求,相信我們都知道ASCII 編碼,從A-Z逗概、a-z弟晚、0-9和一些其他的特殊字符,這些字符都有唯一的一個(gè)數(shù)字來(lái)表示逾苫。比如說(shuō)a是97卿城,A是65。我們來(lái)截取一部分圖看一下:

1-Ascii編碼.png

同理Base64也有這樣一套編碼铅搓。范圍是”A-Z“瑟押、”a-z“、”0-9“星掰、”+“多望、”/“一共64個(gè)字符。我們給出一個(gè)表格來(lái)看一下氢烘,這個(gè)比ASCII編碼要簡(jiǎn)單多了怀偷,只有64個(gè)。

索引 對(duì)應(yīng)字符 索引 對(duì)應(yīng)字符 索引 對(duì)應(yīng)字符 索引 對(duì)應(yīng)字符
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
15 P 32 g 49 x
16 Q 33 h 50 y

由于索引是從0開始播玖,所以最后的索引是63椎工。在編碼的時(shí)候Base64就是通過(guò)上面的進(jìn)行轉(zhuǎn)換編碼的。下面我們就來(lái)看看Base64編碼的原理。

2维蒙、基本原理

比如說(shuō)有一封郵件掰吕,我們想要對(duì)其使用Base64進(jìn)行編碼。怎么辦呢木西?基本步驟如下:

(1)對(duì)郵件的數(shù)據(jù)進(jìn)行切分畴栖,每三個(gè)字節(jié)一組,一共24個(gè)bit八千。

(2)對(duì)切分后的數(shù)據(jù)重組吗讶,24個(gè)bit重組為4組,每組6個(gè)bit恋捆。

(3)對(duì)重組后的數(shù)據(jù)處理照皆,每組最前面添加兩個(gè)“0”,構(gòu)成每組8個(gè)bit沸停。此時(shí)一共32個(gè)bit膜毁。

(4)根據(jù)Base64編碼表,獲取相應(yīng)的編碼值愤钾。

此時(shí)一封完整的郵件瘟滨,被切分重組處理之后就變成了Base64編碼了∧馨洌基本原理其實(shí)很簡(jiǎn)單杂瘸。不過(guò)你不理解也沒(méi)關(guān)系,我們直接上個(gè)實(shí)例來(lái)解釋一下伙菊。

3败玉、實(shí)例驗(yàn)證

比如說(shuō)電子郵件里面出現(xiàn)了三個(gè)字母sky。我們要對(duì)這個(gè)三個(gè)字符使用Base64進(jìn)行編碼镜硕。

(1)對(duì)郵件的數(shù)據(jù)進(jìn)行切分运翼,每三個(gè)字節(jié)一組,一共24個(gè)bit

數(shù)據(jù) s k y
ASCII編碼 115 107 121
二進(jìn)制 01110011 01101011 01111001

(2)對(duì)切分后的數(shù)據(jù)重組兴枯,24個(gè)bit重組為4組血淌,每組6個(gè)bit

2-過(guò)程2.png

(3)對(duì)重組后的數(shù)據(jù)處理,每組最前面添加兩個(gè)“0”财剖,構(gòu)成每組8個(gè)bit悠夯。由于在最前面添加的0,所以對(duì)數(shù)值不構(gòu)成影響峰伙。

(4)根據(jù)Base64編碼表疗疟,獲取相應(yīng)的編碼值

3-過(guò)程3.png

(5)完成編碼的轉(zhuǎn)換

4-過(guò)程4.png

到這我們基本上就是實(shí)現(xiàn)了Base64編碼機(jī)制從sky到c2t5的轉(zhuǎn)換该默。

有些地方需要我們?nèi)プ⒁庖幌拢?/strong>

(1)在第三步中瞳氓,最前面添加了兩個(gè)0,所以最終編碼之后要比之前多出三分之一的大小。

(2)上面的例子中匣摘,我們使用的是ASCII編碼店诗,但是如果我們使用UTF-8,對(duì)應(yīng)Base64編碼的結(jié)果是不一樣的音榜。

(3)Base64只是進(jìn)行了編碼庞瘸,方便數(shù)據(jù)的傳輸而已。這可不是加密赠叼。

原理也搞清楚了擦囊,現(xiàn)在我們就實(shí)現(xiàn)一下。

三嘴办、代碼實(shí)現(xiàn)

你可以自己去實(shí)現(xiàn)一個(gè)編碼解碼的完整過(guò)程瞬场,但是java已經(jīng)為我們封裝好了,我們直接只用別人造好的輪子多好涧郊。不管是自己寫還是使用別人的贯被,原理搞清楚就OK了。

public class Test {
    public static void main(String[] args) throws IOException {
        String str = "sky";
        //編碼
        BASE64Encoder encoder = new BASE64Encoder();
        String encoderResult=encoder.encode(str.getBytes());
        System.out.println("編碼結(jié)果為:" + encoderResult);
        //解碼
        BASE64Decoder decoder = new BASE64Decoder();
        byte[] decoderResult=decoder.decodeBuffer(encoderResult);
        System.out.println("解碼結(jié)果為:" + new String(decoderResult));
    }

}
//編碼結(jié)果為:c2t5
//解碼結(jié)果為:sky

是不是很簡(jiǎn)單妆艘。其實(shí)java實(shí)現(xiàn)的方式有很多種彤灶,其他的還有Commons Codec和Bouncy Castle。實(shí)現(xiàn)的過(guò)程和JDK提供的類似批旺,我們只需要導(dǎo)入相應(yīng)的jar包即可幌陕。

Base64算法的應(yīng)用場(chǎng)景有E-Mail、密鑰朱沃、證書文件等等苞轿。這也只是入門,想要深入了解逗物,可以看一些安全有關(guān)的書籍搬卒,不過(guò)很多都和數(shù)學(xué)有關(guān),看的實(shí)在是難受翎卓,曾經(jīng)看過(guò)契邀,可惜沒(méi)堅(jiān)持住。慚愧失暴,書到用時(shí)方恨少坯门。

OK。有問(wèn)題還請(qǐng)指正逗扒。


默認(rèn)標(biāo)題_方形二維碼_2019.08.16.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末古戴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子矩肩,更是在濱河造成了極大的恐慌现恼,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異叉袍,居然都是意外死亡始锚,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門喳逛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)瞧捌,“玉大人,你說(shuō)我怎么就攤上這事润文〗隳牛” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵典蝌,是天一觀的道長(zhǎng)皮钠。 經(jīng)常有香客問(wèn)我,道長(zhǎng)赠法,這世上最難降的妖魔是什么麦轰? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮砖织,結(jié)果婚禮上款侵,老公的妹妹穿的比我還像新娘。我一直安慰自己侧纯,他們只是感情好新锈,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著眶熬,像睡著了一般妹笆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上娜氏,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天拳缠,我揣著相機(jī)與錄音,去河邊找鬼贸弥。 笑死窟坐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绵疲。 我是一名探鬼主播哲鸳,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼盔憨!你這毒婦竟也來(lái)了徙菠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤郁岩,失蹤者是張志新(化名)和其女友劉穎婿奔,沒(méi)想到半個(gè)月后芙盘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脸秽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蝴乔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片记餐。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖薇正,靈堂內(nèi)的尸體忽然破棺而出片酝,到底是詐尸還是另有隱情,我是刑警寧澤挖腰,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布雕沿,位于F島的核電站,受9級(jí)特大地震影響猴仑,放射性物質(zhì)發(fā)生泄漏审轮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一辽俗、第九天 我趴在偏房一處隱蔽的房頂上張望疾渣。 院中可真熱鬧,春花似錦崖飘、人聲如沸榴捡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吊圾。三九已至,卻和暖如春翰蠢,著一層夾襖步出監(jiān)牢的瞬間项乒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工梁沧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留板丽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓趁尼,卻偏偏與公主長(zhǎng)得像埃碱,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子酥泞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Base64的由來(lái) 目前Base64已經(jīng)成為網(wǎng)絡(luò)上常見(jiàn)的傳輸8Bit字節(jié)代碼的編碼方式之一砚殿。在做支付系統(tǒng)時(shí),系統(tǒng)之...
    飛狗未來(lái)閱讀 398評(píng)論 0 0
  • 09/19 The second day 6:30 起床 6:55 空腹一杯白開水 6:58-7:32 健走 7:...
    示羊Sean閱讀 3,342評(píng)論 1 30
  • 我不敢打耳洞羡藐,因?yàn)橥嗟囊粋€(gè)女孩在打了耳洞之后一直都沒(méi)辦法愈合贩毕,上課的時(shí)候不時(shí)會(huì)用紙巾擦拭一下傷口流出的膿水,所以...
    很想做周太太閱讀 262評(píng)論 0 2
  • 2016年仆嗦,佳能Expo(佳能博覽會(huì))辉阶,在上海舉辦,時(shí)間為5月19日到5月22日瘩扼。 4月份的P&E —— 一個(gè)很重...
    之乎閱讀 609評(píng)論 0 0
  • 世間遇見(jiàn)谆甜,皆為注定。每個(gè)人來(lái)到這個(gè)世上集绰,都有各自的方向规辱、目的和歸宿。沒(méi)有白來(lái)的這一遭栽燕,也沒(méi)有毫無(wú)意義的經(jīng)歷和遭遇罕袋。...
    答answer案閱讀 201評(píng)論 0 0