日期:2014-05-17  浏览次数:20557 次

探讨 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
传送门