C# 要解密的数据长度无效

C# 要解密的数据长度无效,c#,encryption,rijndaelmanaged,C#,Encryption,Rijndaelmanaged,我一直在研究我在尝试使用Rijndael C#库解密时遇到的一个问题。我已经尝试了几种已经发布在这里的解决方案,但似乎都不起作用 问题:我正在尝试解密从硬件发送的HTTP请求。但是,我没有将HTTP请求转换为与我的解密方法匹配的正确字节数(我认为这就是问题所在?) 这是我的密码: System.Text.Encoding enc = System.Text.Encoding.ASCII; System.Text.Encoding req = System.Text.Encoding.ASCII;

我一直在研究我在尝试使用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();
                }
            }
        }
    }
}
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;
在srDecrypt.ReadToEnd()上,我得到了标题中所述的错误消息


我对这一点还不太熟悉,所以我不确定我会错在哪里。如有任何建议,将不胜感激。谢谢~

“从流到字符串再到字节”的转换顺序感觉非常错误。确保您确实需要执行此操作,而不是简单地从响应中读取字节。

请在解密方法的底部尝试此操作:

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();
                }
            }
        }
    }
}
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;

我想我可能发现了你的问题。根据的构造函数,默认编码是
UTF8Encoding
。尝试使用其他构造函数重载并传入ASCII编码:

StreamReader sr = new StreamReader(
   curContext.Request.InputStream, Encoding.ASCII);
string request = sr.ReadToEnd();

为什么要使用两个不同的
RijndaelManaged
对象?上面代码中的代码似乎不起任何作用。还有其他代码用于加密响应并发回。该对象在那里使用,但该部分工作正常,不需要添加到此处。查看其加密方式将有助于确保解密匹配。我尝试解密的是在硬件上加密的,而不是由我的代码完成的。但是,我必须加密并返回HTTP响应。不一样的过程。当你加密HTTP响应时是否使用ASCII编码?你从哪里得到明文字节?仍然会得到相同的错误消息。字节数是122…但我认为应该是128?很抱歉,今天晚些时候我可能有时间帮助您。@加密-您为什么这么认为?您正在将
byte[]
传递给DecryptStringFromBytes方法。不清楚您是否需要
流->字符串->字节[]
转换。请注意,这可能很好——只是看起来做得不对。您是说只使用enc.GetBytes(curContext.Request.Inputstream.ToString())吗?这行不通。我希望直接从流中读取字节,但我不知道在您的情况下需要做什么。正如我所说的,您读取数据的代码可以非常好。@Encryption-您是否尝试过将steam转换为字节[],并将字节[]转换为字符串?看起来很奇怪,StreamReader.ReadToEnd()会给你你声称的错误。@ramhound问题是使用StreamReader将InputStream设置为string。直接转换为字节为我提供了正确的字节数,这正是我所需要的,并阻止了错误。由于UTF-8是ASCII的完整超集,我真的看不出这能实现什么。