什么是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
