密码学——ECDSA签名算法

ECDSA算法原理及python实现

一、基本知识

1.1 概述

椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟,其安全性基于椭圆曲线离散对数问题。椭圆曲线离散对数问题远远难于离散对数问题,因此椭圆曲线密码系统的单位比特强度要远高于传统的离散对数系统。在使用较短的密钥的情况下,ECC便可达到于DL系统相同安全级别,拥有计算参数小、密钥短、运算速度快等优势。

1.2 椭圆曲线上的计算

密码学中,常用以下形式的椭圆曲线: E : y 2 = x 3 + a x + b ( m o d   p ) E: y^2= x^3+ax+b(mod\ p) E:y2=x3+ax+b(mod p) 同时要求 4 a 3 + 27 b 2 ≠ 0 4a^3+27b^2 ≠0 4a3+27b2=0。其中p为一个大素数,a、b、x和y均在有限域 G F ( p ) GF(p) GF(p)中,即从 { 0 , 1 , ⋅ ⋅ ⋅ , p − 1 } \{0,1,···,p-1\} {0,1,,p1}中取值。该曲线常用 E p ( a , b ) E_{p}(a,b) Ep(a,b)表示。若该曲线上只有有限个离散点,设为N个,则椭圆曲线的阶为N。N越大,椭圆曲线安全性越高。椭圆曲线的阶可通过schoof算法计算求得。
椭圆曲线 E : y 2 = x 3 − x + 1 E: y^2= x^3-x +1 E:y2=x3x+1图形如下:
 y^2= x^3-x +1


加法规则

椭圆曲线 E p ( a , b ) E_{p}(a,b) Ep(a,b)在如下定义的加法规则构成Abel群(交换群)。

  • O + O = O Ο + Ο = Ο O+O=O
  • ∀ P = ( x , y ) ∈ E p ( a , b ) ∀P=(x,y)∈E_{p}(a,b) P=(x,y)Ep(a,b),有 P + O = O + P = P P +Ο =Ο + P = P P+O=O+P=P
  • ∀ P = ( x , y ) ∈ E p ( a , b ) ∀P=(x,y)∈E_{p}(a,b) P=(x,y)Ep(a,b),有 P + ( − P ) = O P + (-P) =Ο P+(P)=O P P P的逆为 − P = ( x , − y ) -P = (x,-y) P=(x,y)
  • ∀ P = ( x 1 , y 1 ) , Q = ( x 2 , y 2 ) ∈ E p ( a , b ) ∀P=(x_{1},y_{1}),Q=(x_{2},y_{2})∈E_{p}(a,b) P=(x1,y1),Q=(x2,y2)Ep(a,b),则 P + Q = R = ( x 3 , y 3 ) ∈ E p ( a , b ) P + Q = R = (x_{3},y_{3})∈E_{p}(a,b) P+Q=R=(x3,y3)Ep(a,b),其中 x 3 = λ 2 − x 1 − x 2 , y 3 = λ ( x 1 − x 3 ) − y 1 x_3=λ^2-x_1-x_2 ,y_3=λ(x_1-x_3 )-y_1 x3=λ2x1x2,y3=λ(x1x3)y1

  • 相同点相加计算R点在这里插入图片描述
    • 不同点相加计算R点
      在这里插入图片描述
乘法规则
  • ∀ k ∈ Z , ∀ P ∈ E p ( a , b ) ∀k∈Z,∀P∈E_p (a,b) kZ,PEp(a,b),有 k P = P + ⋅ ⋅ ⋅ + P ( k 个 P 相 加 ) kP=P+···+P(k个P相加) kP=P++P(kP)
  • ∀ s , t ∈ Z , ∀ P ∈ E p ( a , b ) ∀s,t∈Z, ∀P∈E_p (a,b) s,tZ,PEp(a,b),有 ( s + t ) P = s P + t P , s ( t P ) = ( s t ) P (s+t)P=sP+tP,s(tP)=(st)P (s+t)P=sP+tP,s(tP)=(st)P

除了无限远的点 O Ο O外,椭圆曲线 E E E任何可以生成所有点的点都可视为 E E E的生成元,但并非 E E E上所有点都可为生成元。
如何选取生成元

  • 首先分解椭圆曲线阶 n = r × p n = r × p n=r×p,p需要足够大。
  • k = n / p k= n/p k=n/p,随机选取 X ∈ E p ( a , b ) X∈E_p (a,b) XEp(a,b),计算 G = k ⋅ X G = k ·X G=kX
  • G ≠ O G ≠ Ο G=O,则 G G G可为生成元否则重新选择 X X X再次计算。

二、算法细节

2.1 公私钥产生算法( K e y G e n KeyGen KeyGen):
  • 选择一条椭圆曲线 E p ( a , b ) E_{p}(a,b) Ep(a,b) 和基点 G G G
  • 选择私钥 d A d_{A} dA d A < n d_{A}<n dA<n n n n为该 G G G的阶),利用基点 G G G计算公钥 Q A = d A ⋅ G Q_{A}=d_{A} · G QA=dAG
2.2 签名生成算法( S i g n Sign Sign
  • 选择一个随机整数 k ( k < n ) k(k<n) k(k<n),计算点 P = k ⋅ G = ( x 1 , y 1 ) P=k·G=(x_{1},y_{1}) P=kG=(x1,y1)
  • r = x 1 r=x_{1} r=x1
  • 计算 z = h a s h ( m ) z=hash(m) z=hash(m),哈希函数可选择 S H A − 2 SHA-2 SHA2
  • 计算 s = k − 1 ( z + r d A ) ( m o d   n ) s=k^{-1} (z+rd_A ) (mod \ n) s=k1(z+rdA)(mod n)
  • 得到签名(r,s),如果r或s其中任意一方为0则重新选择随机数k再次计算
2.3 签名验证算法(Verify):
  • 计算 z = h a s h ( m ) z=hash(m) z=hash(m)
  • 计算 u 1 = z s − 1 m o d n , u 2 = r s − 1 m o d   n u_1= zs^{-1} mod n,u_2= rs^{-1} mod\ n u1=zs1modnu2=rs1mod n
  • 计算点 ( x 1 , y 1 ) = u 1 ⋅ G + u 2 ⋅ Q A (x_1,y_1 )= u_1 ·G+ u_2·Q_A (x1,y1)=u1G+u2QA
  • 验证等式: r ≡ x 1 m o d   n r ≡ x_1 mod\ n rx1mod n
  • 如果等式成立输出1,否则输出0。

三、python实现

  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值