有聊区块链与加密货币系列5——比特币安全的基石:椭圆曲线方程

外汇有聊  2019-09-11  新手入门/区块链知识栏目  
上数学课了,大家坐稳。 相信很多小伙伴听说过,比特币的密码叫做私钥,私钥一旦丢失,对应的BTC将永远封存。不存在重置私钥一说,因此私钥的保管至关重要。丢失私钥,是早期BTC持有者常犯的错误,因为当时BTC 并没有今天这么高的法币标价,因此很多人并不重视。 为什么私钥丢失是致命事件?可以强行破解私钥么? 理论上可以,答案是算到地球灭亡。 以今天凌晨最高全网算力纪录100EH/s来看,也就是每秒进行100*2^60次哈希运算,也就是每秒猜100*2^60次,听起来很大,但是私钥的全部可能性是2^256种,假设私钥呈现均匀分布U(0,2^256),强行破解也要几亿亿亿亿亿亿年

如果还不够直观,想想如果有360个地球,每个地球上的每一克物质又变成一个新的地球,那这些地球上面的所有水分子就是所有的私钥。 (找是找不到的,这辈子都不可能找到的) 那到底是什么加密算法让比特币有如此的密码安全性呢? 这就是本篇的硬核内容了。
先看一个方程:  这就是比特币所使用的方程,用来保护消息摘要的真实性。这种算法叫椭圆曲线算法(Ellipse Curve Cryptography。与传统的基于大质数因子分解困难性的加密方法不同,ECC通过椭圆曲线方程式的性质产生密钥,是典型的非对称加密算法,抗暴力求解的能力极强。 

  插一句,目前我国居民二代身份证正在使用 256 位的椭圆曲线密码,比特币也选择ECC作为加密算法,也就是说比特币的密码学安全度是等同于身份证的。比特币系统不安全性的说法可以退下了。

  那么椭圆曲线方程是不是就是一种椭圆方程呢?  
不是的,椭圆曲线的形状并不是椭圆,只是因为椭圆曲线的描述方程,类似于计算一个椭圆周长的方程故得名。
划重点——基本上来说,椭圆曲线方程是一个齐次方程,曲线上的每个点都必须是非奇异的,也就是光滑的,即各个维度的偏导数不同时为0 具体的标准式我就不贴了,有兴趣出门左转百度维尔斯特拉斯方程(Weierstrass。 为什么椭圆曲线可以用于加密呢? 这就要温习前面所讲的,比特币私钥可以轻松生成公钥,而基于公钥无法反解私钥的基本常识,而比特币的私钥产生公钥的过程就是基于椭圆曲线来运算的。 先看一个栗子—— 

  小明就读于小学二年级,会计算加法,但是不会计算除法。你是小明的怪蜀黍大强,你想出一道题给他做,让他虽然能理解题目意思但是做起来有难度:

  强:“小明小明,过来,叔叔问你,1 1等于几?”

  明:“叔叔的大学白念了吧,我幼儿园就会了,等于2。”

  强:“那考你个难的,7 7等于几?”

  明:“切,你当人家上课啃铅笔头,下课帮小红写作业都是白干的是吧。手指都不用数,等于14呗。”

  强:“行,有叔叔当年的风采,那叔叔再问你,几个7相加等于56?”

  明:“……”,默默掏出草稿纸、铅笔、手指头、脚趾头,进行了10分钟的深度计算:2个7等于14,3个7等于21,4个7等于28……。“叔叔,我算出来了,是8个,对不对?”

  强:“好小子,叔叔就不信考不倒你。几个7相加等于864192?” 你心中默念,以小明的计算能力,要算到这个数恐怕得一年半载的。

  明:“叔叔好厉害呀,我算不出来。”

 这个例子想说明的是基于加法阶数难求问题的密码方案。对于椭圆曲线密码来讲,椭圆曲线的基点就是例子里面的7,而私钥就是基点的加法阶数(例子里面的8),公钥是基点(7)进行对应阶数的加法(8次)得到的结果(56)。 具体来看比特币的例子—— 以一个随机生成的私钥 k(可以理解为一个极大的数)为起点,我们将其与曲线上已定义的生成点 G 相乘以获得曲线上的另一点,也就是相应的公钥K。 

  生成点是secp256k1标准的一部分,Secp256k1是指比特币中使用的ECDSA(椭圆曲线数字签名算法)曲线的参数。

 比特币密钥的生成点都是相同的:
{K =k * G} 其中 k 是私钥,G是生成点,在该曲线上所得的点 K 是公钥。因为所有比特币用户的生成点是相同的,一个私钥k 乘以 G 将得到相同的公钥 K。k 和 K 之间的关系是固定的,但只能单向运算,即从 k 得到 K。 为了展示整数点的乘法,我们将使用较为简单的实数范围的椭圆曲线。但实际上,椭圆曲线密码里的加法是建立在“有限域上的二元三次曲线上的点”上,组成一个“有限加法循环群”,是离散的。 我们的目标是找到生成点 G 的倍数 k*G。也就是将 G相加 k 次。在椭圆曲线中,点的相加等同于从该点画切线找到与曲线相交的另一点,然后映射到 x 轴。  针对上面这张图说一下k*G的计算过程,这里我们假定k的值为8。

  1.已知椭圆曲线上的一点G,我们做其在曲线上的切线,此时切线与原本的椭圆曲线就会产生一个交点,这个点我们记作-2G,那么与-2G关于x轴对称的点就是2G了。

  2.重复上面的动作,对点2G做切线,使得切线与椭圆曲线相交,交点记为-4G,再取-4G关于x轴的对称点,就得到了4G

  3.再次重复前面的动作,对点4G做切线,使得切线与椭圆曲线相交,交点记为-8G,再取-8G关于x轴的对称点,就得到了8G

  

这里8G点就是我们所说的公钥K,点的坐标就是公钥K的x和y。 事实上,这个动作我们可以重复很多很多次,能坚持读到这里的小伙伴一定想到了,这是阿贝尔群(Abelian Group): 任意取椭圆曲线上两点P、Q(若P、Q两点重合,则作P点的切线),作直线交于椭圆曲线的另一点R',过R'做y轴的平行线交于R,定义P Q=R。这样,加法的和也在椭圆曲线上,并同样具备加法的交换律、结合律。 
好了,上面的整个过程如果看明白了,我们接着来说为什么通过公钥K得不到私钥k。

  假定我们现在已知点8G(公钥K),我们可以反向推出它关于x轴的对称点-8G。到了这一步我们会发现,想通过-8G反向堆出4G变成了不可能的事情。因为-8G是椭圆曲线上的一个点,在平面上过这个点有无数条直线,这里或许会有一条或者几条与椭圆曲线相切,但这些切线我们却无从求得。或许我们可以逐条测试,通过穷举法找出过点-8G且与椭圆曲线相切的直线,进而得到可能的点4G。但不要忘记,我们只是进行了反向推理的第一步,我们想从4G得到2G也需要同样的计算量。

 如果私钥是长这个样子: 1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD 那么计算量将是不可想象的。
版权信息
作者:我真的醉了
来源:外汇有聊

关于我们

联系我们

作者进驻

手机版

Copyright © 2013 比特巴 www.btb8.com
始建于2013年,提供比特币 区块链及数字货币新闻、技术教程、测评、项目周报、人物等资讯
本页面提供的是新手入门教程资讯,提供入门级的比特币知识、区块链知识以及各类数字货币知识,是数字货币爱好者入门、精通的好导师。