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

AES(高级加密标准): =>对称加密

​ 对业务数据进行加密,防止他人可以看见

ECDSA(椭圆曲线数字签名算法):=>非对称加密算法(公钥和私钥)

​ 验证数据的真实性,防止业务数据被篡改

SHA(安全哈希算法)=>哈希算法

1. 作用:

因为ECDSA椭圆曲线数字签名算法获得公钥和私钥对是一一对应的,不存在"不同私钥但是公钥相同的情况"所有伪造ECDSA签名是根本不可能的

2. 解释ECDSA

ECDSA当中有两个词要注意:Curve(曲线)和Algorithm(算法)=>意味着ECDSA基本上是基于数学的

1. 基本原理:

假设给定一条曲线Curve一串随机数Rand Num以及随机在曲线上取原点(Origin Point)

Private_Key=Rand_Num

Public_Key=Magic_Math(Curve,Rand_Num,Origin_Point)

=> 接下来就是要好好理解这个魔法数学Magic_Math =>(看完以下的就知道这个Magic_Math其实就是一个在已知椭圆曲线和参考点G的前提下对G进行以下运算)
P u b l i c _ K e y = R a n d _ N u m × O r i g i n _ P o i n t G ( 点 的 乘 法 ) Public\_Key=Rand\_Num \times Origin\_PointG (点的乘法) Public_Key=Rand_Num×Origin_PointG(点的乘法)

3. 解释Magic_Math:

1. 前提

ECDSA只使用整数数学,没有浮点数

=>整数范围由签名当中所采用的位数决定的,更多的位数意味着更大的数字范围,更高的安全性能

​ why? 因为整数范围越大,则表示的位数越大那么破解ECDSA所需要猜测的数字范围也越大,那么破解所花费的时间越长,那么安全性就越高

=>mod 模运算:就是整数求除之后的余数

2. 椭圆曲线密码学

基于以下方程:
y 2 = ( x 3 + a ∗ x + b ) m o d p y^2=(x^3+a*x+b) mod p y2=(x3+a∗x+b)modp

以上方程可以得知:
该方程所对应的曲线:对于任意的x坐标(只能取整数),你可以得到两个y的值,且曲线关于x轴对称。

p是一个素数,且确保所有得到的值在规定SHA的输出长度所能够表示的范围之内.

综上所述:经过取模运算之后结果只能在0-p-1之间,

总结:

3. 椭圆曲线点加法的表示方法:

注释:这是a=-4,b=0以后的椭圆曲线,P+Q点与R点对称
P = ( x 1 , y 1 ) P + Q = ( X 2 , y 2 ) = > X 1 = X 2 且 Y 1 = − Y 2 P=(x1,y1) \quad P+Q=(X2,y2)=>X1=X2且Y1=-Y2 P=(x1,y1)P+Q=(X2,y2)=>X1=X2且Y1=−Y2
​ 所以对于椭圆曲线的点加法的定义是:在椭圆曲线上取两点P和Q进行加法运算结果为P+Q 等价于 P和Q的连接的延长线交于椭圆曲线R点,R点的对称点即P+Q

4. 椭圆曲线点乘法的表示方法:
k ∗ P 可 以 定 义 为 P 对 自 身 进 行 k 次 相 加 获 得 点 k*P可以定义为P对自身进行k次相加获得点 k∗P可以定义为P对自身进行k次相加获得点

5.椭圆曲线点乘法的单向陷门性
> 单向陷门函数的意思是:知道起点和终点不能求得乘数k,换句话说不知道怎么从起点开始做变换到达R点 正是这种单向陷门的性质是ECDSA的安全性的基础所在

4.ECDSA算法:

​ 首先你需要知道你的椭圆曲线参数的含义
椭 圆 曲 线 的 数 学 表 示 : y 2 = ( x 3 + a × x + b ) m o d p 椭圆曲线的数学表示:y^2=(x^3+a\times x+b)\,mod \,p 椭圆曲线的数学表示:y2=(x3+a×x+b)modp

其 中 a b p 是 椭 圆 曲 线 中 的 参 数 , N 是 曲 线 面 上 符 合 该 椭 圆 曲 线 数 学 表 示 的 点 个 数 , G 是 曲 线 上 的 任 意 一 点 作 为 起 点 其中a \ b \ p是椭圆曲线中的参数,N是曲线面上符合该椭圆曲线数学表示的点个数,G是曲线上的任意一点作为起点 其中a b p是椭圆曲线中的参数,N是曲线面上符合该椭圆曲线数学表示的点个数,G是曲线上的任意一点作为起点

椭圆曲线的参数是由**NIST(National Institute of Standards and Technology)SECG(Standards for Efficient Cryptography Group)** 这两个机构提供的已知高效和安全的标准化参数即提供了 a,b,p,G这四个参数

总结:综上所述
私 钥 d A 是 一 串 随 机 数 公 钥 Q a 是 私 钥 d A × G 获 得 椭 圆 曲 线 终 点 即 Q a = d A × G 私钥dA是一串随机数 \quad 公钥Qa是私钥dA\times G获得椭圆曲线终点 即\quad Qa=dA\times G 私钥dA是一串随机数公钥Qa是私钥dA×G获得椭圆曲线终点即Qa=dA×G

 Go标准库 crypto/ecdsa//私钥(或者说公私钥对)type PrivateKey struct {PublicKey  //所对应的公钥D *big.Int //私钥即随机数}//公钥type PublicKey struct {//生成该公钥的椭圆曲线elliptic.CurveX, Y *big.Int //公钥的(X,Y)}// GenerateKey generates a public and private key pair.
func GenerateKey(c elliptic.Curve, rand io.Reader) (*PrivateKey, error) {//k通过randFieldElement方法生成随机数作为私钥k, err := randFieldElement(c, rand)if err != nil {return nil, err}priv := new(PrivateKey)//设置该公私钥对是基于的椭圆曲线priv.PublicKey.Curve = c//私钥priv.D = k//设置公钥priv.PublicKey.X, priv.PublicKey.Y = c.ScalarBaseMult(k.Bytes())return priv, nil
}

综上所述:
私钥是数,公钥是点坐标,PrivateKey既可以认为是私钥也可以认为是公私钥对

5.ECDSA算法进行数字签名过程:

​ 假设下面的哈希算法采用的是SHA1那么输出的长度为20字节,那么签名(R,S)中每个分量都是20字节

  1. 问题:如何对一个文件或一个消息进行签名呢?

    过程:已知椭圆曲线参考点G、私钥dA以及产生一个随机数K

    1. P = k × G ( × 是 椭 圆 曲 线 上 的 点 乘 ) 1. P=k \times G (\times 是椭圆曲线上的点乘) 1.P=k×G(×是椭圆曲线上的点乘)

    2. P 点 的 x 坐 标 作 为 R ( 20 字 节 ) 2. P点的x坐标作为R(20字节) 2.P点的x坐标作为R(20字节)

    3. 对 消 息 M s g : z = S H A 1 ( M s g ) ( z 为 20 字 节 ) 3.对消息Msg:z=SHA1(Msg) (z为20字节) 3.对消息Msg:z=SHA1(Msg)(z为20字节)

    4. S = k − 1 ( z + d A × R ) m o d p ( k − 1 是 k 的 模 的 乘 法 逆 元 ) 4. S=k^{-1}(z+dA\times R)\ mod \ p \quad (k^{-1}是k的模的乘法逆元) 4.S=k−1(z+dA×R) mod p(k−1是k的模的乘法逆元)

    最 终 的 输 出 的 是 两 元 数 组 ( R , S ) 最终的输出的是两元数组(R,S) 最终的输出的是两元数组(R,S)

  2. 问题:如何验证签名的合法性?

    过程:已知(R,S),公钥Qa,参考点G以及消息msg
    z = S H A ( m s g ) z=SHA(msg) z=SHA(msg)

    P = S − 1 × z × G + S − 1 × R × Q a ( 第 1 , 2 个 是 椭 圆 曲 线 上 的 点 乘 算 法 ) P=S^{-1}\times z \times G+S^{-1} \times R \times Qa (第1,2个是椭圆曲线上的点乘算法) P=S−1×z×G+S−1×R×Qa(第1,2个是椭圆曲线上的点乘算法)

    然后判断P的x坐标是否于R相等,如果相等则这个签名有效,否则是无效的

    有效的含义即这个Msg认为是真实且可信的

总结

  1. 私钥是一个随机数,公钥是一个点.
  2. 利用椭圆曲线上点乘是一个单向陷门函数特有的性质,作为ECDSA的安全性保证,使得生成公钥.
  3. 参数a,b,p,G可以由NIST和SECG提供.
  4. 了解数字签名和验证签名的过程,可以明白真正随机数的重要性.

参考文献

知乎之数海拾荒

孙荣燕,蔡昌曙,周洲,赵燕杰,杨金铭.国密SM2数字签名算法与ECDSA算法对比分析研究[J].网络安全技术与应用,2013(02):60-62.

算法2_非对称加密算法之ECDSA(椭圆曲线数字签名算法)相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    ECDSA(Elliptic Curve Digital Signature Algorithm) 一.学习背景--数字签名 在现实工作和生活中,我们使用签名的方式表达对一份文件的认可,其他人可以识别 ...

  9. 加密与安全:图解非对称加密算法 RSA 数字签名与数字证书

    RSA 加密过程是公钥加密.私钥解密,而数字签名.数字证书都是私钥签名(可以理解为加密),公钥签名验证(可以理解为解密).公钥和私钥都可以用来加密或解密,只要能保证用 A 加密,就用 B 解密即可,至 ...

最新文章

  1. linux工程师前景_小猿圈预测2019年Linux云计算发展前景
  2. 居然又要出一部关于程序员的剧!你会追么?
  3. flume高可用-balance-测试运行
  4. sql语法中u‘‘ n‘‘详解
  5. 计算机网络考研辅导谁的好,计算机网络考研辅导哪个好
  6. 如何最快速的找到页面某一元素所绑定的点击事件,并查看js代码
  7. App自动化测试工具Airtest
  8. 刚刚,华为发布白皮书,重新定义智慧园区!
  9. 余弦 matlab 幅度谱,数字图像处理_旋转与幅度谱(含MATLAB代码)
  10. 推荐个不错的 Word 全文翻译和压缩工具!
  11. 【黑金原创教程】【Modelsim】【第五章】仿真就是人生
  12. 卸载 AutoCAD 清理注册表
  13. linux输入特殊符号密码,linux 输入特殊符号
  14. Echarts角锥柱形图
  15. 2013-04-26-成都华为实习生招聘上机笔试
  16. 亲历校招面试问答【回顾记录】
  17. React 项目记录(四)——在 React 中使用地图
  18. 【docker】怎么查看docker镜像的dockerfile
  19. 基于matlab的绿色番茄识别定位方法
  20. 电子科技大学计算机保研经历,电子科技大学计算机科学与工程学院(专业学位)计算机技术保研...

热门文章

  1. Maemo與Nokia N900
  2. 1、Windows如何删除右键新建菜单中的某些选项
  3. 今日学习感悟(Java)
  4. github 上Go项目使用Travis CI和Docker Hub实现持续集成
  5. 基于H5的图片上传解析
  6. 综述| 从肠道菌群”看“癌症
  7. 一建今年大放水,23年会不会难度剧增?
  8. 如何编译duilib
  9. Win11如何设置软件快捷方式?
  10. KTX 和 Kotlin android extension 都到底是个啥?