杂凑函数
杂凑函数又称为:Hash编码;Hash函数;散列编码:散列函数;单向压缩函数。
杂凑函数是一种特殊的单向函数。
我们在密码学中希望有一种函数满足:
(1)将x压缩成为固定长度的比特串y。
(2)不同的x一定要生成不同的y。
(3)由y的值无法倒算x的值。
但实际上,1和2通常是互不相容的。
所以,当函数 y=H(x)满足
(1)将任意长度的比特串x压缩成为固定长度的比特串。
(2)已知x,计算y=H(x)很容易;已知y,找一个x满足y=H(x)却很困难。这一性质称为单向性。
(3)找(x1,x2),x1≠x2,H(x1)= H(x2),很困难。这一性质称为无碰撞性。
这样的函数称为杂凑函数
杂凑函数的性质(3)强于性质(2),即由无碰撞性能够得到单向性。
数字签名
数字签名应具备的性质
完整性:一个被签了名的消息,无法分割成为若干个被签了名的子消息。
身份唯一性(不可伪造性):被Alice签名的消息只能由Alice生成 。
不可否认性(公开可验证性):被Alice签名的消息,在未来不能被Alice否认。
几种数字签名算法
RSA数字签名
RSA的密钥生成和之前的加密算法一样:选择两个大的素数p和q。选择两个正整数e和d,满足:ed是(p-1)(q-1)的倍数加1,即e·d=1(mod (p-1)(q-1))
计算n=p·q。
Alice的公钥是(n,e),私钥是d。取杂凑函数y=H(x)。
(1) Alice用H将消息m进行处理,得散列值h=H(m)。
(2) Alice用自己的私钥d对h “解密”得s=hd(mod n) 。
(3) Alice将(m,s)发送给Bob。
(4) Bob用Alice的公钥e,检验是否H(m)= se(mod n)。若是,则(m,s)是Alice发送的签名消息。
ElGamal数字签名
ElGamal的密钥生成也和之前类似:选择一个大的素数p。选择g,1<g<p。选择x,1<x<p-1。计算y=gxmod p。
Alice的公钥是(p,g,y),私钥是x。
(1) Alice用H将消息m进行处理,得h=H(m)。
(2) Alice选择秘密随机数k,满足0<k<p-1,且(k, p-1)=1,计算r=gk(mod p); s=(h-x·r)k-1(mod (p-1))。
(3) Alice将(m,r,s)发送给Bob。
(4) Bob用Alice的公钥,检验是否yrrs=gH(m) ( mod p)。若是,则(m,r,s)是Alice发送的签名消息。
Schnorr数字签名
Alice拥有3个正整数(p,q,g),向自己的通信伙伴公开。其中:
p是模数,它是一个素数,值的范围在2511到2512之间(即p是一个长度为512的比特串)。
q也是模数,也是一个素数, 2159 < q(即q是一个长度不小于160的比特串),并且q是p-1的一个因子。
g是域GF(p )的元素,且gq=1(mod p)。
Alice选择x,其中1<x<q。
Alice计算y=gx(mod p)。
Alice的公钥是(p,q,g,y), Alice的私钥是x。
(1)Alice选择秘密随机数k,满足0<k<q,计算r=gk(mod p);e=H(r, m); s=k+xe(mod q)。
(2) Alice将(m,e,s)发送给Bob。
(3) Bob用Alice的公钥,计算r’=gsy-e(mod p)。检验是否e=H(r’, m)。若是,则(m,e,s)是Alice发送的签名消息。
ElGamal和Schnorr的不同
在ElGamal体制中,g为域GF(p )的本原元素;而在Schnorr体制中,g只是域GF(p )的阶为q的元素,而非本原元素。因此从这个角度上说, ElGamal的安全性似乎高于Schnorr 。
签名长度比较: Schnorr比ElGamal签名长度短。
数字签名算法DSA
Alice拥有3个正整数(p,q,g),向自己的通信伙伴公开。其中:
p是模数,它是一个素数,值的范围在2511到2512之间(即p是一个长度为512的比特串)。
q也是模数,也是一个素数, 2159 < q(即q是一个长度不小于160的比特串),并且q是p-1的一个因子。
g是域GF(p )的元素,且gq=1(mod p)。
Alice选择x,其中1<x<q。
Alice计算y=gx(mod p)。
Alice的公钥是(p,q,g,y), Alice的私钥是x。
PS:上面这些和Schnorr一样。
(1) Alice用H将消息m进行处理,得h=H(m)。
(2) Alice随机地选择一个整数k(0<k<q),计算r=(gk(mod p))(mod q);s=(k-1(h+x·r))(mod q)。
其中k-1是k的关于(mod q)的逆元,即k-1k(mod q)=1,0< k-1 <q。(r, s)就是对消息m的签名, (m, r, s)就是发送给Bob的签名消息。
Bob做如下的检验:
(1)是否0<r<q,0<s<q。若是则继续检验,否则拒收签名。
(2)计算h=H(m),w=s-1(mod q),u1=h·w(mod q),u2=r·w(mod q),v=(gu1yu2(mod p))(mod q)。
如果v=r,则验证了签名是有效的,否则拒收签名。