为什么解密不会返回预期值?

时间:2014-04-13 22:01:31

标签: c# encryption rijndael cryptostream

当使用c#rijndael解密以前加密并保存在sql server ce中的字符串时,我从解密中得不到任何回报。我可以通过调试和检查数据库来判断解密的字符串似乎是按预期保存的,并为不同的输入字符串设置了不同的废话集,因此我假设问题出现在解密代码中。我还确认cipherText输入参数在从db检索并重新生成字节数组后获得了正确的字节数。我使用了以下示例:  http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndael%28v=vs.110%29.aspx执行此操作,并进行一些修改。

static string DecryptStringFromBytes(byte[] cipherText, byte[] Key, byte[] IV)
    {
        // Check arguments. 
        if (cipherText == null || cipherText.Length <= 0)
            throw new ArgumentNullException("cipherText");
        if (Key == null || Key.Length <= 0)
            throw new ArgumentNullException("Key");
        if (IV == null || IV.Length <= 0)
            throw new ArgumentNullException("Key");

        // Declare the string used to hold 
        // the decrypted text. 
        string plainText = null;

        // Create an Rijndael object 
        // with the specified key and IV. 
        using (Rijndael rijAlg = Rijndael.Create())
        {
            rijAlg.Key = Key;
            rijAlg.IV = IV;
            rijAlg.Padding = PaddingMode.PKCS7;

            // Create a decrytor to perform the stream transform.
            ICryptoTransform decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);
            var plainBytes = new byte[cipherText.Length];
            int plainByteCount;

            // Create the streams used for decryption. 
            using (MemoryStream msDecrypt = new MemoryStream(cipherText))
            {

                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {

                    plainByteCount = csDecrypt.Read(plainBytes, 0, plainBytes.Length);

                    using (StreamReader srDecrypt = new StreamReader(csDecrypt, System.Text.Encoding.Unicode))
                    {
                        // Read the decrypted bytes from the decrypting stream 
                        // and place them in a string.
                        plainText = srDecrypt.ReadToEnd();

                    }

                }
            }
        plainText = Encoding.Unicode.GetString(plainBytes, 0, plainBytes.Length);

        }

        return plainText;

    }

目前

 plainText = srDecrypt.ReadToEnd();

plainText获取值“”,我希望它是解密的单词。

最后,在

   plainText = Encoding.Unicode.GetString(plainBytes, 0, plainBytes.Length);

plainText变为:“\ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0”

我已经尝试了各种填充选项,无论是在加密和解密阶段,都可以看到这样做有效但却无法解决问题。在没有设置填充的情况下,首先将0字节加密,其中应该是16字节。我也尝试了不同的方法来调用flush和flushfinalblock。我将密钥/ iv存储在纯文本文件中(我知道这可能不是安全的最佳实践,我现在的目标只是了解有关此主题的更多信息)。

请帮助我找到我在这里做错的事。

1 个答案:

答案 0 :(得分:0)

我在VB.NET中遇到过类似的问题,发现在加密和解密过程中使用的变量应该是相同的。赋予加密和解密函数自己的局部变量肯定会导致解密函数返回错误的值。尝试将密钥和iv设为全局变量而不是局部变量。