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

证明将在后面给出。

在数学上,任何满足以下方程的点所形成的曲线称为随机椭圆曲线:

并且

,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的结果由下面的式子定义,注意式子中的加法是上面提到的椭圆曲线上点的加法:

3.公钥和私钥的生成

点的运算满足结合律:

很显然,通过累加

的方式计算

是一种很笨的办法,其时间复杂度是线性的。上面我们提到过,椭圆曲线上点的加法是满足结合律的,即

,扩展一下,就有

于是就有这么一种骚操作,比如计算

,我们可以先计算

;然后计算

;再计算

;最后计算

。这里我们把15次加法减少到了4次。

当然,k的值不可能总是2的幂。实际上上面的操作可以推广到k为任意正整数的情况。比如计算23P,首先计算

,然后

因为

,所以

。总共只需要7次加法。

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

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

的算法。

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

为什么要在介绍了椭圆曲线上点的乘法后突然冒出一个快速幂算法?快速幂算法对于椭圆曲线加密有什么意义?因为数学家/密码学家发现,利用快速幂算法计算

的时间复杂度是对数级的,但是要在知道

的前提下,倒推出

的值,没有比挨个尝试

的值快太多的算法。于是椭圆曲线加密依赖的数学难题就这么诞生了。

为正整数,

是椭圆曲线上的点(称为基点),已知

,计算

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

为正整数,

是椭圆曲线上的点,已知

,计算

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

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

优点1的证明

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

假设随机取一个

~

位之间的值x,计算

,最后的结果一定会落在曲线上的一点。假设该点为

,在公开

以及具体曲线的方程的情况下,能否反推出最初的随机值

证:寻找

的过程只能通过暴力计算,

的可能值为

~

中的一个,平均来说需要计算

次能够找到一次

值。那么问题来了,运行一次

的计算需要多长的时间呢?

假设我们使用的是超级计算机,主频为

(一秒钟可以进行一万亿次运算),从宇宙诞生的那一刻开始计算,到现在也就进行了

次。找到

值的概率为

。这个概率和下一秒地球被巨型陨石撞击而毁灭的概率接近,既然我们读到了这里,那么说明这件事没有发生。

在上面的案例中,

~

位的一个随机数,可以作为私钥。

是随机椭圆曲线上的一个点,也就是由私钥生成的公钥,因此优点可以1得证。

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

1.实数域上的椭圆曲线是连续的,有无限个点,密码学要求有限点。

2.实数域上的椭圆曲线的运算有误差,不精确。密码学要求精确。

所以我们需要引入有限域上的椭圆曲线。

要证明优点2,还需要将随机椭圆曲线做一些改动:为了保证最后计算出来的点的坐标值相加是512位,secp256k1引入了一个对质数取模的机制。具体来说,随机椭圆曲线从

变为了

其中

,是小于

的最大质数。

此时的随机椭圆曲线函数图如下:

有限域中的函数图像

4.数字签名

优点2的证明

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

具体来说,就是向别人证明我知道

,但不暴露

的任何信息。(有些类似于零知识证明)

证:前面介绍过结合律:

添加一个hash函数,简单修改可以得出:

使

,那么可知

。此时方程为:

为了简单起见,我们记

。此时方程化简为:

上面这个方程是什么意思呢?

可以这样假设:在已知

的情况下,如果能够提供一个

满足上面的方程,就可以证明一个人拥有

。这个假设有一个前提,如果一个人不知道x,那么他就无法提供

满足上面的等式。

详细探讨这个前提:如果一个人不知道x,又想计算出

,能够办到吗?结论是不能,首先我们无法从

计算出

(在有限时间内)。

还有一个问题:在已知

的情况下,能否计算出关于

的任何信息?

根据公式:

只要解出

就可以了。

要想计算出x,就需要知道r,但是在r没有公开的情况下,有什么办法可以计算r吗?我们知道R=r*P;但是根据这个公式无法倒推出r(刚才介绍的那个数学难题),所以x也是安全的。

至此,可以证明算法的第二个优点。

ecdsa JAVA 私钥推导公钥_ECDSA(椭圆曲线数字签名算法)相关推荐

  1. 高级数字签名之椭圆曲线数字签名算法(ECDSA)

    @TOC 1. 算法简述 该算法是微软操作系统及办公软件的序列号验证算法. ECDSA(Elliptic Curve Digital Signature Algorithm, 椭圆曲线数字签名算法) ...

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

    一. 椭圆曲线加密算法 简称ECC,是基于椭圆曲线数学理论实现的一种非对称加密算法.相比RSA,ECC优势是可以使用更短的密钥,来实现与RSA相当或更高的安全,RSA加密算法也是一种非对称加密算法,在 ...

  3. 算法2_非对称加密算法之ECDSA(椭圆曲线数字签名算法)

    ECDSA(椭圆曲线数字签名算法) AES(高级加密标准): =>对称加密 ​ 对业务数据进行加密,防止他人可以看见 ECDSA(椭圆曲线数字签名算法):=>非对称加密算法(公钥和私钥) ...

  4. 区块链应用:椭圆曲线数字签名算法ECDSA

    1 椭圆曲线密码学 椭圆曲线密码学(Elliptic Curve Cryptography,缩写ECC),是基于椭圆曲线数学理论实现的一种非对称加密算法.椭圆曲线在密码学中的使用是在1985年有Nea ...

  5. Fabric 1.0源代码分析(46)ECDSA(椭圆曲线数字签名算法)

    # Fabric 1.0源代码笔记 之 ECDSA(椭圆曲线数字签名算法) ## 1.椭圆曲线算法概述 ### 1.1.无穷远点.无穷远直线.射影平面 * 平行线相交于无穷远点: * 直线上有且只有一 ...

  6. [以太坊源代码分析] IV. 椭圆曲线密码学和以太坊中的椭圆曲线数字签名算法应用

    数字签名算法在Ethereum中的应用不少,目前已知至少有两处:一是在生成每个交易(Transaction, tx)对象时,对整个tx对象进行数字签名:二是在共识算法的Clique算法实现中,在针对新 ...

  7. 【数字赛道命题二】椭圆曲线数字签名算法的高性能硬件实现

    一. 赛题简介 1985年,Victor Miller和Neal Koblitz分别提出了椭圆曲线密码体制(Elliptic Curve Cryptography,ECC).椭圆曲线密码算法以其特有的 ...

  8. go区块链培训怎么样?深度讲解椭圆曲线加密算法ECC和椭圆曲线数字签名算法ECDSA

    区块链培训怎么样?关键还是看其课程质量,下面是我写的一系列课程讲解,大家可以先学习一下!感兴趣的还可以找我要视频哈! 8.1.1 ECC数字签名(ECDSA)核心代码 下面通过一个案例验证数字签名,如 ...

  9. ECDSA数字签名算法(java实现ECDSA签名验签)

    一.ECDSA概述 椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟.ECDSA于1999年成为ANSI标准,并于2000年成为IEEE和NIST标准.它在 ...

最新文章

  1. set debug mode for flex builder
  2. 用计算机打印相片怎么调色,2018年底照片如何使用LOG模式进行调色
  3. Zynq ROM 加载Mode 图表
  4. 2021-04-08 Halcon进阶【02】 几何计量【多目标测量】
  5. CodeForces - 1110G Tree-Tac-Toe(博弈+构造)
  6. 【C++grammar】名字隐藏与重定义
  7. Iptables-Fail2ban处理bind 非法***
  8. 如何用 Python 拆分表格并发送邮件?
  9. ajax跨越html,ajax跨域的解决方案
  10. ASP.NET后台注册javascript脚本方法
  11. python按哪个键删除_Python-从字典中删除键的方法
  12. Android 常用开发工具收藏
  13. 拓端tecdat|R语言基于ARMA-GARCH-VaR模型拟合和预测实证研究分析案例
  14. Android 开发 学习网站
  15. 01串匹配问题 —— Binary Strings【Gym - 101845B】
  16. Thinkpad T410i-2516A21 安装Ubuntu10.0.4记录
  17. 【Pytorch官方教程】从零开始自己搭建RNN2 - 字母级RNN的生成任务
  18. 服务器部署nginx配置域名反向代理
  19. 夏令营导师自荐信计算机专业,北大夏令营的自荐信
  20. 说极路由牛逼的人们,你们用过Tomato DualWAN吗?(一)

热门文章

  1. [Swift]LeetCode1104. 二叉树寻路 | Path In Zigzag Labelled Binary Tree
  2. JDK14+JAVAFX14+Maven定制jre打包瘦身,必成版
  3. Android 集成Facebook分享功能
  4. 美国电脑出货量的现实和思考
  5. Zynq中FPGA上电时序
  6. 35岁+做互联网的你该何去何从呢?
  7. 分割网络对结构光图像进行分割
  8. 百度AI攻略:银行卡识别
  9. 这本书,豆瓣评分9.3,送给大家!
  10. 程序员除了看技术类的书你们还看哪些书