当前位置: 代码迷 >> ASP.NET >> 探讨 RSACryptoServiceProvider 数字签名有关问题
  详细解决方案

探讨 RSACryptoServiceProvider 数字签名有关问题

热度:5810   发布时间:2013-02-25 00:00:00.0
探讨 RSACryptoServiceProvider 数字签名问题!
1、先用 RSACryptoServiceProvider 生成公、私钥
 
C# code
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();            privateK = rsa.ToXmlString(true);            publicK = rsa.ToXmlString(false);

2、私钥加密签名
 
C# code
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())            {                try                {                    rsa.FromXmlString(privateK);                    // 加密对象                     RSAPKCS1SignatureFormatter f = new RSAPKCS1SignatureFormatter(rsa);                    f.SetHashAlgorithm("SHA1");                    //hash后的数据只能通过密钥解密(为了保证数据的安全,可以用对称加密加密一下数据)                    byte[] source = System.Text.ASCIIEncoding.ASCII.GetBytes("shuju");                    SHA1Managed sha = new SHA1Managed();                    byte[] result = sha.ComputeHash(source);                    string s = Convert.ToBase64String(result);                    byte[] b = f.CreateSignature(result);                    str = Convert.ToBase64String(b);                    succes();                }                catch (Exception es)                {                    fail();                }            }

3、公钥验证
 
C# code
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())            {                try                {                    rsa.FromXmlString(publicK);                    RSAPKCS1SignatureDeformatter f = new RSAPKCS1SignatureDeformatter(rsa);                    f.SetHashAlgorithm("SHA1");                    byte[] key = Convert.FromBase64String(str);                    SHA1Managed sha = new SHA1Managed();                    byte[] name = sha.ComputeHash(ASCIIEncoding.ASCII.GetBytes("shuju"));                    string s = Convert.ToBase64String(name);                    if (f.VerifySignature(name, key))                        succes();                    else                        fail();                }                catch (Exception ee)                {                    fail();                }            }


PS:其中shuju是公开的。 公钥是公开的。 密文毫无疑问公开。

问题:看起来这貌似没什么问题。但模拟一下破解的方法,问题就来了,如果我同样生成一对新的公、私钥,用这新的私钥加密shuju,在用新的公钥验证,那不是同样就验证出来了吗。小第巨菜,忘高手指教....

------解决方案--------------------------------------------------------
顶一下,限于技术的问题,不敢发言
------解决方案--------------------------------------------------------
建议先看RSA
传送门
  相关解决方案