密码学05 MAC
Message Authentication Code
简称MAC。通常我们不仅希望保证一条消息的内容没有被泄露(例如你向女神告白的信的内容),还希望我们发出去的消息没有被篡改过(例如你给女神的告白信不会被换成/修改成除了告白信之外的别的东西)。前者属于secrecy的范畴,后者则是integrity的范畴。
之所以会出现这样的需求,是因为我们开始考虑更“强大”的adversary了。原本的EAV-secure模型只能对窃听者进行建模,而通常我们的adversary不仅可以看(窃听),还可以摸(篡改消息)。并且我们发现原有的加密算法是无法保证integrity的。以OTP为例,攻击者在得到密文 后,可以通过翻转 任意的比特来实现篡改出任意可能的信息。即使他不知道消息本身是什么,他也可以伪造出任意的消息——反正任意的定长比特串都是合法消息
于是就有了MAC的闪亮登场!这样你给女神的真情表白就不会变成痴汉发言,战书,或者是别的什么东西了。
定义
一个MAC包括三个PPT算法,,其中
负责生成一个密钥 , 负责根据 生成一个标签(tag), 则会在 是 的一个合法tag时输出 ,否则输出
这里的 是确定性算法,而 则没有要求。这点是很显然,因为要保证:
- 正确的tag能被识别
- 错误的tag能被报出来
也就又是所谓的sound&complete了
看起来很像私钥加密,但是又不太一样: 是需要借助 来确认tag的正确性的,因此MAC往往不会单独使用,这里的 还需要加密保护起来。
然后就定义了几个性质
Correctness
没啥好说的,这个性质提示我们:
如果我们的 是确定性算法,那么我们的 就可以通过重新计算一次 ,然后比较 和 是否相同来判断这个tag是否合法。这被称为canonical way
Secrecy
其实就是如何保证我们的消息被篡改后,能从tag中反馈出来?
密码学给出的回答是这样的:如果任何PPT算法都不能造出一个对应的message-tag pair出来,那么我们就可以认为没有人能够给一个修改过后的消息 伪造tag,也即不存在消息被篡改后仍然能通过 了
形式化地写出来是一个 game:
- 首先生成一个 ,然后给一个 的oracle给adversary
- 可以任意查询oracle,然后输出一对答案 。期间我们会维护一个集合 ,表示 查询过的所有消息
- 检查 ,如果满足1. 且 2. ,就得到结果 ,否则为
我们称一个MAC scheme 是安全的,当且仅当 。这个安全性的全称也叫being existentially unforgeable under an adaptive chosen-message attack
这个定义就是很好地抓住(capture)了“不能伪造tag”这句话,看下来是很自然的。
如果细心一点可以发现,这里的 不一定是确定性算法,因此可以有一个 对应多个不同的 ,这说明上述定义会出现一些问题——Adversary完全可以给一条已经查询过的消息 构造出一个全新的tag。于是自然引出strongly secure MAC的定义:
太懒了,只需要把上面的 改成 就好了
结合canonical way的MAC可知,对所有canonical MAC有:如果它是secure的,那么它自然地就是strongly secure的
注意到这个strong secure的安全性要求仍然是很弱的。我们甚至并不要求Adversary输出的消息有含义,而只需要能构造出一条消息和对应的tag就好了。
构造
fixed-length MAC
构造一个定长MAC是比较简单的,只需要用一个PRF就好了。安全性的证明可以通过反证,然后构造一个区分PRF和真随机函数的攻击者 来完成,细节就留做习题吧~
arbitrary-length MAC
只讲讲怎么做到任意 的整数倍长度,其中 是单个 的extension factor(回忆上面说的用PRF构造MAC)
假设现在给了 个消息块,每个块都能单独用MAC构造tag,那么我们可以这么构造一个整体的tag:
- 规定 ,其中通常 ,initial vector的意思
- 规定
最后输出 就好了
安全性的证明比较简单,只需要对着 做数学归纳法就好了,可以发现每次都没法伪造的Adversary对于整体的tag束手无策
本文来自博客园,作者:jjppp。本博客所有文章除特别声明外,均采用CC BY-SA 4.0 协议
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~