8.4 数字签名标准 DSS
数字签名标准(DSS,Digital Signature Standard)由美国国家标准技术协会(NIST)于1991年8月公布,1994年12月1日正式生效。DSS本质上是ElGamal签名体制,但运行在较大有限域的一个小的素数阶子群上,在该有限域上计算离散对数问题是困难的。在对消息进行数字签名之前,DSS先使用安全的Hash算法SHA-1对消息进行Hash处理,然后对所得的消息摘要签名。这样一来,不仅可以确保DSS能够抵抗多种已知的存在性伪造攻击,同时相对于ElGamal等签名体制,DSS签名的长度将会大大缩短。
8.4.1 DSS的数字签名算法(DSA)
DSS使用的算法称为数字签名算法(DSA,Digital Signature Algorithm),它是在ElGamal和Schnorr两个方案基础上设计出来的。DSA数字签名算法基本框图如图8-4所示。

系统参数
DSA的系统参数包括:
-
一个长度为l比特的大素数p,l的大小在512到1024之间,且为64的倍数。
-
p−1(即φ(p))的一个长度为160比特的素因子q。
-
一个q阶元素g∈Zp∗。g可以这样得到:任选h∈Zp∗,若h^(p−1)/q mod p>1,则令g=h^(p−1)/q mod p;否则重选h∈Zp∗。
-
一个用户随机选取的整数a∈Zq∗,并计算出y=g^a mod p。
-
一个Hash函数H:{0,1}∗→Zq。这里使用的是安全的Hash算法SHA-1。
这些系统参数构成DSA的密钥空间K=(p,q,g,a,y,H),其中(p,q,g,y,H)为公开密钥,a是私有密钥。
签名过程
为了生成对一个消息m的数字签名,签名者随机选取一个秘密整数k∈Zq∗,并计算:
r=(g^k mod p )mod q
s=k^(−1) (H(m)+ar) mod q
则(r,s)就是消息m的数字签名,即SIGa(m,k)=(r,s)。
由此可见,DSA的签名空间为Zq×Zq,签名的长度比ElGamal体制短了许多。
验证过程
验证DSA数字签名时,验证者知道签名者的公开密钥是(p,q,g,y,H)。对于一个消息-签名对(m,(r,s)),验证者计算下面几个值并判定签名的真实性:
w=s^(−1) mod q
u1=H(m)⋅w mod q
u2=r⋅w mod q
v=(g^u1⋅y^u2 mod p) mod q
VER(m,(r,s))=true ⟺ v=r
这是因为如果(r,s)是消息m的有效签名,那么:
v=(g^u1·y^u2 mod p) mod q=(g^H(m)w·g^(arw) mod p) mod q
=(g^(H(m)+ar)w mod p) mod q
=(g^(k⋅s⋅w) mod p) mod q
=(g^k mod p) mod q=r
例8.3:

8.4.2 DSA算法的安全问题
DSA公布后受到的主要批评:
-
不能用于数据加密和密钥分配
-
验证签名比RSA慢10-40倍
-
初始密钥长度512比特太短(后改为512-1024比特可变)
-
设计过程不公开,怀疑可能存在陷门
-
可能侵犯专利
实际安全风险:
-
秘密数k泄露:若k泄露,可导出私钥a=(sk−H(m))r^(−1) mod q
-
重复使用k:若同一kk用于不同消息,可计算出kk和私钥
-
共享参数风险:虽然方便,但公共数据对攻击者有吸引力
-
陷门信道:Simmons发现DSA中存在陷门信道,可嵌入秘密消息
8.5 特殊数字签名方案
8.5.1 不可否认签名
不可否认签名由Chaum和van Antwerpen于1989年提出。其特点是:没有签名者Alice的合作,签名的有效性就无法验证。这防止了签名被未经Alice同意而复制和分发。验证通过口令-响应(Challenge-and-Response)协议实现。
方案描述:
-
设p=2q+1,q为素数,α∈Zp∗阶为q,1≤a≤q−1,β=α^a mod p
-
公钥:(p,α,β),私钥:a
-
签名:y=sig(x)=x^a mod p
验证协议(Bob验证(x,y)):
-
Bob随机选择e1,e2∈Zq
-
Bob计算c=y^e1·β^e2 mod p,发送给Alice
-
Alice计算d=c^a^(−1) mod p,发送给Bob
-
Bob验证d≡x^e1·α^e2(mod p)
否认协议:当签名伪造时,通过两次验证和一致性检验,Bob可确定Alice未按协议响应。
例8.4:


8.5.2 群签名
群签名由Chaum和Heyst于1991年提出。群成员可代表群签名,验证者用群公钥验证,但不知道具体签名者。发生争议时,群管理员可打开签名。
性质:
-
正确性:合法成员签名有效
-
不可伪造性:只有合法成员能签名
-
匿名性:除群主外无人能确定签名者身份
-
不可联系性:无法判断两个签名是否来自同一成员
-
可追踪性:群主可打开签名
-
防篡改性:成员不能以他人名义签名
-
抗联合攻击:全体成员联合也不能阻止签名打开
-
效率:取决于公钥大小、签名长度、算法效率
简单方案:群管理员为每个成员分发互不相交的私钥表,公开公钥表。签名时成员从私钥表选未用过的私钥签名;验证时用公钥表中每个公钥验证;争议时管理员根据对应关系恢复签名者身份。缺点:每个私钥只能用一次,否则丧失不可联系性。
8.5.3 环签名
环签名由Rivest、Shamir和Tauman于2001年提出。签名者可选择任意n−1人(连同自己构成环),用自己的私钥和这些人的公钥对消息签名。验证者只能确信签名来自环中某人,但无法识别具体签名者。环签名可视为简化的群签名,区别在于环签名没有管理员,无法恢复签名者身份。
安全性需求:
-
正确性:环成员签名能通过验证
-
匿名性:识别签名者概率不大于1/n
-
不可伪造性:非环成员无法产生有效签名
Boneh环签名方案(2003年):
-
参数:素数q,群G1,G2,双线性映射e:G1×G1→G2,生成元P,哈希函数H:{0,1}∗→G1
-
用户私钥xi,公钥Yi=xiP
-
签名者Uk签名的生成:
-
计算H=H(m)
-
选随机数ai(i≠k),计算σi=aiP
-
计算

-
输出签名(σ1,...,σn)
-
-
验证:

8.5.4 代理签名
代理签名由Mambo、Usuda和Okamoto于1996年提出,实现签名权委托。原始签名者授权代理签名者代表自己生成有效签名。
基于离散对数的代理签名方案:
-
参数:大素数p,q∣p−1,g∈Zp∗阶q
-
原始签名者A私钥xA,公钥yA=g^xA mod p
-
代理签名者B私钥xB,公钥yB=g^xB mod p
委托过程:
-
A随机选k∈Zp∗,计算r=g^k mod p,w=xA+kr mod q
-
A将(w,r)安全发送给B
-
B验证gw=yA⋅r^r mod p成立
签名过程:B代表A对消息m签名,生成s=Sign(w,m),代理签名(s,r)
验证过程:验证g^s=yB⋅(yA⋅r^r)^m mod p
特点:防止代理签名者滥用签名权,不能转移代理权。
8.5.5 签密
签密由Y. Zheng于1997年提出,在一个逻辑步骤内同时实现认证和加密,效率高于传统的"先签名后加密"。
签密方案SCS:
-
参数:大素数p,大素因子q,g∈Zp∗阶q,哈希函数Hash,带密钥哈希函数KH,对称加解密(E,D)
-
发送方A私钥xa,公钥ya=g^xa mod p
-
接收方B私钥xb,公钥yb=g^xb mod p
签密算法(A对消息m):
-
随机选x∈Zp∗
-
计算(k1,k2)=Hash(yb^x)
-
c=Ek1(m)
-
r=KHk2(m)
-
s=x/(r+xa) mod q
-
输出签密(c,r,s)
解签密算法(B收到(c,r,s)):
-
计算(k1,k2)=Hash((ya⋅g^r)^s)
-
m=Dk1(c)
-
验证KHk2(m)=r