繁体   English   中英

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

[英]RSA: Encrypt password in javascript but failed to decrypt that in 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; } 
    \n\n

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字符串并尝试解密但失败但异常:错误的数据:

[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 BCL功能,包括RSA实现,这样我甚至可以使用类似的类,属性和方法。 看看这个。 我可以确认它适用于.NET RSA实现。 试一试 - 这里有一些链接:

心连心

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM