设M为明文,KeA=<e,n>是A的公开密钥。KdA=<d,p,q,ϕ(n)>是A的保密的私钥。则A对M的签名SA=(Md)mod n,SA便是A对M的签名。验证签名的过程是:如果(SA)e mod n=M,则SA是M的签名。
RSA的数字签名很简单,但存在如下问题。
1.一般攻击
由于RSA密码的加密运算和解密运算具有相同的形式,都是模幂运算。设e和n是用户A的公开密钥,所以任何人都可以获得并使用e和n。攻击者首先随意选择一个数据Y,并用A的公开密钥计算X=(Y)e mod n,于是便可以用Y伪造A的签名。因为Y是A对X的一个有效签名。这种攻击实际上的成功率是不高的。因为对于随意选择的Y,通过加密运算后得到的X具有正确语义的概率是很小的。可以通过认真设计数据格式或采用Hash函数与数字签名相结合的方法阻止这种攻击。
2.利用已有的签名进行攻击
假设攻击者想要伪造A对M3的签名,他很容易找到另外两个数据M1和M2,使得
他设法让A分别对M1和M2进行签名;
于是攻击者就可以用S1和S2计算出A对M3的签名S3:
对付这种攻击的方法是用户不要轻易地对其他人提供的随机数据进行签名。更有效的方法是不直接对数据签名,而是对数据的Hash值签名。
3.利用签名进行攻击获得明文
设攻击者截获了密文C,C=Me mod n,他想求出明文M。于是,他选择一个小的随机数r,并计算(www.daowen.com)
因为x=re mod n,所以xd=(re)d mod n,r=xd mod n。然后攻击者设法让发送者对y签名,于是攻击者又获得
攻击者计算
于是攻击者获得了明文M。
对付这种攻击的方法也是用户不要轻易地对其他人提供的随机数据进行签名。最好是不直接对数据签名,而是对数据的Hash值签名。
4.对先加密后签名方案的攻击
假设用户A采用先加密后签名的方案把M发送给用户B,则他先用B的公开密钥eB对M加密,然后用自己的私钥dA签名。再设A的模为nA,B的模为nB。于是A发送如下的数据给B:
如果B是不诚实的,则他可以用M1抵赖M,而A无法争辩。因为nB是B的模,所以B知道nB的因子分解,于是他就能计算模nB的离散对数,即他就能找出满足(M1)x=M mod nB的x,然后公布他的新公开密钥为xeB。这时他就可以宣布他收到的是M1而不是M。
A无法争辩的原因在于下式成立:
为了对付这种攻击,发送者应当在发送的数据中加入时间戳,从而可证明是用eB对M加密而不是用新公开密钥xeB对M1加密。另一种对付这种攻击的方法是经过Hash处理后再签名。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。