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