CBC MAC:消息长度和长度前置
CBC MAC: message length and length prepending
我想在C++中使用CBC MAC。首先,我希望找到一些块密码的实现,我将在CBC模式中使用,我知道它是CBC MAC。但我有两个问题:
1) 如果要验证的消息长度不是分组密码分组长度的倍数,我该怎么办?
2) 为了加强CBC MAC,Wiki上提到的一种推荐方法是将消息的长度放在第一个块中。但是我应该如何将长度编码为字符串呢?还是二进制?如果密码的块长度是64位,我会把数字编码为64位数字吗?例如,如果消息长度为230,我应该使用以下值作为第一个块:
0000000000000000000000000000000011100110
-
这取决于第二个问题。你必须用一些东西"填充"消息,直到它是块大小的倍数。在计算MAC之前,将填充字节添加到消息中,但仅发送/存储原始消息等。
对于MAC,最简单的方法是用零填充。然而,这有一个漏洞——如果消息部分以一个或多个零结尾,攻击者可以添加或删除零,而不会更改MAC。但如果执行第2步,则此攻击和另一次攻击都会得到缓解。
-
如果在消息之前预先设置消息的长度(例如,不仅在第一个块中,而且在第一个区块中的第一件事),则会降低有时添加/删除零的能力。它还降低了攻击者伪造添加了整个任意额外块的消息的能力。因此,这是一件好事。出于完全实际的原因,这也是一个好主意——你可以在不依赖任何外部手段的情况下知道消息的字节数。
长度的格式是什么并不重要——一些编码的ASCII版本或二进制。然而,作为一个实际问题,它应该始终是简单的二进制。
长度中的位数没有理由必须与密码块大小匹配。长度字段的大小必须足够大,以表示消息大小。例如,如果消息大小可以在0到1000字节之间,则可以在前面加上一个无符号的16位整数。
这是在发送器和接收器上计算MAC之前首先完成的。本质上,长度与消息的其余部分同时进行验证,从而消除了攻击者伪造更长或更短消息的能力。
有许多像AES这样的块密码的开源C实现,它们很容易找到并开始工作。
洞穴大概这个问题的目的只是为了学习。任何认真的使用都应该考虑更强的MAC,如其他评论所建议的,以及一个好的加密库。还有其他非常微妙的弱点和攻击,所以你永远不应该试图实现自己的加密货币。我们都不是加密货币专家,这应该只是为了学习。
顺便说一句,我推荐布鲁斯·施奈尔的以下两本书:
http://www.amazon.com/Applied-Cryptography-Protocols-Algorithms-Source/dp/0471117099/ref=asap_bc?ie=UTF8
http://www.amazon.com/Cryptography-Engineering-Principles-Practical-Applications/dp/0470474246/ref=asap_bc?ie=UTF8
- boost::进程间消息队列引发错误
- 在线编译器中的分段C++没有打印消息
- C++错误消息*成员参考.**初学者*
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 如何通过参数抛出错误消息
- 从服务器传输到客户端的消息不会出现
- 如何使用CLion在Mac上创建一个新的.txt文件
- 如何使用Clang/GCC在Mac上为C/C++设置VSCode
- ROS2 动态消息模板
- 在 Mac 上使用 CMAKE 将 FFTW 和 FFTWPP 链接到项目中时未定义的符号
- 有人安装"IITB Simplecpp in mac"吗?
- libprotobuf 检查在 Mac OS 上执行程序时失败
- C++秘密消息学校作业
- glad 导致 glfwSwapBuffers 返回错误消息
- C++入门 5 版:类消息和文件夹
- CBC MAC:消息长度和长度前置
- 如何在Mac上从c++程序中自动获取异常类型和消息