什么是RSA
来看一下百度百科的解释。RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。
今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战。
RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
客户端和后台的非对称加密
这里的客户端和后台非对称加密是指,用户第一次发起页面请求时,后台(C#)生成一对公钥和私钥,客户端利用JS和私钥对数据进行加密。这里主要是有一个js加密算法和C#加密算法兼容的地方。在客户端进行加密的主要原因是为了防止网络抓包,加密之后的数据即使被抓包,也是密文而不是明文。
代码
后台代码:
protected string strPublicKeyExponent = ""; protected string strPublicKeyModulus = ""; protected string DecryptPassword = ""; protected void Page_Load(object sender, EventArgs e) { //创建一个RSA对象 RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); if (string.Compare(Request.RequestType, "get", true) == 0) { //第一次页面请求时 //将私钥存Session中 Session["private_key"] = rsa.ToXmlString(true); } //把公钥适当转换,准备发往客户端 RSAParameters parameter = rsa.ExportParameters(true); RSAEnDecode myRsa = new RSAEnDecode(); strPublicKeyExponent = myRsa.BytesToHexString(parameter.Exponent); strPublicKeyModulus = myRsa.BytesToHexString(parameter.Modulus); }
前端代码:
这里只贴出加密方法:
<script src="Scripts/jQuery.md5.js" type="text/javascript" ></script>
<script src="Scripts/BigInt.js" type="text/javascript"></script>
<script src="Scripts/RSA.js" type="text/javascript"></script>
<script src="Scripts/Barrett.js" type="text/javascript"></script>
<script type="text/javascript"> function cmdEncrypt(originData) { setMaxDigits(129); var key = new RSAKeyPair("<%=strPublicKeyExponent%>", "", "<%=strPublicKeyModulus%>"); var Rtn = encryptedString(key, originData); return Rtn; } </script>
参考文章:
http://www.cnblogs.com/guogangj/archive/2012/03/05/2381117.html