首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

探讨 RSACryptoServiceProvider 数字签名有关问题

2012-05-20 
探讨 RSACryptoServiceProvider 数字签名问题!1、先用 RSACryptoServiceProvider 生成公、私钥C# codeRSACry

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

热点排行