读取POST数据中的字节流时,输入数据不是完整的块

时间:2019-03-01 20:09:27

标签: c# encryption aes encryption-symmetric ecb

我有一个Web服务,正在从POST请求读取数据流。但是,当我从Request.InputStream读取它时,出现了错误消息“ 输入数据不是完整的块”。

但是,当我尝试从我的同事发送给我的文件中读取文件时,即使它们包含相同的数据,它也可以工作。

以下是数据:

  

3721 b1cc 1759 3067 f993 7c3d bda9 4f04 547c ea1b 3974 2bd1 f213 74a5   2036 7927 e679 bab5 7bbc 3fbf 6a30 85e9 38a8 b877 4855 37e5 5751 f1da   ca75 578e 7d32 ce07 9e47 9ad7 34fe b70a 331d 7c4a a5e7 12b1 594a d329   74bb 5d24 2088 738a 9978 cecc 9a04 8686 c451 086b cd44 5e2b cb2b 98db   d9ec 73ef 9433 c9f3 185c 3d8e a610 6f30 642c 83e0 3ce4 4804 74aa 22cf   6378 d49c fd73 a6e9 d0ab 53cd 3cb5 f4da a05f 93c9 e4ae 6a53 91ee aa0d   72d7 3ab9 7100 302c

我的同事发送的文件是通过Lisp程序创建的,并且使用下面的代码成功解密了该文件。但是,当我在Request中将上述数据作为输入流读取并尝试对其进行解密时,它将引发错误。

           System.IO.Stream str; String strmContents;
           Int32 strLen, strRead;

           // read the data
           str = Request.InputStream;
           strLen = Convert.ToInt32(str.Length);
           byte[] strArray = new byte[strLen];
           strRead = str.Read(strArr, 0, strLen);
           strArray.ToArray();

// This works
byte[] data2 = File.ReadAllBytes("file.data").ToArray();
byte[] dec = decryptMessage(data2);

// This throws error
contents = decryptMessage(strArray);

public string decryptMessage(byte[] data)
{         
    byte[] decryptedBytes = Decrypt(data, key);
    return Encoding.UTF8.GetString(decryptedBytes);
}

public byte[] encryptMessage(string plainText)
{
    byte[] encryptedBytes = Encrypt(Encoding.UTF8.GetBytes(plainText), key);             
    return encryptedBytes;
}

public static byte[] Encrypt(byte[] data, byte[] key)
{
    using (AesCryptoServiceProvider csp = new AesCryptoServiceProvider())
    {
        csp.KeySize = 128;
        csp.BlockSize = 128;
        csp.Key = key;
        csp.Padding = PaddingMode.None;
        csp.Mode = CipherMode.ECB;
        ICryptoTransform encrypter = csp.CreateEncryptor();
        return encrypter.TransformFinalBlock(data, 0, data.Length);
    }
}

private static byte[] Decrypt(byte[] data, byte[] key)
{
    using (AesCryptoServiceProvider csp = new AesCryptoServiceProvider())
    {
        csp.KeySize = 128;
        csp.BlockSize = 128;
        csp.Key = key;
        csp.Padding = PaddingMode.None;
        csp.Mode = CipherMode.ECB;
        ICryptoTransform decrypter = csp.CreateDecryptor();
        return decrypter.TransformFinalBlock(data, 0, data.Length);
    }
}

如果您认为我做错了,请告诉我。

1 个答案:

答案 0 :(得分:0)

答案是错误的数据输入。我们检查了内容的长度并进行了散布,但是设备程序员意识到他向我发送了错误的加密数据文件,因此无法正常工作。

此外,要保留数据格式,我们必须使用Request.BinaryRead()而不是Request.inputStream。

否则,代码将起作用。谢谢你们!!