密码学——Schnorr签名算法
Schnorr签名算法介绍
·
一、基本知识
1.1 概述
Schnorr签名算法最初是由德国密码学家ClausSchnorr于2008年提出的,在密码学中,它是一种数字签名方案,以其简单高效著称,其安全性基于某些离散对数问题的难处理性。
1.2 椭圆曲线上的计算
密码学中,常用以下形式的椭圆曲线:E:y2=x3+ax+b(mod p)E: y^2= x^3+ax+b(mod\ p)E:y2=x3+ax+b(mod p) 同时要求4a3+27b2≠04a^3+27b^2 ≠04a3+27b2=0。其中p为一个大素数,a、b、x和y均在有限域GF(p)GF(p)GF(p)中,即从{0,1,⋅⋅⋅,p−1}\{0,1,···,p-1\}{0,1,⋅⋅⋅,p−1}中取值。该曲线常用Ep(a,b)E_{p}(a,b)Ep(a,b)表示。若该曲线上只有有限个离散点,设为N个,则椭圆曲线的阶为N。N越大,椭圆曲线安全性越高。椭圆曲线的阶可通过schoof算法计算求得。
椭圆曲线E:y2=x3−x+1E: y^2= x^3-x +1E:y2=x3−x+1图形如下:
加法规则
椭圆曲线Ep(a,b)E_{p}(a,b)Ep(a,b)在如下定义的加法规则构成Abel群(交换群)。
- O+O=OΟ + Ο = ΟO+O=O
- ∀P=(x,y)∈Ep(a,b)∀P=(x,y)∈E_{p}(a,b)∀P=(x,y)∈Ep(a,b),有P+O=O+P=PP +Ο =Ο + P = PP+O=O+P=P
- ∀P=(x,y)∈Ep(a,b)∀P=(x,y)∈E_{p}(a,b)∀P=(x,y)∈Ep(a,b),有P+(−P)=OP + (-P) =ΟP+(−P)=O,PPP的逆为−P=(x,−y)-P = (x,-y)−P=(x,−y)
- ∀P=(x1,y1),Q=(x2,y2)∈Ep(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=(x3,y3)∈Ep(a,b)P + Q = R = (x_{3},y_{3})∈E_{p}(a,b)P+Q=R=(x3,y3)∈Ep(a,b),其中x3=λ2−x1−x2,y3=λ(x1−x3)−y1x_3=λ^2-x_1-x_2 ,y_3=λ(x_1-x_3 )-y_1x3=λ2−x1−x2,y3=λ(x1−x3)−y1。

- 相同点相加计算R点
- 不同点相加计算R点

- 不同点相加计算R点
乘法规则
- ∀k∈Z,∀P∈Ep(a,b)∀k∈Z,∀P∈E_p (a,b)∀k∈Z,∀P∈Ep(a,b),有kP=P+⋅⋅⋅+P(k个P相加)kP=P+···+P(k个P相加)kP=P+⋅⋅⋅+P(k个P相加);
- ∀s,t∈Z,∀P∈Ep(a,b)∀s,t∈Z, ∀P∈E_p (a,b)∀s,t∈Z,∀P∈Ep(a,b),有(s+t)P=sP+tP,s(tP)=(st)P(s+t)P=sP+tP,s(tP)=(st)P(s+t)P=sP+tP,s(tP)=(st)P
除了无限远的点OΟO外,椭圆曲线EEE任何可以生成所有点的点都可视为EEE的生成元,但并非EEE上所有点都可为生成元。
如何选取生成元
- 首先分解椭圆曲线阶n=r×pn = r × pn=r×p,p需要足够大。
- 令k=n/pk= n/pk=n/p,随机选取 X∈Ep(a,b)X∈E_p (a,b)X∈Ep(a,b),计算G=k⋅XG = k ·XG=k⋅X
- 若G≠OG ≠ ΟG=O,则GGG可为生成元否则重新选择XXX再次计算。
二、算法细节
2.1 公私钥产生算法(KeyGenKeyGenKeyGen):
- 选择一条椭圆曲线Ep(a,b)E_{p}(a,b)Ep(a,b) 和基点GGG;
- 选择私钥dAd_{A}dA(dA<nd_{A}<ndA<n,nnn为该GGG的阶),利用基点GGG计算公钥QA=dA⋅GQ_{A}=d_{A} · GQA=dA⋅G;
2.2 签名生成算法(SignSignSign)
- 选择一个随机整数k(k<n)k(k<n)k(k<n);
- 计算点R=k⋅G=(x1,y1)R=k·G=(x_{1},y_{1})R=k⋅G=(x1,y1);
- 计算σ=k+hash(m∣∣R)⋅dA(mod n)\sigma=k + hash(m|| R)·d_{A} (mod \ n)σ=k+hash(m∣∣R)⋅dA(mod n);
- 得到签名s=(R,σ)s=(R,\sigma)s=(R,σ);
2.3 签名验证算法(Verify):
- 验证等式:σ⋅G≡hash(m∣∣R)⋅QA+R\sigma · G ≡{hash(m|| R)}·Q_{A} + Rσ⋅G≡hash(m∣∣R)⋅QA+R;
- 如果等式成立输出1,否则输出0。
Schnorr签名除了上面一种形式外,还有另外一种形式。
2.4 签名生成算法(SignSignSign)
- 选择一个随机整数k(k<n)k(k<n)k(k<n);
- 计算点R=k⋅G=(x1,y1)R=k·G=(x_{1},y_{1})R=k⋅G=(x1,y1);
- 计算α=hash(m∣∣R)\alpha=hash(m|| R)α=hash(m∣∣R)
- 计算σ=k+hash(m∣∣R)⋅dA(mod n)\sigma=k + hash(m|| R)·d_{A} (mod \ n)σ=k+hash(m∣∣R)⋅dA(mod n);
- 得到签名s=(α,σ)s=(\alpha,\sigma)s=(α,σ);
2.5 签名验证算法(Verify):
- 计算R′=σ⋅G−α⋅QAR^{'}=\sigma·G-\alpha·Q_{A}R′=σ⋅G−α⋅QA
- 验证等式:hash(m∣∣R′)≡αhash(m|| R^{'}) ≡\alphahash(m∣∣R′)≡α;
- 如果等式成立输出1,否则输出0。
更多推荐



所有评论(0)