“坏数据”CryptographicException

首先,我只是为了学术目的而编写了以下代码。 我说这个的原因是因为我没有将它放在生产环境中,因此我“绕过”了我需要做的一些开销,我只需要能够使用加密/解密字符串下面的代码。 我能够做到这一点,但由于某种原因,我开始收到“CryptographicException Bad Data”,并且不确定是什么原因造成了这个问题。

private string RSAEncrypt(string value) { byte[] encryptedData = Encoding.Unicode.GetBytes(value); CspParameters cspParams = new CspParameters(); cspParams.KeyContainerName = _rsaContainerName; using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(2048,cspParams)) { encryptedData = RSA.Encrypt(encryptedData, false); return Convert.ToBase64String(encryptedData); } } private string RSADecrypt(string value) { byte[] encryptedData = Encoding.Unicode.GetBytes(value); CspParameters cspParams = new CspParameters(); cspParams.KeyContainerName = _rsaContainerName; using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(2048,cspParams)) { encryptedData = RSA.Decrypt(encryptedData,false); return Convert.ToBase64String(encryptedData); } } 

它只是在RSADecrypt调用上抛出此exception。

有任何想法吗? 我读到了可能与传递给RSA.Decrypt的encryptedData的预期大小有关的地方。

谢谢 }

  • 使用字符串编码(即Encoding.Unicode )来回转换明文。

  • 使用Base-64来转换加密数据(即Convert.[To/From]Base64String );

像这样:

 private string RSAEncrypt(string value) { byte[] plaintext = Encoding.Unicode.GetBytes(value); CspParameters cspParams = new CspParameters(); cspParams.KeyContainerName = _rsaContainerName; using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(2048,cspParams)) { byte[] encryptedData = RSA.Encrypt(plaintext, false); return Convert.ToBase64String(encryptedData); } } private string RSADecrypt(string value) { byte[] encryptedData = Convert.FromBase64String(value); CspParameters cspParams = new CspParameters(); cspParams.KeyContainerName = _rsaContainerName; using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(2048,cspParams)) { byte[] decryptedData = RSA.Decrypt(encryptedData,false); return Encoding.Unicode.GetString(decryptedData); } } 

http://sofzh.miximages.com/c%23/ Don’t rewrite requests for content (.png, .css) or scripts (.js) if (Request.Url.AbsolutePath.Contains(“/Content/”) || Request.Url.AbsolutePath.Contains(“/Scripts/”)) return; If uppercase chars exist, redirect to a lowercase version var url = Request.Url.ToString(); if (Regex.IsMatch(url, @”[AZ]”)) { Response.Clear(); Response.Status = “301 Moved Permanently”; Response.StatusCode = (int)HttpStatusCode.MovedPermanently; Response.AddHeader(“Location”, url.ToLower()); Response.End(); } }

所以

如果使用base64字符串编码完成加密

HTTP://本地主机:11430 / orderpreview的orderID = t4RZrnefb2a%253D及价格= 27.9

然后点击动作“Application_BeginRequest”将其转换为

HTTP://本地主机:11430 / orderpreview的orderID = t4rzrnefb2a%253D及价格= 27.9

您可以看到RZ被转换为小rz,这将使解密失败。

在RouteConfig类里面RegisterRoutes方法如果你想要小写的url,就把它放在里面

  routes.Canonicalize().Www(); routes.Canonicalize().Lowercase(); routes.Canonicalize().NoTrailingSlash();