1.简介
由于前面介绍的MAC相关问题,出现了用于数字签名的数字签名标准(Digital Signature Standard,DSS)。DSS利用SHA-1算法计算初始消息的消息摘要,并对消息摘要进行数字签名。DSS利用数字签名算法(DSA)。注意DSS是标准,而DSA是实际算法。
和RSA一样,DSA也基于非对称密钥加密,但是目的不同。RSA也可以对消息进行数字签名,而DSA则不能用于加密,只能对消息进行数字签名。
2.数字签名的争论
DSA的接受不是一帆风顺的,我们知道,RSA也可以对消息进行数字签名,NIST开发DSA的主要目的之一是使DSA成为免费的数字签名算法软件。但RSA数据安全公司
(RSADSI)控制了所有RSA产品的许可证(不是免费的),其在RSA算法上投入了大量精力和经费。因此,他们竭力推荐RSA(而不是DSA)作为数字签名算法。此外,IBM、
Neovll、Lotus、Apple Microsoft 、DEC 、Sun Nortbern Telecom之类的大公司也投人大量资金实现RSA算法,它们也反对使用DSA。它们对DSA的强度提出了许多责难和怀疑,但一一得到解决,使DSA成为可靠的算法。但是,所有问题并没有全部解决。
尽管NIST持有DSA的专利,但至少还有三个部门也声称持有DSA的专利,这个问题
至今还没有得到解决。
介绍DSA工作原理之前,先要介绍如何用RSA进行数字签名。
3.RSA与数字签名
假设发送方A要向接收方B发送一个消息M,并对消息M计算数字签名(S)。
第1步:发送方A用SHA-1消息摘要算法对消息M计算消息摘要(MD1),如下图所示:
第2步:发送方A用私钥加密这个消息摘要,这个过程的输出是A的数字签名(DS),如下图所示:
第3步:发送方A将消息M和数字签名DS一起发送给接收方B。
第4步:接收方B收到消息M和发送方的数字签名后,使用与A相同的消息摘要算法计算消息摘要MD2。
第5步:接收方B用发送方的公钥解密数字签名。注意A用私钥加密消息摘要,得到数字签名,因此只能用A的公钥解密。这个过程得到原先的消息摘要,和第1步求出A的一样MD1,如下图所示:
第6步:这时比较两个消息摘要如下:MD2,第4步求出;MD1,第5步从A的数字签名求出。
如果MD1和MD2一样,则表明:B接收初始消息M,是A发来的正确消息,未经篡改;B也保证消息来自A而不是别人伪装A。如果MD1和MD2不一样,则拒绝原始消息M。
攻击者完全可以改变消息、重新计算消息摘要,但是不能再次签名,因为攻击者没有A的私钥。由于只有A知道自己的私钥,因此攻击者无法用A的私钥再次将消息摘要加密(即签名消息)。这样,数字签名的原理是相当强大、安全和可靠的。
4.对RSA数字签名的攻击
攻击者试图对RSA数字签名进行一些攻击:
(1)选定部分消息的攻击:在这种攻击中,攻击者创建两个不同的消息M1和M2,这两个消息不需要很相似。攻击者诱使真实用户使用RSA数字签名技术对消息M1和M2进行数字签名。诱使签名成功后,攻击者计算新消息M = M1
×
\times
×M2,然后声称消息M已经经过了真实用户的数字签名。
(2)只有密钥的攻击。在这种攻击中,假设攻击者只有真实用户的公钥。攻击者先想办法获得真实的消息M及其签名S。然后,攻击者试图创建另一个消息MM,这样,同一个签名S看上去对MM也是有效的。然而,这是一种不容易发起的攻击,因为其背后的数学知识要求非常高。
(3)已知部分消息的攻击。在这种攻击中,攻击者使用了RSA的一个特性,即具有不同签名的两个不同消息可以组合在一起,这样它们的签名也是可以组合的。例如,假设有两个不同的消息M1和M2,分别有签名S1和S2。这样,如果M= (M1
×
\times
×M2) mod n成立,那么在数学上S= (S1
×
\times
×S2) mod n也成立。因此,攻击者可以计算M = (M1xM2) mod n,然后计算S = (S1xS2) mod n来伪造签名。
5.DSA与数字签名
DSA算法利用下列变量:
p=长度为L位的素数,L=64的倍数,在512~ 1024之间。在原标准中,p总是512位。
q=(p-1)的160位素数因子。
g=
h
(
p
−
1
)
/
q
h^{(p-1)/q}
h(p−1)/qmod p,h是小于(p-1)的数,使得
h
(
p
−
1
)
/
q
h^{(p-1)/q}
h(p−1)/qmod p大于1。
x=小于q的数。
y=
g
x
g^{x}
gxmod p。
H=消息摘要算法(通常是SHA-1)。
前三个变量(p,q,g)是公开的,可以在非安全网络上任意发送。x是私钥,而相应的公钥是y。
假设发送方要将消息m签名,将签名消息发送给接收方,则会执行下列步骤:
(1)发送方产生小于q的随机数k。
(2)发送方计算如下:
r
=
(
g
k
m
o
d
p
)
m
o
d
q
r=(g^k mod p)mod q
r=(gkmodp)modq;
s
=
(
k
−
1
(
H
(
m
)
+
x
r
)
)
m
o
d
q
s=(k^{-1}(H(m)+xr))mod q
s=(k−1(H(m)+xr))modq,r和s是发送方的签名,发送方把这些值发送给接收方,为了验证签名,接收方计算如下步骤。
(3)
w
=
s
−
1
m
o
d
p
w=s^{-1}mod p
w=s−1modp;
u
1
=
(
H
(
m
)
∗
w
)
m
o
d
q
u1=(H(m)*w)mod q
u1=(H(m)∗w)modq;
u
2
=
(
r
w
)
m
o
d
q
u2=(rw)mod q
u2=(rw)modq;
v
=
(
(
g
u
1
∗
y
u
2
)
m
o
d
p
)
m
o
d
q
v=((g^{u1}*y^{u2})mod p)mod q
v=((gu1∗yu2)modp)modq。如果v=r,则签名正确,否则将其拒绝。