指数数组的边界之外。 Rijndael加密

时间:2012-01-12 13:45:20

标签: c# encryption rijndaelmanaged

在花时间阅读本文之前,请参阅下面的自我回答。问题是输入无效。


当我尝试解密某些字符串时,会抛出此异常:

    "   at System.Security.Cryptography.RijndaelManagedTransform.DecryptData(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode paddingMode, Boolean fLast)
       at System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount)
       at System.Security.Cryptography.CryptoStream.FlushFinalBlock()
       at System.Security.Cryptography.CryptoStream.Dispose(Boolean disposing)
       at System.IO.Stream.Close()
       at System.IO.Stream.Dispose()
       at EBookReader.cryptography.DecryptString(String message, String KeyString, String IVString) in C:\\Users\\XWare\\Documents\\Visual Studio 2008\\Projects\\EBookReader\\EBookReader\\cryptography.cs:line 94"

在调试中,它会抛出此行的异常:

    byte[] messageBytes = Convert.FromBase64String(message);

我认为当解密的字符串太大时会出现这个问题,因为当我尝试加密和解密短字符串时,比如“你好我是X-Ware ”它工作正常

    public static string DecryptString(string message, string KeyString, string IVString)
    {
        byte[] Key = ASCIIEncoding.UTF8.GetBytes(KeyString);
        byte[] IV = ASCIIEncoding.UTF8.GetBytes(IVString);

        string decrypted = null;
        RijndaelManaged rj = new RijndaelManaged();
        rj.BlockSize = 256;
        rj.Key = Key;
        rj.IV = IV;
        rj.Mode = CipherMode.CBC;
        rj.Padding = PaddingMode.PKCS7;
        try
        {
            MemoryStream ms = new MemoryStream();
            Encoding enc = new ASCIIEncoding();
            using (CryptoStream cs = new CryptoStream(ms, rj.CreateDecryptor(Key, IV), CryptoStreamMode.Write))
            {
                byte[] messageBytes = Convert.FromBase64String(message);
                cs.Write(messageBytes, 0, messageBytes.Length);
                cs.FlushFinalBlock();  
            }// This is line 94
            byte[] encoded = ms.ToArray();
            decrypted = enc.GetString(encoded);

            ms.Close();
        }
        catch (Exception e)
        {
            Console.WriteLine("An error occurred: {0}", e.Message);
        }
        finally
        {
            rj.Clear();
        }

        return decrypted;
    }

有什么建议吗?!

P.S。我写了一条评论,向您展示第94行 //这是第94行

2 个答案:

答案 0 :(得分:3)

FlushFinalBlock方法仅用于刷新最后的完整或部分字节块。因此,如果您编写的块大小超过一个,则不是正确的方法调用。在尝试从内存流中读取之前,请尝试简单地关闭加密流。

要在代码的上下文中执行此操作,只需删除行cs.FlushFinalBlock() ...

答案 1 :(得分:0)

问题是我作为Base64字符串传递的字符串无效,问题只在输入文件中,这使得解密成为不可能

Thanx all