0

我有一个网络服务,我正在从 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);
    }
}

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

4

1 回答 1

0

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

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

否则,代码有效。谢谢你们!!

于 2019-03-04T01:09:21.440 回答