DAY 21- 讯息监别码 MAC

「不是那个MAC。 不对,也不是汉堡。」


MAC能吃吗?

先前我们介绍了数位签章,今天我们要介绍的是MAC(message authentication code)讯息监别码。

讯息识别码同时拥有数位签章和杂凑函数的性质。
他可以验证讯息的完整性、可以任意输入固定输出长度、可以确认来源。
但是他没有不可否认性,而这个是数位签章有的。

然後当然,不能吃。

我们来讲一下MAC的操作。

https://ithelp.ithome.com.tw/upload/images/20211003/20140112jW3PeOKlQi.png

传送者将讯息用密钥 k 经过MAC运算之後加在讯息本身之後,并整批传送给对方。
密钥 k 也要用安全的通道传送。
收件者将收到的讯息中,原讯息的部分,用密钥 k 进入MAC运算,运算结果和传过来的讯息比对。
如果相同就证明讯息是完整的。

可以看到,MAC是一种对称式加密,传送者和接收者必须拥有同一把密钥。
既然双方拥有同一把钥匙,就没有办法证明讯息是由谁所生成。
也就是说没有不可否认性。
白话一点来说,Alice 可以说这个讯息不是他传的,因为 Bob 也有同一把钥匙。

所以 MAC 好在哪?

快。

还记得我们说过对称式加密比非对称式加密还要快吗?
MAC 是一种对称式加密(我们等一下会说怎麽算),
而数位签章是公钥加密,
理所当然的,MAC 会比数位签章快。

HMAC

听起来超猛的,有一种 X-men 的感觉,超级英雄,wow。
扯远了。

HMAC 的 H 就是 HASH(杂凑函数) 的意思。
我们利用 HASH 来达到讯息识别码的功能。

首先密钥要经过填充成为扩充密钥。
如上图,这个扩充密钥要和 IPAD 和 OPAD 做 xor 。

其中IPAD (inner pad)跟 OPAD(outer pad) 是两个常数。

和 IPAD xor 後的 k 接在讯息的後面进入杂凑函数运算,
运算结果接在「与 OPAD xor 後的 k」之後,进入杂凑运算。
运算结果即是输出值。

CBC-MAC

如果你对这串东西没有印象的话,请回去复习区块密码的操作模式。
他排在第一位,区块链的那位。

当时挖了一个坑,说 CBC 还有一个功能是讯息监别码。
过了十天,我们就来看这是怎麽回事。

CBC 就是区块链的意思(直翻的话),也就是前一个区块加密结果会影响下一个区块的加密结果,
我们之前说的 CBC 会把每一轮的加密结果储存下来成为密文,
但是在这里我们不需要他的加密功能,我们不用知道密文是什麽。

在这我们不记录每个区块的密文,我们只记录最後一个区块的。
可想而知,因为前面的区块会影响後面区块的加密结果,
这很符合MAC 所需要的讯息完整性监定。

GCM

同一天我们提到GCM。
GCM其实算是一种区块密码的操作模式,但是因为他具有 MAC 的性质,所以我把它搬来这里讲。

GCM,Galois Counter Mode,是CTR(counter mode)的扩充,需要用到 galois field 里的乘法运算。
不果我们是老少咸宜的频道,galois到底干了什麽,根本不重要。

https://ithelp.ithome.com.tw/upload/images/20211001/20140112VjGjVel4DL.png

其实GCM的加密方法就跟 CTR一模一样,只是为了达到MAC的效果,因此加上了下面的运算。

上图中的Auth Data 是由传送者自行设定的数字,而 H 则区块大小位元的全 0 数字加密後的结果。
因此mult H的意思即是乘上 H 。
经过运算之後所得到的结果Authentication Tag 即是GCM的结果。
而收件者只要确认这个tag的正确性即可知道讯息的完整性。


ok以上就是今天的内容,都学会了吗?
下次有人看到MAC只想到汉堡的时候就用这篇文教育他吧!

图片来源:
https://comp38411.jtang.dev/docs/mac-and-hash-functions/message-authentication-code/
https://www.researchgate.net/figure/Hash-Message-Authentication-Code-HMAC-process-332-Overview-of-SHA-256-SHA-256_fig2_346634579
https://www.chegg.com/homework-help/questions-and-answers/cbc-mac-algorithm-given-lecture-notes-pictures-secure-provided-following-holds-initialisat-q45616911
https://en.wikipedia.org/wiki/Galois/Counter_Mode


<<:  Day18 Let's ODOO: Paper Format

>>:  17. 当mentor比你想像的重要多

虾皮串接实作笔记-串接 API 虾皮物流标签

前言 目标:串接虾皮订单、标签资讯,目前串接虾皮 OpenAPI 2.0 版本,串接手册 串接步骤:...

[Day23]Vue3 E2E Testing: Cypress 基本介绍

What's Cypress Cypress 是 Vue.js 官方推荐的一个 E2E Testin...

Leetcode: 99. Recover Binary Search Tree | 含C++笔记

binary search tree中,本来遵守着从中间Node切开,左边小於右边的规则,但是现在有...

[Day12]C# 鸡础观念- 当我们同在一起~阵列(Array)

成绩单上有国,英,数,物理四科 分数分别70、89、72、93 这时候我们就可以用阵列将他们绑再一起...

Day22-Go net/http

前言 今天要来介绍 Go 语言里的网路操作,这边会以介绍 net/http 这个套件为主,并且介绍什...