0

Rijndael C#ライブラリを使用して復号化しようとしているときに発生している問題を調査してきました。ここに掲載されているいくつかの解決策を試しましたが、どれも機能または適用されていないようです。

問題:ハードウェアから送信されたHTTPリクエストを復号化しようとしています。ただし、HTTPリクエストが復号化方法に一致する正しいバイト数に変換されていません(これが問題だと思いますか?)。

これが私のコードです:

System.Text.Encoding enc = System.Text.Encoding.ASCII;
System.Text.Encoding req = System.Text.Encoding.ASCII;

if (curContext != null)
{
    string decrypted = "";
    int totalBytes = curContext.Request.TotalBytes;
    StreamReader sr = new StreamReader(curContext.Request.InputStream);
    string request = sr.ReadToEnd();

    if (!String.IsNullOrEmpty(request)) 
    {
        using (RijndaelManaged myRijndael = new RijndaelManaged())
        {
            myRijndael.Mode = CipherMode.ECB;
            myRijndael.Padding = PaddingMode.None;
            byte[] key = enc.GetBytes(WebConfigurationManager.AppSettings["32B"].ToString());
            myRijndael.KeySize = 256;
            myRijndael.Key = key;

            decrypted = DecryptStringFromBytes(req.GetBytes(request), myRijndael.Key);
        }
    }
}

そして復号化方法:

static string DecryptStringFromBytes(byte[] cipherText, byte[] Key)
{
    using (RijndaelManaged rijAlg = new RijndaelManaged())
    {
        rijAlg.Key = Key;
        rijAlg.Mode = CipherMode.ECB;
        rijAlg.Padding = PaddingMode.None;

        // Create a decrytor to perform the stream transform.
        ICryptoTransform decryptor = rijAlg.CreateDecryptor();

        // Create the streams used for decryption.
        using (MemoryStream msDecrypt = new MemoryStream(cipherText))
        {
            using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
            {
                using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                {
                    // Read the decrypted bytes from the decrypting stream
                    // and place them in a string.
                    plaintext = srDecrypt.ReadToEnd();
                }
            }
        }
    }
}

srDecrypt.ReadToEnd()で、タイトルに記載されているエラーメッセージが表示されます。

私はこれにかなり慣れていないので、どこが間違っているのかわかりません。何かアドバイスをいただければ幸いです。ありがとう〜!

4

3 に答える 3

0

「ストリームから文字列、バイトへ」の変換シーケンスは非常に間違っているように感じます。単に応答からバイトを読み取るのではなく、本当にそれを行う必要があることを確認してください。

于 2012-03-30T15:57:48.880 に答える
0

私はあなたの問題を見つけたかもしれないと思います。のコンストラクタによるとStreamReader、デフォルトのエンコーディングはUTF8Encodingです。他のコンストラクターのオーバーロードを使用して、ASCII エンコーディングで渡します。

StreamReader sr = new StreamReader(
   curContext.Request.InputStream, Encoding.ASCII);
string request = sr.ReadToEnd();
于 2012-03-30T19:50:51.497 に答える
0

代わりに、Decrypt メソッドの下部でこれを試してください。

int plainByteCount = int.MinValue;

// Create the streams used for decryption.
using (MemoryStream msDecrypt = new MemoryStream(cipherText))
{
  using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
  {
    plainBytes = new byte[cipherText.Length];
    plainByteCount = cryptoStream.Read(plainBytes, 0, plainBytes.Length);
  }
}

string plainText = Encoding.UTF8.GetString(plainBytes, 0, plainByteCount);

return plainText;
于 2012-03-30T16:00:54.917 に答える