文/韓大楠
原文首發(fā)幣乎
大家好侣签,我是大楠呀痢法!
這是「幣圈小白進階計劃」的第十六篇氏义,希望大家多多給出建議。
謝謝大家饺饭!
寫在前面
最近大楠再看各種算法,共識寫完了职车,也寫完了加密算法瘫俊,但是還有編碼/解碼算法......
你可知道密碼學(xué)么?在此之前提鸟,我只知道柵欄加密法和凱撒密碼這兩種军援。密碼學(xué)它是一種隱藏信息的科學(xué)和藝術(shù),它們是保密的称勋,也可以說是一種秘密消息傳遞的科學(xué)胸哥。
在計算機語言中,要對信息進行加密赡鲜。而區(qū)塊鏈的世界中也是樣的空厌,要對信息進行加密,保證數(shù)據(jù)安全银酬,使之不被篡改嘲更。
而這篇文章寫的只是區(qū)塊鏈骨骼中的一部分——編碼/解碼算法。編碼算法包括Base64揩瞪、Base6458赋朦、Base58Check。
文章會寫的比較硬李破,你可能真心看不懂宠哄,但大楠也是在探索中,有些的東西也搞得不是很明白嗤攻,所以毛嫉,這可以作為小白進階資料。
編碼/解碼算法
計算機使用二進制進行編碼妇菱,而不是我們熟悉的十進制承粤,最重要的原因是二進制物理上更容易實現(xiàn)。二進制是計算技術(shù)中廣泛采用的一種數(shù)制闯团。二進制數(shù)據(jù)是用0和1兩個數(shù)碼來表示的數(shù)辛臊。
比如說,數(shù)字2323偷俭,轉(zhuǎn)化為二進制就是100100010011浪讳。但是,二進制考驗人的記憶力涌萤,人們很難記住16進制的信息淹遵,如果是16進制編碼的文本字符串就相對好記好讀一些了口猜。
那這里就有一張ASCII碼表(其中的一部分)。
我們來看上圖透揣,07是一個Bell(響鈴)济炎,如果用計算機程序去打印,結(jié)果是辐真,只能聽到一聲鈴聲须尚。而比特幣的地址是16進制的數(shù),不做轉(zhuǎn)換侍咱,人們根本不知道那是什么耐床。
假如,你的賬戶有77塊錢楔脯,根據(jù)10進制的編碼就是大寫字符M撩轰。如果把數(shù)字77轉(zhuǎn)換成文本“77”(16進制編碼是3737)后再打印,那么顯示在屏幕上的文本就是77昧廷。
咱們來看這個表:
Base64
Base64編碼主要用在傳輸堪嫂、存儲、表示二進制等領(lǐng)域木柬,還可以用來加密皆串,但是這種加密比較簡單。
用64個字符來表示任意二進制數(shù)據(jù)的方法眉枕,通常exe恶复、jpg、pdf等文件都是二進制文件速挑,
Base64寂玲,就是通過64個字符來編碼的,具體請見下表:
Base64的編碼過程:
Base64可以將ASCII字符串或者是二進制編碼成只包含A—Z梗摇,a—z,0—9想许,+伶授,/ 這64個字符( 26個大寫字母,26個小寫字母流纹,10個數(shù)字糜烹,1個+,一個 / 剛好64個字符)漱凝。
這64個字符用6個bit位就可以全部表示出來疮蹦,一個字節(jié)有8個bit 位,那么還剩下兩個bit位茸炒,這兩個bit位用0來補充愕乎。
一個Base64字符仍然是8個bit位阵苇,但是有效部分只有右邊的6個 bit,左邊兩個永遠是0感论。
Base64的編碼規(guī)則是將3個8位字節(jié)(3×8=24位)編碼成4個6位的字節(jié)(4×6=24位)绅项,之后在每個6位字節(jié)前面,補充兩個0比肄,形成4個8位字節(jié)的形式快耿,那么取值范圍就變成了0~63。
2的6次方等于64芳绩,所以每6個位組成一個單元掀亥。
Base58
Base58是基于58個字母和數(shù)字組成的,Base58實際上就是Base64的一個子集妥色,相對于Base64來說搪花,Base58不包括以下Base64的字符:
數(shù)字0
大寫字母O
大寫字母I
小寫字母l
+與/
小寫o和大寫O很容易和數(shù)字0混淆,小寫l和大寫I很容易和數(shù)字1混淆垛膝,Base58就是Base64去除了幾個看起來容易混淆的字符以及容易導(dǎo)致轉(zhuǎn)義的/和+鳍侣。
Base58的編碼表如下:
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
必須注意,不同的應(yīng)用實現(xiàn)使用的編碼表內(nèi)容是一樣的吼拥,但是順序可能不一樣倚聚,比如:
1)比特幣地址:123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
2)Ripple 地址:rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz
Ripple (一個開源、分布式的支付協(xié)議)
Base58Check
Base58Check可以說是Base58的一種編碼形式凿可,在比特幣系統(tǒng)中生成錢包地址的時候就使用到了這種編碼形式惑折,Base58Check就是Base58加上校驗碼。
在二進制數(shù)據(jù)的傳輸過程中枯跑,為了防止數(shù)據(jù)傳輸?shù)腻e誤惨驶,保護數(shù)據(jù)安全,通常會加一個校驗碼敛助。
Base58Check的編碼方式是這樣的:進行編碼前粗卜,在待編碼的內(nèi)容字符串中加入一個字節(jié)的版本信息,版本信息可以自行約定纳击。
比如比特幣地址采用了0×00作為版本信息续扔,然后再計入編碼內(nèi)容字符串的哈希值,通常只要取得哈希值中的4個字節(jié)就可以了焕数,加到一起后纱昧,然后再整體進行Base58編碼。
比特幣地址的生成過程中堡赔,是將版本字節(jié)放在了頭部识脆,而將4個字節(jié)的哈希值放在了尾部,然后進行編碼生成。
經(jīng)過整理編碼后的數(shù)據(jù)在傳輸過程中如果有發(fā)生損壞或者篡改灼捂,接收方在得到數(shù)據(jù)后离例,會對原始數(shù)據(jù)進行同樣的校驗碼計算,并且和接收到的結(jié)果中的校驗碼進行比較纵东。
由于哈希算法的特點粘招,只要原始數(shù)據(jù)有任何更改,計算出的哈希值都會發(fā)生變更偎球,因此只要校驗碼不一致就說明數(shù)據(jù)不是合法的洒扎。
參考資料
1、https://ke.qq.com/course/322857?taid=2781154533240105
https://baike.baidu.com/item/base64/8545775?fr=aladdin
https://en.bitcoin.it/wiki/Base58Check_encoding
https://mistydew.github.io/blog/2018/05/base58-encoding.html
2衰絮、參考書籍《白話區(qū)塊鏈》袍冷、《區(qū)塊鏈:定義未來金融和經(jīng)濟新格局》
寫在后面
以上就是大楠的小白科普第十六篇——“區(qū)塊鏈的骨骼”之編碼算法,你要是發(fā)現(xiàn)了什么不對的地方猫牡,要和大楠說啊胡诗,就在評論區(qū),留言給我啦淌友。
感謝大家盎突帧!
大楠是誰震庭?
一個很偶然撞進幣乎的幣圈小白瑰抵,是個正在不斷成長的大楠。
那你喜歡她么器联?
當(dāng)然喜歡啦二汛,大楠歡迎來撩哦。
微信:15222567477拨拓,加大楠也要備注的呢肴颊,就叫簡書~