Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.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#_Encryption_Aes_Protocol Buffers - Fatal编程技术网

C# 在使用填充解密消息时,如何确定原始数据长度?

C# 在使用填充解密消息时,如何确定原始数据长度?,c#,encryption,aes,protocol-buffers,C#,Encryption,Aes,Protocol Buffers,我有一个AES-128加密字节数组,使用PaddingMode.zero。我解密得很好,但当数据以零结尾时,我无法找出数据的结尾和填充的开始。我们使用AESCryptServiceProvider和ICryptoTransform进行加密和解密 这是一个问题,因为我试图将未加密的字节数组解析为协议缓冲区。如果我试图用额外的数据解析整个数组,我会得到一个错误“Google.Protobuf.InvalidProtocolBufferException:协议消息包含无效标记(零)”。如果我删除太多的

我有一个AES-128加密字节数组,使用PaddingMode.zero。我解密得很好,但当数据以零结尾时,我无法找出数据的结尾和填充的开始。我们使用AESCryptServiceProvider和ICryptoTransform进行加密和解密

这是一个问题,因为我试图将未加密的字节数组解析为协议缓冲区。如果我试图用额外的数据解析整个数组,我会得到一个错误“Google.Protobuf.InvalidProtocolBufferException:协议消息包含无效标记(零)”。如果我删除太多的零点(所有这些),我会得到另一个错误“GooGe.TimBuff.ValuePrimuloBuffelExtExc:当解析协议消息时,输入在一个字段的中间意外终止”。我试过使用Google.protobuffers和Protobuf.net,它们都给出了类似的错误


我如何判断数组中有多少填充?或者,在将数据解析为protobuf时,有没有办法防止出现错误?

使用
填充模式。在大多数情况下,不建议使用零。它通常仅在加密数据时使用,保证只包含非零字节(否则填充不能自动删除)。使用PKCS7,这是最常见的填充类型,可以自由地与任何类型的数据一起使用。

您发现的是为什么用零填充通常是个坏主意。它只能用于固定长度的数据,因此数据大小是预先知道的。请改用PKCS7,它始终是可移动的。或者尝试所有可能的零填充长度,其中一个应该有效。是的,这是一个很好的建议。不幸的是,我处理的是无法轻易更改的现有代码。然后你必须一次一个地切掉尾随的零,尝试在每次切掉后解密剩余的零。繁琐但可行。解密的数据是否包含一些长度字段,允许您计算protobuf数据的大小,从而计算填充的开始位置?我在文件的一个重新调整用途的部分上输入了一个长度,它不是超级干净的,但它就是它。我无法对该文件进行重大更改,因为它必须在平台之间共享,并且不能要求其他平台进行更改。我认为固件中使用的C库在缓冲区中有额外数据时不会引发异常。我同意这是最好的解决方案,我只是试图修复现有代码中的一个错误,并且无法轻松更改文件格式。我觉得在不改变文件来增加长度或改变填充的情况下,没有一个很好的方法来修复它。