0.前言
Bitcoin的第一个版本已经上线,它的意义在于,展现了系统的使用场景。
1.舍弃账户模型
自从Bitcoin第一个版本(v0.0.1)上线,咖啡店的生意越来越好,老板Bob显然做了一个明智的决策。
中本聪却越来越烦恼:“这么多人来找我注册账号和兑换Bitcoin,都没时间编程了,我得想想办法。把兑换工作交给老板Bob吧。”
中本聪说:“我说,老板,现在越来越多的人来找我兑换Bitcoin,我都成了人肉交易所啦,没时间升级系统了,要不兑换的工作你来做吧。”
Bob说:“好啊,正合我意,不过我可以调整汇率吗?”
中本聪说:“当然可以。”
Bob高兴的答应了,中本聪将自己的账号密码告诉了Bob,咖啡馆就正式成为了Bitcoin的线下交易所。
中本聪感到轻松了很多:“那么,就还剩下用户注册的功能。”
中本聪一边思考着,一遍拿出笔记本准备开始编码。
忽然,有个大胆的想法在中本聪的脑子里闪过:“能不能彻底的去掉用户注册呢?”
之所以要有用户注册功能,是因为每个用户都要在user.txt中创建一条账号记录。
每个用户的账号信息只包括三个字段:用户名、密码、余额。
如果能用其他的方式来替代这三个字段,那么就可以舍弃“账户模型”了。
首先是用户名,可以用账本替代。
因为每笔交易记录都包含着付款方和收款方的用户名,所以账本(transaction.txt)可以代替账户(user.txt)定位出用户名。
其次是余额,账本也可以替代。
因为账本就是交易流水,累计交易流水可以得出用户的余额。所以账本(transaction.txt)可以替代账户(user.txt)实现余额。(具体获取余额的逻辑见下图)
获取余额的两种方式对比
解决了用户名和余额之后,最难的部分是如何去掉密码。
密码的作用是向服务端证明Alice是真正的Alice,而不是一个叫Calor的家伙的冒充,除非Calor知道了Alice的账号密码。
所以密码的本质是一把钥匙。
那么除了密码,有没有其他方式呢?
“用对称加密的方式可以吗?”中本聪思考着。
2.对称加密
对称加密是一种很常见的加密方式。
举个例子:赵四在网上发送了一段消息给谢大脚:“今天晚上11点小河边见”。但是这个消息在网上是明文,一旦被别人截获,他俩不可告人的秘密就暴露了。
对称加密就可以解决他们的担忧:赵四将消息用一种通用的加密算法加密后,明文会变成密文,密文长成这个样子:“U2FsdGVkX18tGXt20Jb/muCW7ipyKF5fTbNV9gUkJZxRIVNGk6ziokkrOXyZ8qkh”。即便被人截获,也看不懂是啥意思。
将明文和密钥作为参数,传入加密算法,计算后得到密文。
用伪公式表达为:Function加密算法(明文,密钥) = 密文
加密算法是公开的,但是密钥是保密的。赵四和谢大脚拥有内容相同的密钥,别人由于不知道密钥,就无法解密。(见下图)
加密的悄悄话
如果将赵四换成Alice,将谢大脚换成Bitcoin的服务端,Bitcoin就拥有了通信加密的能力。
密钥最初在服务端生成,在Alice第一次登陆时,将其分配给Alice,Alice收到密钥后将其存储在浏览器里。服务端还需要存储Alice和此密钥的对映关系。之后,Alice每次发送的消息,都是经过加密后的密文。服务端接受到Alice发送的密文消息,就可以用相同的密钥进行解密。(见下图)
对称加密
但是选择加密来替代密码,能解决我们的根本问题吗?
我们的最初的目的还记得是什么吗?
我们的根本目的不是舍弃密码字段,而是要舍弃账户模型,如果舍弃了密码,确引入了密钥,等于换汤不换药,账户模型还是必须存在,没有本质变化。只不过用户的“钥匙”由密码换成了密钥。
用户注册则可以看作是服务端预先给用户分配“钥匙”。(见下图)
用密钥替代密码
“可不可以让用户独立创建出‘钥匙’呢?”
中本聪再次陷入了思考之中……
“可以用非对称加密。”对面座位的‘大胡子’一字一顿的说道。
中本聪看着大胡子,他面前也放着一台笔记本:“你也是程序员吗?”
“是的”那人依旧面无表情。
中本聪热情的伸手过去:“哈,能在中途镇遇到开发者太不容易啦,你好,我叫Satoshi,你叫?“。
“Gilfoyle”,这次他眨了一下眼睛,还微微的点了一下头,估计那就是在示好吧。
这一历史性的时刻真应该被拍成照片,中途镇的两位天才程序员终于相遇了,Bitcoin在他俩的长期合作中,远远超出了同时代程序员的认知水平,最终达到了无法想象的完美高度。
3.非对称加密
中本聪:“你刚才说非对称加密可以解决我的问题?”
“是的”,Gifoyle微微点头,然后向中本聪解释起来:“你需要的并不是明文的加密,明文不怕见光,你需要的只是创建一个独特的标识来证明‘我是我’,非对称加密可以搞定。”
Gifoyle继续解释细节,中本聪听完兴奋的叫到:“就是它!”
非对称加密很神奇,它源自一个神奇的数学原理(椭圆曲线加密算法),它不像之前的对称加密,Alice和服务端需要使用同一把密钥。
这次,Alice可以靠自己,独自生成一对钥匙,一把是公开的,称为公钥(谁都可以知道)。另一把是私密的,称为私钥(只有自己知道,不能告诉别人)。(见下图)
公钥和私钥
非对称加密就好比一个神奇的箱子,手里拿着一把钥匙(私钥),可以上锁,但是却无法解锁。如果想要解锁,只能用另一把钥匙(公钥)。很反直觉吧,所以才叫“非对称”。(见下图)
对称加密VS非对称加密
正是由于这种“非对称”的特性,Alice可以用私钥将交易数据(“Alice to Bob 30″)加密,得到密文(”e2edeae7a01d226367ccb0220447d8f1dfcf14f6defb9bf”),然后将密文和公钥(明文)作为参数放入消息中,通过网络,发送给Bitcoin服务端。(消息=密文+公钥)
Bitcoin服务端收到消息,解析后得到两个部分数据:一部分为密文,另一部分为公钥(明文)。用公钥解密密文,得到明文“Alice to Bob 30”。
根据非对称加密的特性,公钥如果可以解开的密文,此密文一定是用对应的私钥加密,所以可以确定这段密文的生成者,一定就是拥有唯一私钥的Alice。
服务端将交易数据的明文写入到交易账本中,交易即刻生效!
另外,不只是Bitcoin服务端,任何人都可以用Alice发出的公钥来进行密文的解密,都可以得到相同的明文。
所以说,在Bitcoin的使用场景中,选择使用非对称加密技术,并不是为了保护明文不见光,而是为了证明“只有我可以生成这样的密文”,即,“证明我是我”。(见下图)
非对称加密在Bitcoin交易中的使用
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。