在c#

时间:2016-05-03 08:51:32

标签: c#

我实现了代码加密和解密方法。输入字符串值传递给encrypt方法并获取存储在xml文件中的加密值。在我使用Decrypt方法读取值来获取加密值来读取xml文件之后。我很少遇到错误(加密输入值不正确和解密输出值)。我该如何解决这个问题。请分享给我。 这里是示例代码

public static string Decrypt(string cipherText)
{
    try
    {                   


        string incoming = cipherText.Replace('_', '/').Replace('-', '+');
        switch (cipherText.Length % 4)
        {
            case 2: incoming += "=="; break;
            case 3: incoming += "="; break;
        }
        byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
        byte[] cipherTextBytes = Convert.FromBase64String(incoming);
        PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, null);
        byte[] keyBytes = password.GetBytes(keysize / 8);
        RijndaelManaged symmetricKey = new RijndaelManaged();
        symmetricKey.Mode = CipherMode.CBC;
        ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes);
        MemoryStream memoryStream = new MemoryStream(cipherTextBytes);
        CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);
        byte[] plainTextBytes = new byte[cipherTextBytes.Length];
        int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
        memoryStream.Close();
        cryptoStream.Close();
        return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
    }
    catch (Exception ex)
    {                  

          return "Exception";
    }
}

2 个答案:

答案 0 :(得分:0)

您正在手动添加填充到数据的末尾,如果您在解密器上没有反转,那么它将无法工作(必须在您之前执行的脚本之后添加)。

但是,也就是说,填充是不必要的,AES256需要填充数据,是的,但是cryptostream会为你做到这一点,所以如果删除所有填充内容它将起作用。

答案 1 :(得分:0)

使用修剪()功能并移除所有白色空间

存在空格时可能会发生此问题。 使用Trim()函数删除空格。

示例 - :cipherText.Trim()