4

我想将 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;
        }
    

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# 代码获取加密的密码字符串并尝试解密它但失败并出现异常:错误数据:

[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

谁知道如何解决?先感谢您。

4

1 回答 1

2

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

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

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

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

另外:我发现了一个很棒的 JS 库,称为 JavaScript.NET(来自 jocys.com),它反映了大量 .NET BCL 功能,包括 RSA 实现,这样我什至可以使用类似的类、属性和方法。看看这个。我可以确认它适用于 .NET RSA 实现。试一试 - 这里有一些链接:

Hth

于 2013-10-17T07:29:32.843 回答