ECDSA(椭圆曲线数字签名算法)

ECDSA(Elliptic Curve Digital Signature Algorithm)

一、学习背景--数字签名

在现实工作和生活中,我们使用签名的方式表达对一份文件的认可,其他人可以识别出你的签名并且无法伪造你的签名。数字签名就是对显示签名的一种电子实现,它不仅可以完全达到现实签名的特点,甚至能够做的更好。
常用的数字签名算法有RSA(Rivest-Shamir-Adleman Scheme)、DSS(Digital Signature Standard)等。比特币使用ECDSA来生成账户的公私钥以及对交易和区块进行验证。

二、简单说一下数字签名的工作原理

1.Alice(密码学中常用A到Z开头的人名代替甲乙丙丁等,字母越靠后出现频率越低)生成一对密钥,一个是sk(signing key),是非公开的;另一个是vk(verification key),是公开的。
这一对密钥同时生成,并且在数学上是相互关联的,同时,根据vk无法推测出关于sk的任何信息。
2.数字签名算法接收两个输出:信息M和sk,生成一个数字签名Sm
3.验证函数接收信息M、Sm以及vk作为输入,,返回结果是yes或者no。这一步的目的是为了验证你看到的针对信息M的数字签名确实是由Alice的sk来签发的,用于确认信息与签名是否相符。
与手写签名不同,手写签名基本都是相似的,但是数字签名却受输入影响很大。对输入轻微的改变都会产生一个完全不同的数字签名。一般不会对信息直接进行数字签名,而是对信息的哈希值进行签名。由加密哈希函数的无碰撞性可知,这样和对原信息进行签名一样安全。


以md5加密算法为例

三、ECDSA算法

写在开头:为什么使用ECDSA算法?

两个优点
1.在已知公钥的情况下,无法推导出该公钥对应的私钥。
2.可以通过某些方法来证明某人拥有一个公钥所对应的私钥,而此过程不会暴露关于私钥的任何信息。

证明将在后面给出。

在数学上,任何满足以下方程的点所形成的曲线称为随机椭圆曲线:y^2=x^3+ax+b并且4a^3+27b^2≠0,a和b可以为任意值。下面展示几个随机椭圆函数的示例:

y^2 =x^3−x+1

y^2=x^3-1

从图中可以看出,随机椭圆曲线都是关于x轴对称的。
ECDSA算法通过随机椭圆曲线方程的性质产生密钥,有很多的实现方案。其中比特币、以太坊以及其他一些的区块链项目使用的标准为secp256k1,它的公式为:曲线如下图:
secp256k1的曲线图

1.点的加法

在了解如何通过基于secp256k1椭圆曲线的ECDSA算法生成公私钥之前,我们需要了解在随机椭圆曲线里,点的加法是如何实现的。
首先定义椭圆曲线上点的加法。设椭圆曲线上有两点,A和B点,那么作过这两点的直线与该曲线相交于第三点(C点),然后关于X轴对称得到D点,则D为这两个点的和,记作D=A+BD=A+BD=A+B。很明显,D点也在该曲线上。所以椭圆曲线上两点之和也是曲线上的点。


加法图示

特例:
1.如果两点重合,则做该点的切线,与曲线相交点的对称点为和,即A+A=C
如图:


两点为同一点

2.如果两点关于X轴对称,定义A+B=0

2.点的乘法

有了加法以后,乘法实现是不过是进行多次加法运算。有了一个基准点P以后,我们可以对其进行乘法运算,最后可以得到曲线上的另外一个点。
设PPP是椭圆曲线上的一个点,那么正整数kkk乘以点PPP的结果由下面的式子定义,注意式子中的加法是上面提到的椭圆曲线上点的加法:
1∗P=P
2∗P=P+P
3∗P=2∗P+P
…
k∗P=(k−1)∗P+P

3.公钥和私钥的生成

点的运算满足结合律:
n\cdot P+r\cdot P=(n+r)\cdot P
很显然,通过累加k−1的方式计算k∗P是一种很笨的办法,其时间复杂度是线性的。上面我们提到过,椭圆曲线上点的加法是满足结合律的,即(A+B)+C=A+(B+C),扩展一下,就有

P+P+P+P=(P+P)+(P+P)=2P+2P

于是就有这么一种骚操作,比如计算16P,我们可以先计算2P=P+P;然后计算4P=P+P+P+P=2P+2P;再计算8P=P+P...+P=4P+4P;最后计算16P=8P+8P。这里我们把15次加法减少到了4次。

当然,k的值不可能总是2的幂。实际上上面的操作可以推广到k为任意正整数的情况。比如计算23P,首先计算2P=P+P,然后
4P=2P+2P
8P=4P+4P
16P=8P+8P
因为23=16+4+2+1,所以23P=16P+4P+2P+P。总共只需要7次加法。

分析一下,对于任意正整数k,我们都可以利用这个方法将计算k∗P所需的加法计算次数降低到2⋅⌊log2k⌋−1

也就是说,从时间复杂度的角度来看,这个算法是一个O(logk)的算法。

这个方法被称为快速幂算法,原本常用于快速计算某个数的k次幂,这里将其推广到椭圆曲线点乘的快速计算中。

为什么要在介绍了椭圆曲线上点的乘法后突然冒出一个快速幂算法?快速幂算法对于椭圆曲线加密有什么意义?因为数学家/密码学家发现,利用快速幂算法计算k∗P的时间复杂度是对数级的,但是要在知道k∗PP的前提下,倒推出k的值,没有比挨个尝试k的值快太多的算法。于是椭圆曲线加密依赖的数学难题就这么诞生了。

k为正整数,P是椭圆曲线上的点(称为基点),已知k∗PP,计算k

如果我们改一种记法,把椭圆曲线上点的加法记作乘法,原来的乘法就变成了幂运算,那么上述难题的形式跟离散对数问题应该是一致的。即:

k为正整数,P是椭圆曲线上的点,已知P^kP,计算k=log_PP^k

所以这个难题叫椭圆曲线上的离散对数问题。

尽管两者形式一致,但是他们并不等价。实际上这个问题比大整数质因子分解(RSA)和离散对数(DH)难题都要难得多,目前还没有出现亚指数级时间复杂度的算法(大整数质因子分解和离散对数问题都有),以致于同样的安全强度下,椭圆曲线加密的密钥比RSA和DH的短不少,这是椭圆曲线加密的一大优势。

优点1的证明

1.在已知公钥的情况下,无法推导出该公钥对应的私钥。

假设随机取一个0~256位之间的值x,计算x*P,最后的结果一定会落在曲线上的一点。假设该点为X,在公开X以及具体曲线的方程的情况下,能否反推出最初的随机值x
证:寻找x的过程只能通过暴力计算,x的可能值为0~2^{256}-1中的一个,平均来说需要计算2^{128}次能够找到一次x值。那么问题来了,运行一次2^{128}的计算需要多长的时间呢?
假设我们使用的是超级计算机,主频为1THz(一秒钟可以进行一万亿次运算),从宇宙诞生的那一刻开始计算,到现在也就进行了2^{98}次。找到x值的概率为\frac {2^{98}}{2^{128}}=\frac 1{1073741824}。这个概率和下一秒地球被巨型陨石撞击而毁灭的概率接近,既然我们读到了这里,那么说明这件事没有发生。
在上面的案例中,x0~256位的一个随机数,可以作为私钥。X是随机椭圆曲线上的一个点,也就是由私钥生成的公钥,因此优点可以1得证。

但是密码学中,并不能使用上面介绍的实数域上的椭圆曲线。因为

1.实数域上的椭圆曲线是连续的,有无限个点,密码学要求有限点。
2.实数域上的椭圆曲线的运算有误差,不精确。密码学要求精确。

所以我们需要引入有限域上的椭圆曲线。
要证明优点2,还需要将随机椭圆曲线做一些改动:为了保证最后计算出来的点的坐标值相加是512位,secp256k1引入了一个对质数取模的机制。具体来说,随机椭圆曲线从
y^2=x^3+ax+b变为了y^2 mod\ p=(x^3+ax+b)mod\ p其中p=2256-232-29-28-27-26-24-1,是小于2^{256}的最大质数。
此时的随机椭圆曲线函数图如下:

有限域中的函数图像

4.数字签名

优点2的证明

2.可以通过某些方法来证明某人拥有一个公钥所对应的私钥,而此过程不会暴露关于私钥的任何信息。

具体来说,就是向别人证明我知道x,但不暴露x的任何信息。(有些类似于零知识证明)
证:前面介绍过结合律:n\cdot P+r\cdot P=(n+r)\cdot P添加一个hash函数,简单修改可以得出:hash(m,r\cdot P)\cdot n\cdot P+r\cdot P=(hash(m,r\cdot P)*(n+r))\cdot P使n*P=X,那么可知nx。此时方程为:hash(m,r\cdot P)\cdot X+r\cdot P=(hash(m,r\cdot P)*(x+r))\cdot P为了简单起见,我们记R=r\cdot Ps=hash(m,R)*x+r。此时方程化简为:hash(m,R)\cdot X+R=s\cdot P上面这个方程是什么意思呢?
可以这样假设:在已知m的情况下,如果能够提供一个sR满足上面的方程,就可以证明一个人拥有x。这个假设有一个前提,如果一个人不知道x,那么他就无法提供Rs满足上面的等式。
详细探讨这个前提:如果一个人不知道x,又想计算出sR,能够办到吗?结论是不能,首先我们无法从hash(m,R)计算出R(在有限时间内)。
还有一个问题:在已知Rs的情况下,能否计算出关于x的任何信息?
根据公式:s=hash(m,R)*x+r只要解出x=\frac {s-r}{hash(m,R)}就可以了。
要想计算出x,就需要知道r,但是在r没有公开的情况下,有什么办法可以计算r吗?我们知道R=r*P;但是根据这个公式无法倒推出r(刚才介绍的那个数学难题),所以x也是安全的。
至此,可以证明算法的第二个优点。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容