C# 加密值中的算术符号无法在c中的实时服务器上解密#

C# 加密值中的算术符号无法在c中的实时服务器上解密#,c#,encryption,cryptography,C#,Encryption,Cryptography,我在一个MVC3项目中工作。加密和解密方法在本地运行良好,但当我打开live时,一些值并没有命中。我发现像+,/这样的算术符号导致了这个问题。我如何解决这个问题 我的代码如下: RijndaelManaged aese = new RijndaelManaged(); public string Encrypt(string stringToEncrypt) { try { aese.Mode = CipherMode.CBC; aese.P

我在一个MVC3项目中工作。加密和解密方法在本地运行良好,但当我打开live时,一些值并没有命中。我发现像+,/这样的算术符号导致了这个问题。我如何解决这个问题

我的代码如下:

RijndaelManaged aese = new RijndaelManaged();  

public string Encrypt(string stringToEncrypt)
{
    try
    {
        aese.Mode = CipherMode.CBC;
        aese.Padding = PaddingMode.PKCS7;
        aese.BlockSize = 128;
        aese.KeySize = 128;
        aese.Key = Encoding.UTF8.GetBytes("bsGCslxDSrPTesVG");

        aese.IV = Encoding.UTF8.GetBytes("IkLNSuWfZaQdPQCS");

        byte[] inputByteArray = Encoding.UTF8.GetBytes(stringToEncrypt);

        ICryptoTransform crypto = aese.CreateEncryptor();
        byte[] cipherText = crypto.TransformFinalBlock(inputByteArray, 0, inputByteArray.Length);
        return (Convert.ToBase64String(cipherText));
    }
    catch
    {
        return "Encryption Error";
    }
}

public string Decrypt(string stringToDecrypt)
{
    byte[] inputByteArray = new byte[stringToDecrypt.Length + 1];
    try
    {
        aese.Mode = CipherMode.CBC;
        aese.Padding = PaddingMode.PKCS7;
        aese.BlockSize = 128;
        aese.KeySize = 128;
        aese.Key = Encoding.UTF8.GetBytes("bsGCslxDSrPTesVG");
        aese.IV = Encoding.UTF8.GetBytes("IkLNSuWfZaQdPQCS");
        inputByteArray = Convert.FromBase64String(stringToDecrypt);
        ICryptoTransform decrypto = aese.CreateDecryptor();
        byte[] plainText = aese.CreateDecryptor().TransformFinalBlock(inputByteArray, 0, inputByteArray.Length);

        return Encoding.UTF8.GetString(plainText);
    }
    catch
    {
        return "Dycription Error";
    }
}

考虑到您正在处理一个web项目,我猜您正在将Base64编码的密码文本作为URL或类似内容传递。由于Base64数据包含的字符在作为URL处理时会有不同的解释(例如,URL中的
+
被解释为空格),因此如果在URL中逐字包含Base64编码的数据,则数据将被损坏


如果要以这种方式传递Base64数据,则必须在将其包含在URL中之前对其进行正确的URL编码(例如,使用
System.Web.HttpUtility.UrlEncode()
)。

Base64有一个URL安全版本,它使用-(减号)表示值62,使用(下划线)表示值63。有关详细信息,请参见第5节。

Base64有一个URL安全版本,它对值62使用-(减号),对值63使用(下划线)。请参阅RFC4648了解详细信息。我很乐意将其作为一个单独的答案投票,@rossum。它的效率更高,并且有一个静态尺寸。好的,谢谢。我明白你说的意思。那么,加密和解密方法是错误的吗?那么如何克服这个缺陷。。。我可以用其他代码替换算术符号吗1.你有两个选择。使用URL安全版本的Base64,或者,正如Iridium所建议的,在将Base64字符串放入URL之前,需要对其进行URL编码。这样,“+”将更改为“&2B”,而“/”将更改为“%2F”。