c# - 使用填充解密消息时如何确定原始数据长度?
问题描述
我有一个使用 PaddingMode.Zeros 的 AES-128 加密字节数组。我解密它就好了,但是当数据以零结尾时,我无法弄清楚数据在哪里结束和填充开始。我们使用 AesCryptoServiceProvider 和 ICryptoTransform 进行加密和解密。
这是一个问题,因为我试图将未加密的字节数组解析为协议缓冲区。如果我尝试使用额外数据解析整个数组,则会收到错误“Google.Protobuf.InvalidProtocolBufferException:协议消息包含无效标签(零)”。如果我删除了太多的零(全部),我会收到另一个错误“Google.Protobuf.InvalidProtocolBufferException:解析协议消息时,输入在字段中间意外结束”。我尝试过使用 Google.Protobufers 和 Protobuf.net,它们都给出了类似的错误。
如何判断该数组中有多少填充?或者,有没有办法在将数据解析为 protobuf 时防止错误?
解决方案
PaddingMode.Zeros
大多数情况下不建议使用。它通常仅在加密数据时使用,保证仅包含非零字节(否则无法自动删除填充)。使用 PKCS7,这是最常见的填充类型,可以自由地用于任何类型的数据。
推荐阅读
- gradle - 如何在多项目 Gradle 构建中指定通用模块版本
- sql - 如何使用 SQL Server 将字符串转换为 json 字符串
- docker - 从 docker 容器名称中删除随机字符串
- reactjs - 反应表动态页面大小,但有大小限制和分页
- c++ - 如何针对 c++ 最棘手的解析声明和填充三维向量作为结构的成员?
- java - 如何遍历对的数组列表以检索指定键的值?
- kotlin - 为什么返回调用者适用于`List`而不适用于`Map`?
- javascript - 使用触摸板为 d3 v5 创建 Hold + Tap 行为
- javascript - 使用 JavaScript 将字符串中的元音替换为字符串中的索引
- c# - 如何从文本文件中打印随机行但排除包含某些字符的行?C#