0

これを読む前に、以下の自己回答を参照してください。問題は無効な入力でした。


いくつかの文字列を復号化しようとすると、次の例外がスローされます。

    "   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;
    }

助言がありますか ?!

PS私はあなたに94行目を示すためにコメントを書きました//これは94行目です

4

2 に答える 2

3

このFlushFinalBlockメソッドは、バイトの最後の完全または部分的なブロックをフラッシュすることのみを目的としています。したがって、複数のブロックサイズを書き込む場合は、適切なメソッド呼び出しを行うことはできません。代わりに、メモリストリームからの読み取りを試みる前に、単に暗号化ストリームを閉じてみてください。

コードのコンテキストでこれを行うには、行を削除するだけcs.FlushFinalBlock()です...

于 2012-01-12T13:52:06.197 に答える
0

問題は、Base64文字列として渡す文字列が無効であるということです。問題は入力ファイルにあるだけで、復号化が不可能です。

みんなありがとう

于 2012-01-14T12:56:51.483 に答える