文/韩大楠
原文首发币乎
大家好,我是大楠呀!
这是「币圈小白进阶计划」的第十六篇,希望大家多多给出建议。
谢谢大家!
写在前面
最近大楠再看各种算法,共识写完了,也写完了加密算法,但是还有编码/解码算法......
你可知道密码学么?在此之前,我只知道栅栏加密法和凯撒密码这两种。密码学它是一种隐藏信息的科学和艺术,它们是保密的,也可以说是一种秘密消息传递的科学。
在计算机语言中,要对信息进行加密。而区块链的世界中也是样的,要对信息进行加密,保证数据安全,使之不被篡改。
而这篇文章写的只是区块链骨骼中的一部分——编码/解码算法。编码算法包括Base64、Base6458、Base58Check。
文章会写的比较硬,你可能真心看不懂,但大楠也是在探索中,有些的东西也搞得不是很明白,所以,这可以作为小白进阶资料。
编码/解码算法
计算机使用二进制进行编码,而不是我们熟悉的十进制,最重要的原因是二进制物理上更容易实现。二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。
比如说,数字2323,转化为二进制就是100100010011。但是,二进制考验人的记忆力,人们很难记住16进制的信息,如果是16进制编码的文本字符串就相对好记好读一些了。
那这里就有一张ASCII码表(其中的一部分)。
我们来看上图,07是一个Bell(响铃),如果用计算机程序去打印,结果是,只能听到一声铃声。而比特币的地址是16进制的数,不做转换,人们根本不知道那是什么。
假如,你的账户有77块钱,根据10进制的编码就是大写字符M。如果把数字77转换成文本“77”(16进制编码是3737)后再打印,那么显示在屏幕上的文本就是77。
咱们来看这个表:
Base64
Base64编码主要用在传输、存储、表示二进制等领域,还可以用来加密,但是这种加密比较简单。
用64个字符来表示任意二进制数据的方法,通常exe、jpg、pdf等文件都是二进制文件,
Base64,就是通过64个字符来编码的,具体请见下表:
Base64的编码过程:
Base64可以将ASCII字符串或者是二进制编码成只包含A—Z,a—z,0—9,+,/ 这64个字符( 26个大写字母,26个小写字母,10个数字,1个+,一个 / 刚好64个字符)。
这64个字符用6个bit位就可以全部表示出来,一个字节有8个bit 位,那么还剩下两个bit位,这两个bit位用0来补充。
一个Base64字符仍然是8个bit位,但是有效部分只有右边的6个 bit,左边两个永远是0。
Base64的编码规则是将3个8位字节(3×8=24位)编码成4个6位的字节(4×6=24位),之后在每个6位字节前面,补充两个0,形成4个8位字节的形式,那么取值范围就变成了0~63。
2的6次方等于64,所以每6个位组成一个单元。
Base58
Base58是基于58个字母和数字组成的,Base58实际上就是Base64的一个子集,相对于Base64来说,Base58不包括以下Base64的字符:
数字0
大写字母O
大写字母I
小写字母l
+与/
小写o和大写O很容易和数字0混淆,小写l和大写I很容易和数字1混淆,Base58就是Base64去除了几个看起来容易混淆的字符以及容易导致转义的/和+。
Base58的编码表如下:
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
必须注意,不同的应用实现使用的编码表内容是一样的,但是顺序可能不一样,比如:
1)比特币地址:123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
2)Ripple 地址:rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz
Ripple (一个开源、分布式的支付协议)
Base58Check
Base58Check可以说是Base58的一种编码形式,在比特币系统中生成钱包地址的时候就使用到了这种编码形式,Base58Check就是Base58加上校验码。
在二进制数据的传输过程中,为了防止数据传输的错误,保护数据安全,通常会加一个校验码。
Base58Check的编码方式是这样的:进行编码前,在待编码的内容字符串中加入一个字节的版本信息,版本信息可以自行约定。
比如比特币地址采用了0×00作为版本信息,然后再计入编码内容字符串的哈希值,通常只要取得哈希值中的4个字节就可以了,加到一起后,然后再整体进行Base58编码。
比特币地址的生成过程中,是将版本字节放在了头部,而将4个字节的哈希值放在了尾部,然后进行编码生成。
经过整理编码后的数据在传输过程中如果有发生损坏或者篡改,接收方在得到数据后,会对原始数据进行同样的校验码计算,并且和接收到的结果中的校验码进行比较。
由于哈希算法的特点,只要原始数据有任何更改,计算出的哈希值都会发生变更,因此只要校验码不一致就说明数据不是合法的。
参考资料
1、https://ke.qq.com/course/322857?taid=2781154533240105
https://baike.baidu.com/item/ASCII/309296?fromtitle=ascii%E7%A0%81%E8%A1%A8&fromid=19660475&fr=aladdin
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、参考书籍《白话区块链》、《区块链:定义未来金融和经济新格局》
写在后面
以上就是大楠的小白科普第十六篇——“区块链的骨骼”之编码算法,你要是发现了什么不对的地方,要和大楠说啊,就在评论区,留言给我啦。
感谢大家啊!
大楠是谁?
一个很偶然撞进币乎的币圈小白,是个正在不断成长的大楠。
那你喜欢她么?
当然喜欢啦,大楠欢迎来撩哦。
微信:15222567477,加大楠也要备注的呢,就叫~