|
原文链接:网络安全攻防:密码技术之数字签名
可以计算出一份文件的散列值,那么一旦文件被篡改其散列值也将变化,散列函数很好地解决了文件完整性保护的问题,然而并没有真正解决文件源认证的安全问题。如果攻击者不但把文件篡改了,同时还把文件散列值也响应修改,这样接收者就察觉不到文件已被篡改。
因此,需要一种类似于现实生活当中的签名机制,这种签名机制能保证所有人都能对文件的完整性进行认证,同时又能验证这份文件确实是发送者发的,攻击者无法伪造这个签名。数字签名(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。
数字签名就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。数字签名是公钥算法和散列算法的结合应用。
数字签名常常和散列函数在一起使用,给定一段明文M,可以计算出明文的散列值h(M),然后将散列值进行某种加密S后,附在明文上,结构如M|S(h(M))。
上述结构主要依赖于散列值不存在对撞,即不同的明文之间不会存在相同的散列值。实际上每种公钥加密体系都能设计实现相应的数字签名,代表性的有RSA签名和DSA签名。
1 .RSA数字签名
(1)秘钥生成
① 选择两个大素数p和q。
② 计算欧拉函数:φ(n)=(p−1)(q−1)。
③ 选择一个正整数e,使gcd(e,φ(n))=1,即e和φ(n)互为素数。
④ 根据de=1(modφ(n)),利用Euclid算法计算出d。
⑤ 公钥即为K=<e,n>。
⑥ 私钥即为S=<d,p,q>。
(2)签名过程
假设需加密和签名的信息为M,其中M在1,2,…,n−1这个范围内,H为散列函数,则签名的过程如下:
S=H(M)dmodn
(3)验证过程
计算明文的散列值H(M),同时用公钥e解密S,再比较H(M)是否和Semodn相同,如果相同则验签成功。
2. DSA签名
使用SHA散列加密函数,它的安全性也取决于离散对数的难题。它于1990年被提出,并且已经被US FIPS所接受,具体原理如下。
选择一个1 024 bit的素数p,此时有一个群组Zp。选择另一个160 bit的素数q,q除以p-1和q都在群组Gq中,并且群组Gq属于Zp。其中用到的散列算法是SHA-1。
(1)秘钥生成
① 选择p和q,条件就是上面所表达的,换成数学的表达方式就是p=zq+1,并且z属于群组Zp。
② 选择一个g,使jz=g(modp)成立,并且1<j<p。
③ 在范围1,…,q−1内选择一个随机数x。
④ 计算出来y=gxmodp。
⑤ 其中公钥就是K1=(p,q,g,y),私钥就是K2=(p,q,g,x)。
(2)签名过程
① 在范围1,…,q−1内选择一个随机数r。
② 计算出来s=(grmodp)modq。
③ 计算出t=((SHA−1(M)+xs)r−1)modq。
④ 将签名结果(s,t)附属在消息上。
(3)验签过程
① 计算出u1=(SHA−1(M)t−1)modq。
② 计算出u2=(st−1)modq。
③ 计算签名s1=((gu1yu2)modp)modq。
④ 比较s1是否与s相同。
|
|