RSA:在javascript中加密密码但在C#中无法解密

我想在我的项目中应用RSA加密,但遇到了一些麻烦:

  1. 首先,我从http://www.ohdave.com/rsa/下载JavaScripts库,并添加对我的项目的引用;
  2. 其次,我已经定义了RSA对象和代码来初始化:

    internal RSACryptoServiceProvider Rsa { get { if (HttpContext.Cache["Rsa"] != null) { RSACryptoServiceProvider encryptKeys = (RSACryptoServiceProvider)HttpContext.Cache["Rsa"]; return encryptKeys; } else { return new RSACryptoServiceProvider(1024); } } set { HttpContext.Cache.Remove("Rsa"); HttpContext.Cache.Insert("Rsa", value); } } public ActionResult SignUp() { this.Rsa = Security.GetRsa(); RSAParameters param= this.Rsa.ExportParameters(true); //this will bind to view TempData["exponent"] = Util.BytesToHexString(param.Exponent); TempData["key"] = Util.BytesToHexString(param.Modulus);  UserInfo user = new UserInfo(); user.Birthday = DateTime.Now.Date; return View(user); } private RSACryptoServiceProvider GetRsa() { RSACryptoServiceProvider Rsa = new RSACryptoServiceProvider(1024); return Rsa; } 
     internal RSACryptoServiceProvider Rsa { get { if (HttpContext.Cache["Rsa"] != null) { RSACryptoServiceProvider encryptKeys = (RSACryptoServiceProvider)HttpContext.Cache["Rsa"]; return encryptKeys; } else { return new RSACryptoServiceProvider(1024); } } set { HttpContext.Cache.Remove("Rsa"); HttpContext.Cache.Insert("Rsa", value); } } public ActionResult SignUp() { this.Rsa = Security.GetRsa(); RSAParameters param= this.Rsa.ExportParameters(true); //this will bind to view TempData["exponent"] = Util.BytesToHexString(param.Exponent); TempData["key"] = Util.BytesToHexString(param.Modulus);  UserInfo user = new UserInfo(); user.Birthday = DateTime.Now.Date; return View(user); } private RSACryptoServiceProvider GetRsa() { RSACryptoServiceProvider Rsa = new RSACryptoServiceProvider(1024); return Rsa; } 

3.然后,在JavaScript方面,我有代码,它加密密码用户输入和绑定它控制:

 var hash = document.getElementById("Pwd").value; var exponent = document.getElementById("exponent").innerHTML; var rsa_n = document.getElementById("key").innerHTML; setMaxDigits(131); var key = new RSAKeyPair(exponent, "", rsa_n); hash = encryptedString(key, "111"); document.getElementById("Pwd").value = hash; document.getElementById("Pwd2").value = hash; document.getElementById("error").innerHTML = ""; document.getElementById("submit").click(); 

4.当用户单击提交时,我的C#代码获取加密的pwd字符串并尝试解密但失败但exception:错误的数据:

 [HttpPost] public ActionResult SignUp(UserInfo user) { user.UserId = user.UserId.ToLower(); //ignore case user.UserGUID = Guid.NewGuid(); user.CreatedDate = DateTime.Now; user.IsEnabled = false; user.Pwd = Convert.ToBase64String(Rsa.Decrypt(Util.HexStringToBytes(user.Pwd), false));//Exception:Rsa.Decrypt throw bad data exception 

你知道怎么解决这个问题吗? 先感谢您。

我有一个非常类似的问题,因为大多数基于JavaScript的RSA加密解决方案与.NET的实现并不“兼容”。

我在网上发现的几乎所有实现都有以下一个或两个项目导致与.NET的实现不兼容。

  • JavaScript中的字节顺序编码与.NET使用的字节顺序不同。 这是一个很大的问题,例如,JS中的字符串与.NET中的字节顺序不同,因此您需要在加密前和解密后进行转换。 我相信它只需要反转字节顺序以匹配.NET,但不要引用我的话。

  • 填充是不同的:.NET默认为RSA使用OAEP填充,因此RSA的JS实现也应该支持相同的填充。 我相信OAEP填充也称为PKCS#1 v2.0填充,但也不引用我。

旁白:我发现了一个名为JavaScript.NET(来自jocys.com)的惊人的JS库,它反映了大量的.NET BCLfunction,包括RSA实现,这样我甚至可以使用类似的类,属性和方法。 看看这个。 我可以确认它适用于.NET RSA实现。 试一试 – 这里有一些链接:

  • Jocys JS.NET代码项目演示
  • Jocys JS.NET下载

心连心