前言
签名技术分为仲裁和非仲裁
仲裁:签名者,签名接受者和仲裁者之间 非仲裁:签名者和签名接收者之间
签名属于公钥体制(非对称体制)
完整的数字签名方案包括:秘钥生成算法、签名算法、验证算法
基于RSA的签名方案
一、基于RSA的签名方案简介
RSA的秘钥生成算法与RSA的加密方案完全相同。
二、使用步骤
1.生成秘钥
选择两个大素数 p、q,计算 n = p * q ,及其欧拉函数 φ(n) = (p-1)(q-1) , 选择 e,1<e< φ(n) , gcd(e, φ(n)) = 1 , d = e^(-1)(mod φ(n)) , 则签名者A的公钥为(n,e),私钥为 d ,需要保密的参数有 p、q
2.加密
设待签名消息为 m,利用 Hash函数 h(m)生成消息摘要,然后签名者计算 S=h(m)^d(mod n),则 S是m的签名,(s,m)发送给接收方
3.验证
B收到 (s,m)后,利用 hash计算消息摘要 h(m) (mod n) = s (mod n)
基于离散对数的签名方案
一、基于离散对数的签名方案简介
基于离散对数的签名的签名方案包括EIGamal签名体制、DSA签名方案、DSA签名方案等
二、使用步骤
2.1 ELGaml签名方案
非确定性的签名方案,对给定的一个消息,由于选择的随机数不同而产生不同的数字签名,并且验证算法均会判断为有效
2.1.1 秘钥生成算法
选择一个满足安全要求的大素数 p,然后选择生成元 g,g∈有限域 Zp*,计算 y=g^x(mod p) 则签名者A的公钥为(p,g,y),私钥为 x
2.1.2 签名算法
设待验证消息为 m,签名者选择随机数 k∈有限域 RZp*,计算:
r = g^k(mod p)
s = [h(m)-xr] * k^(-1) (mod(p-1))
则 m的数字签名为(r,s),其中 h为安全的 Hash函数
2.1.3 验证
签收者收到m和签名(r,s)后,首先计算h(m),然后验证 : y^r * r^s = g^h(m) (mod p)
2.2 Schnorr签名方案
速度较快,签名长度较短
2.2.1 秘钥生成算法
选择大素数 p和q,q是 p-1的大素因子,然后选择生成元 g,g∈有限域 Zp*,且 g^q=1(mod p), g!=1,最后选择随机数 x,x∈(1,q).计算 y=g^x(mod p) 则签名者A的公钥为(p,q,g,y),私钥为 x
2.2.2 签名算法
设待验证消息为 m,签名者选择随机数 k,1<=k<=q-1计算:
r = g^k(mod p)
e=h(m,r)
s = (xe+k) (mod(q))
则 m的数字签名为(e,s),其中 h为安全的 Hash函数
2.2.3 验证
签收者收到m和签名(e,s)后,首先计算 r1=g^s * y^(-e) (mod p),然后验证 : e=h(m,r1)
基于椭圆曲线的签名方案
一、基于椭圆曲线的签名方案简介
在椭圆有限域上实现DSA算法。
二、使用步骤
1.生成秘钥
设 FG(p)为有限域,E是有限域GF(p)上得椭圆曲线,选择E上一点G,G∈E,G的阶为满足安全的素数 n,即 nG = O (O为无穷远点),选择一个随机数 d,d∈[1,n-1],计算Q=dG,公钥为(n,Q),私钥为 d
2.签名算法
- 选择随机数 k,k∈[1,n-1],计算 kG =(x,y),r = x(mod n)
- 计算 e=h(m),h为安全的散列函数
- 计算S=(e+rd) * k^(-1) (mod n)如果 r = 0 或者s = 0则另选择随机数 k,重新执行m的签名为(r,s)
3.验证
- 计算e = h(m)
- 计算u =s^(-1) * e(mod n), v=s^(-1) * r (mod n), (x1,y1) = uG+vQ r1 = x1(mod n)
- 判断 r和 r1的关系,如果 r = r1 则有效