查看原文
其他

ECDSA科普:大雄和静香的情人节

刘教链 刘教链 2023-03-09

题图:哆啦A梦动画片。图片来自于网络。


这是刘教链《比特币原理》番外篇。本节讲的是椭圆曲线数字签名算法ECDSA (Elliptic Curve Digital Signature Algorithm)。


一、大雄给静香邮寄比特币


2月14号,情人节。


大雄有哆啦A梦送的10个比特币。他想把这10个比特币送给静香。


比特币只能通过信件邮寄。


大雄准备了一个信封,写上静香家地址,把10个比特币装到信封里,贴上邮票,然后把信投递到邮筒里。


小镇的邮筒是完全开放式的,并没有一个中心邮局给它上锁和管理。


胖虎对大雄的10个比特币垂涎三尺,他寻机从邮筒下手,把比特币换到一个写着自己家地址的信封里。


哆啦A梦是邮递员。而且,是一个住在小镇中的本来就很聪明的邮递员。


它能在这种情况下确保比特币的寄达绝对安全可靠吗?


哆啦A梦在学校的教室外苦苦思索这个问题。


教室里,数学老师在给小学生们上数学课。


哆啦A梦忽然灵感出现,设计了一种特别的邮票。


二、哆啦A梦的邮票


哆啦A梦发现了小镇学校的一个惊天秘密。


这个秘密就是,数学老师只教加法、减法和乘法。


所有人也都只会做加法、减法和乘法。


哆啦A梦设计了一种特别的邮票。这种邮票需要寄信人写几个数字。而多拉A梦在送信的时候会先检查邮票,验算数字,如果不正确,它就退回这封邮件。


邮票是这么设计的:


首先,全国的小镇都有自己唯一的数字编号,大雄他们这个小镇编号是9。这个数字整个小镇都公开知道。


然后,每个人都选一个自己喜欢的秘密数字。每人各不相同,而且大家都互相猜不到对方的秘密数字。大雄选的秘密数字是3。


另外,小镇的每户人家都有一个门牌号作为地址。门牌号是用秘密数字乘以幸运数字计算出来的。大雄家门牌号是大雄的秘密数字3乘以幸运数字9等于27。静香家门牌号是45。


当大雄准备寄信给静香的时候,先随机另选一个秘密的幸运数字,别人绝对猜不到,比如大雄选了10。


然后大雄计算两个数字:


(1)用幸运数字10乘以小镇编号9得到前一个数字90。

(2)用前一个数字90乘以大雄的秘密数字3得到270,然后再加上静香家的门牌号45,得到后一个数字315。


最后,大雄把90和315前后两个数字写到邮票上,就可以了。


三、哆啦A梦的验算


当哆啦A梦送信的时候,就可以用算数来验算这个邮票是不是大雄贴的,而且寄送对象就是静香。


它同样算两个数字:


(1)用邮票上的后一个数字315乘以小镇编号9,得到第一个结果2835。

(2)用邮票上的前一个数字90乘以大雄家门牌号27得到2430,再用静香家门牌号45乘以小镇编号9得到405,最后把两个数字加起来,也就是2430加上405,得到第二个结果2835。


Bingo!两个结果一样。验证通过!恭喜大雄,邮件将被准确送达静香家。


亲爱的读者,您看到哆啦A梦这个邮票算法的精妙之处了吗?


哆啦A梦验算所使用的全部都只是公开信息,小镇编号9,大雄家门牌号27,静香家门牌号45,邮票上的两个数字90和315。


而大雄计算时所选的两个秘密数字完全不需要公开,这样就保证了,除了大雄,没有人可以伪造邮票。


四、胖虎的作弊


有了这个邮票的设计,胖虎就没有办法把邮件发往自己家的地址了。因为他不知道大雄的秘密数字,也就没有办法在邮票上写下正确的结果。


如果胖虎强行用自己的秘密数字来计算,会怎样呢?


胖虎自己的秘密数字是4,他家门牌号是36。


前一个数字,他直接抄袭了大雄的结果90。

然后他用前一个数字90乘以他自己的秘密数字4得到360,然后再加上自己家的门牌号36,得到后一个数字396。


他把这两个数字写到邮票上。


那么他的邮票能够通过哆啦A梦的验算吗?


哆啦A梦拿到邮件,先计算邮票的后一个数字396乘以小镇编号9,得到3564。

然后哆啦A梦用邮票的前一个数字90乘以大雄家门牌号27得到2430,再用静香家门牌号45乘以小镇编号9得到405,最后把两个数字加起来,也就是2430加上405,得到2835。


3564不等于2835。两个结果不相等!邮票无效!


Perfect! 哆啦A梦高兴地笑了起来。


等等!聪明的读者,你可能已经发现了一个致命漏洞:如果胖虎把寄件人也改成自己会怎么样呢?


那么哆啦A梦验算的时候,就会计算邮票的前一个数字90乘以胖虎家门牌号36,加上胖虎家门牌号36乘以小镇数字9,结果是同样的3564!


虽说胖虎把邮件发送给胖虎自己这件事看起来有点奇怪,可是既然数字验算通过,哆啦A梦也不得不遵照送达。


怎么办?于是哆啦A梦想到了一个办法:记账。


五、哆啦A梦的账本


哆啦A梦找了一个小本本。


每次它成功送达信件的时候,就把这次投递的比特币标上一个批次,然后把这个批次和投递记录记在小本本上。比如,第1829次投递,来自第278次投递的比特币,已送达给大雄。


这样一来,致命漏洞就堵住了。因为只要一查小本本,就知道这10个比特币上次是送到大雄家的。那么这一次寄送这10个比特币,寄件人只能是大雄,而不可能是胖虎。


胖虎也不能抹去或伪造这10个比特币的批次,因为没有批次或者批次伪造的比特币,哆啦A梦一查小本本就会发现根本不是胖虎的,并拒绝递送。


六、为什么秘密数字别人猜不到


第一个问题:大雄所选的秘密数字3和秘密的幸运数字10会不会很容易被胖虎“暴力穷举”尝试出来呢?


如果数字是这么小的话,的确有被“猜到“的可能性。


解决方法也特别简单,就是选择特别特别特别巨大的数字,巨大到超出想象。从0到2的256次方中间随机选择一个整数,另外一个人用100万年的时间能够“猜到”的可能性比你看完这句话地球马上毁灭的可能性还要低。


七、为什么我们都不会做除法


第二个问题:为什么我们都不会做除法呢?


为了向亲爱的读者朋友说明这个问题,笔者特别准备了这道“小学奥数题”:


下图中,苹果、香蕉、菠萝是三个正整数,请问它们分别是什么数字?


试试看?体验一下“除法”的难度。


是的,如你所料,这货就是一个如假包换的椭圆曲线方程。也就是说,它可以变换成这种形式的方程:


加法是这么算的(红色就是椭圆曲线的样子——换了一条容易作图的):


乘法是连加:k乘以P就等于k个P相加。


至于除法嘛。假设k乘以P等于T,告诉你P和T,请计算k。虽然你明知道k就等于T除以P,但就是算不出来。


八、椭圆曲线数字签名(邮票)算法


比特币用了一条在中本聪之前鲜有人用的椭圆曲线secp256k1生成“邮票”:


它在实数域长这个样子:


但是,其实它是定义在所谓的模素数上的,一下子就毁容成大概这个鬼样子了:


而大家常用的则是由美国国家标准和技术研究院NIST和美国国家安全局NSA联袂推荐的、1994年12月纳入标准的secp256r1。


2007年11月15日,美国知名IT杂志《连线》发表了对于NSA标准的质疑文章。


2013年6月,前美国中央情报局(CIA)职员、美国国家安全局(NSA)外包技术员爱德华·约瑟夫·斯诺登(Edward Joseph Snowden, 1983-)出逃。


(全文完)

欢迎垂询刘教链比特币原理课程和区块链线下培训,扫码加rose老师备注“培训”:

亲爱的读者朋友,您可以通过赞赏、转发或购买我的课程给予支持和鼓励!谢谢。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存