首页 > 解决方案 > 使用填充解密消息时如何确定原始数据长度?

问题描述

我有一个使用 PaddingMode.Zeros 的 AES-128 加密字节数组。我解密它就好了,但是当数据以零结尾时,我无法弄清楚数据在哪里结束和填充开始。我们使用 AesCryptoServiceProvider 和 ICryptoTransform 进行加密和解密。

这是一个问题,因为我试图将未加密的字节数组解析为协议缓冲区。如果我尝试使用额外数据解析整个数组,则会收到错误“Google.Protobuf.InvalidProtocolBufferException:协议消息包含无效标签(零)”。如果我删除了太多的零(全部),我会收到另一个错误“Google.Protobuf.InvalidProtocolBufferException:解析协议消息时,输入在字段中间意外结束”。我尝试过使用 Google.Protobufers 和 Protobuf.net,它们都给出了类似的错误。

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

标签: c#encryptionaesprotocol-buffers

解决方案


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


推荐阅读