Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 部分读取最终块后的填充错误_C#_Cryptography_Rijndael - Fatal编程技术网

C# 部分读取最终块后的填充错误

C# 部分读取最终块后的填充错误,c#,cryptography,rijndael,C#,Cryptography,Rijndael,我试图测试我的加密代码,并在处置decrypt时不断获取CyrptographicException“Padding is invalid and cannot remove”。如果我试图读取超过decrypt流末尾的内容,则会出现类似的错误,即使文档表明这不应该是问题 一个简化的例子: const int DATA_SET_SIZES = 102399; byte[] iv, key, startingData = new byte[DATA_SET_SIZE

我试图测试我的加密代码,并在处置
decrypt
时不断获取CyrptographicException“Padding is invalid and cannot remove”。如果我试图读取超过
decrypt
流末尾的内容,则会出现类似的错误,即使文档表明这不应该是问题

一个简化的例子:

const int DATA_SET_SIZES = 102399;

byte[] iv,
        key,
        startingData = new byte[DATA_SET_SIZES],
        encryptedData = new byte[((DATA_SET_SIZES - 1) / 16 + 2) * 16],
        endingData = new byte[DATA_SET_SIZES];//[((DATA_SET_SIZES - 1) / 16 + 1) * 16];
Random rand = new Random();

rand.NextBytes(startingData);       //Get test data.

using (Rijndael cryptAlg = Rijndael.Create())
{
    cryptAlg.Mode = CipherMode.CBC;
    cryptAlg.Padding = PaddingMode.ISO10126;

    iv = cryptAlg.IV;               //Use random IV during test.
    key = cryptAlg.Key;             //Use random Key during test.
    using (CryptoStream encrypt = new CryptoStream(new MemoryStream(encryptedData), cryptAlg.CreateEncryptor(key, iv), CryptoStreamMode.Write))
    {
        encrypt.Write(startingData, 0, startingData.Length);
        encrypt.FlushFinalBlock();
    }
    using (CryptoStream decrypt = new CryptoStream(new MemoryStream(encryptedData), cryptAlg.CreateDecryptor(key, iv), CryptoStreamMode.Read))
    {
        int dataRecieved = decrypt.Read(endingData, 0, endingData.Length);
    }
}
如果我执行以下操作之一,则异常将消失:

  • 更改
    cryptAlg.Padding=PaddingMode。在执行加密后但在创建
    解密之前,无
  • 更改
    const int DATA\u SET\u size=102400
    或块大小的任何其他倍数
  • 不要从最后一个块读取任何数据
是我做错了什么,还是.NET实现没有正确识别流的结尾


另外,有人知道为什么加密数据比存储加密数据所需的数据块长1块吗?该块中有什么?

您的
encryptedData
缓冲区太大。输入15个字节,然后返回32块缓冲区。由于您为
MemoryStream
构造函数提供了完整的缓冲区,因此它将一直读取到流的末尾。块解密永远不会失败,因此唯一会失败的是填充。最后一个块可能只包含零,因此解密的值是随机的,而不是匹配填充格式(大多数情况下)


尝试:
newbyte[(DATA\u SET\u size/16+
1
)*16]

我以前用
DATA\u SET\u size=102400
尝试过这个方法,得到了一个
不支持的异常--
“内存流不可扩展”。我刚刚用
DATA\u SET\u size=102399
DATA\u SET\u size=102401
再试了一次,效果很好。我想对于
PaddingMode.ISO10126
来说,缓冲区中需要有一个额外的字节来表示已经到达了末尾。我已更新(删除-1)并接受您的答案。谢谢,我花了好几个小时。哎呀,对不起,忘了把-1也取下来。ISO 10126(就像几乎相同的PKCS#7填充)总是填充,因此当您有16字节的纯文本数据时,它会添加一个完整的块。