MAC学习笔记

1. MAC的基本思想

   消息验证码,利用密钥来生成一个固定长度的短数据块,并将该数据块附加到消息之后。假定通信双方比如A和B,共享密钥K。若A和B发送消息时,则A计算MAC,它是消息和密钥的函数,即MAC=C(K,M)其中,M时输入信息,C时MAC函数,K时共享的密钥,MAC是消息验证码。消息和MAC一起被发送给接收方。接收方对收到的消息用相同的密钥K进行相同的计算,得出新的MAC,并将接收到的MAC与其计算出的MAC进行比较,如果我们假定只有收发双方指导该密钥,那么若接收到的MAC与计算得到的MAC相等,则:
1. 接收方相信消息未被篡改.
2. 接收方确认消息来自真正的发送方,
3. 如果消息中含有序列号,则接收方确认消息顺序正确;


图中显示了三种常见的MAC基本原理,第一种只提供认证功能,不进行加密;第二种对明文进行计算MAC,然后对明文加MAC消息进行加密;第三种先对原始消息进行加密,再进行认证加密。最常用的方法是第二种

2.MAC的安全性分析

我们假定MAC由如下函数产生:
T=MAC(K,M)
其中M是一个变长消息,K是收发双方共享的密钥,MAC(K,M)是定长的认证符。在假定或已知消息正确时,将MAC附加于发送方的消息之后;接收方可以通过计算MAC来认证该消息。

MAC函数应具有的性质:

1. 若攻击者已知M和MAC(K,M),则他构造满足MAC(K,M‘)=MAC(K,M)的消息M’在计算上是 不可行的。翻译成人话就是:攻击者知道消息M和验证消息MAC,消息可以是加密的也可以是不加密的,但是不知道密钥,也不知道MAC函数,要尝试密钥和MAC函数,暴力尝试M‘得到M是超出计算能力的;
2. MAC(K,M)应是均匀分布的,即对任何随机选择的消息M和M’,MAC(K,M)=MAC(K,M‘)的概率是2^-n,其中n是MAC的位数。这种情况是为了阻止基于选择明文的穷举攻击,即攻击者不知道K,但是他知道MAC函数,能对消息产生MAC,而M是明文,是公开的,那么攻击者只要对各种消息计算MAC,直到与给定的MAC相同的消息为止。因为一般假定K的长度k>n,所以通过消息去破解比通过密钥破解某一次验证要快,平均需要2^n-1步才能找到具有给定MAC的消息。
3. 设M‘是M的某个已知的变换,即M’=f(M),例如f可能是将M的一位或多位取反,要求Pr[MAC(K,M)=MAC(K,M')]=2^-n。这一条是要求认证算法对消息的某部分或某些位不应比其他部分或位更弱,否则,已知M和MAC(K,M)的攻击者可能会对M中已知的"弱点"进行修改,比如一位或多位取反,然后再计算MAC,导致破解更加容易。

3.基于Hash的MAC:HMAC

3.1HMAC特点

HMAC,效率高、应用广、性质好、安全性强强的一种利用Hash函数实现MAC的方案。
HMAC是Bellare等人中提出的,其要求使用的Hash函数具有迭代结构(如MD5、SHA1、SHA2等)。所谓迭代结构就是反复的使用压缩函数f将长消息映射为短消息。这个压缩函数f具有两个输入;一个是长度魏l的链变量k,一个是长度为b的数据块x,表示为fk=f(k,x)。以SHA1为例,b=521,l=160。3.2HMAC设计目标

RFC2104给出了HMAC的设计目标:

  • 不必修改而直接使用现有的Hash函数。特步的,很容易免费得到软件上执行速度较快的Hash函数及其代码。
  • 如果找到或者需要更快或更安全的Hash函数,应能很容贵的替代原来嵌入的Hash函数。
  • 应保持Hash函数原有性能,不能过分降低其性能。
  • 对密钥的使用和处理应较简单
  • 如果已知嵌入的Hash函数的强度,则完全可以知道认证机制抗密码分析的强度

前两个目标是 HMAC 为人们所接受的重要原因, HMAC 将 Hash 函数视为 “黑盒” 有两个好 处。
第一. 模块化,便于封装
第二. 便于替代和更新,想要提高安全性时只需要提高Hash算法的安全性即可;上述最后一个设计目标实际上是 HMAC 优于其他基于 Hash 的一些方法的主要方面。只要嵌入的Hash 函数有合理的密码分析强度, 则可以证明 HMAC 是安全的。

3.3HMAC实现原理


符号定义:
H为嵌入的Hash函数(如MD5、SHA1、RIPEMD-160)
IV为Hash函数输入的初始值
M为HMAC的消息输入(包括由嵌入Hash函数定义的填充位)
Yi为M的第i个分组,0<=i<=(L-1)
L为M中的分位数
b为每一分组所含的位数
n为嵌入的Hash函数所产生的Hash码长
K为密钥;建议密钥长度>=n,若密钥长度大于b,则将密钥作为Hash函数的输入,来产生一个n位的密钥
K+为使K为b位长而在K左边填充0后所得的结果
ipad=00110110(十六进制数36)重复b/8次的结果
opad=01011100(十六进制数5C)重复b/8次的结果
HMAC可表述为:
算法流程如下:
1. 在K左边填充0,得到b位的K+(例如,若K是160位,b=512,则在K中加入44个字节的0)
2. K+与ipad执行异或运算(位异或)产生b位的分组Si。
3. 将M附加于Si后。
4. 将H作用与步骤3所得出的结果。
5. K+与opad执行异或运算(位异或)产生b位的分组Si。
6. 将步骤4中的Hash码附于S0后
7. 将H作用与步骤(6)所得到的结果,并输出该函数值。

K与ipad异或后,其信息为有一半发生了变化;同样,K与opad异或后,其信息位的另一半也发生了变
化,这样通过将Si与S0传给Hash算法中的压缩函数,我们可以从K伪随机地产生出两个密钥。
HMAC多执行了三次Hash压缩函数(对Si,S0和内部地Hash产生的分组),但是对于长消息,HMAC和嵌入地Hash函数地执行时间应该大致相同。

第二种实现方案:

实现HMAC有更为有效的方法,如图12.6所示。我们可以预计算两个值:
f(IV,(K+⊕ipad))f(IV,(K+⊕opad ))\begin{array}{l} f\left(\mathrm{IV},\left(K^{+} \oplus \mathrm{ipad}\right)\right) \\ f\left(\mathrm{IV},\left(K^{+} \oplus \text { opad }\right)\right) \end{array} f(IV,(K+⊕ipad))f(IV,(K+⊕ opad ))​
其中f(cv,block)是Hash函数地压缩函数,其输入是n位地链路变量和b位地分组,输出是n位的链接变量。上述这些值只在初始化或密钥改变时才需计算,实际上这些预先计算的值取代了Hash函数中的初值(IV)。这样,只多执行了一次压缩函数,在产生MAC的消息大多数都较短的情况下,这种实现特别有意义。

4.基于分组密码的消息验证码(CMAC)


首先,党消息长度是分组长度b的n倍时,我们考虑CMAC的运算情况。对AES,b=128,对于3DES,b=64.这个消息被划分为n组(M1,M2,…,Mn)。算法使用了k位的加密密钥K和m位的常数K1。对于AES,密钥长度k为128、192或256位,对于3DES,密钥长度为112或168位。CMAC按如下方法计算:

其中,T为消息验证码,也称为tag,Tlen是T的位长度,MSBs(X)是位串的X最左边的s位。
如果消息不实密文分组的整数倍,则最后分组的右边(低有效位)填充一个1和若干0使得最后的分布长度位b。除了使用一个不同的n位密钥K2代替K1外,和前面所述的一样进行CMAC计算。
两个n位的密钥由k位的秘密密钥按如下方式导出:

主题内容参考自教材《密码学编码原理与网络安全》,加入了一些自己的理解,希望能帮到一些朋友。

消息验证码 MAC (HMAC、CMAC) 原理、特点相关推荐

  1. 消息验证码-MAC算法总结

    密文截获篡改 如果使用的是对称加密,即通常一个算法和一个密钥的情况下,接收方只有使用与加密相同的密钥,才能解出正确的密文,如果使用了不同的密钥,解密出来的明文可能就是一串乱码.假如在确定密钥是与明文加 ...

  2. 【密码学原理】消息验证码MAC的构造方法:HMAC,DAA,CMAC

    HMAC RFC 2014给出了HMAC的设计目标: 不必修改而直接使用现有的hash函数. 如果找到或者需要更快或更安全的hash函数,应该很容易替代原来嵌入的hash函数 应保持Hash函数原有性 ...

  3. HMAC(2)哈希运算消息认证码HMAC

    1. 定义 HMAC(Hash-based Message Authentication Code)是一种基于加密Hash函数来实现的MAC算法. eg. HMAC-MD5(使用MD5作为Hash函数 ...

  4. 现代密码学4.2--消息验证码/MAC

    现代密码学4.2--消息验证码/MAC 定义 安全性 博主正在学习INTRODUCTION TO MODERN CRYPTOGRAPHY (Second Edition) --Jonathan Kat ...

  5. 【转】HMAC哈希消息认证码及算法原理

    HMAC算法原理 HMAC算法是一种基于密钥的报文完整性的验证方法 ,其安全性是建立在Hash加密算法基础上的.它要求通信双方共享密钥.约定算法.对报文进行Hash运算,形成固定长度的认证码.通信双方 ...

  6. alin的学习之路:加密相关知识(加密和解密,常见加密算法,消息验证码HMAC,数字签名)

    alin的学习之路:加密相关知识(加密和解密,常见加密算法,消息验证码HMAC,数字签名) 1. 加密和解密 1.1 加密的三要素 原始数据 加密操作: 明文 -> 密文 解密操作: 密文 -& ...

  7. HMAC的原理和应用

    转自:http://louisrb.blog.163.com/blog/static/756801292010014102633126/ hmac的原理 计算HMAC需要一个散列函数hash(可以是m ...

  8. 《深入理解分布式事务》第九章 可靠消息最终一致性分布式事务原理

    <深入理解分布式事务>第九章 可靠消息最终一致性分布式事务原理 文章目录 <深入理解分布式事务>第九章 可靠消息最终一致性分布式事务原理 一.基本原理 二.本地消息表 1.实现 ...

  9. RocketMQ(九):rocketMQ设计的全链路消息零丢失方案?+rocketmq消息中间件事务消息机制的底层实现原理?+half是什么?+half消息是如何对消费者不可见的?

    前言: 目前rocketmq更新已经更新了11篇博客了,预计接下来的2-3篇是暂时的更新进度了,准备更新一下springboot或者是jvm,mysql相关的专题出来,后续更新完事后,再分享一些实战性 ...

最新文章

  1. OpenCV读写xml和yml文件
  2. (转载)Markdown基本语法
  3. mysql服务怎么改名字_MySQL数据库改名字
  4. class字节码文件中的常量池结构详解
  5. 《高性能JavaScript》第八章 编程实践
  6. Codeforces Round #421 B
  7. java语言编程基础_java语言编程基础
  8. nginx 上传文件漏洞_文件上传及解析漏洞
  9. 2009 CCTV体坛风云人物颁奖盛典,精彩语录
  10. Jedis工具类使用及设置
  11. [SDOI2015]序列统计
  12. 电脑故障维修判断指导大全(5)
  13. 特斯拉接连出闹剧?一次比一次渗人...
  14. [转]如何设置opengl结合vc开发绚丽的3D图形---操作详解
  15. cacti mysql版本,cacti迁移+升级版本
  16. 电脑系统时间服务器地址,电脑时间同步服务器ip地址
  17. 甘超波:NLP潜意识和意识
  18. python 从def里面调用另一个def函数内容_在python中从一个类调用def到另一个类
  19. 基于 Servlet + jsp 的企业财务管理系统设计与实现
  20. JZ33 二叉搜索树的后序遍历序列 (未完结合JZ31)

热门文章

  1. havc是什么意思_HVAC系统是什么?
  2. 戏曲app开发,展现戏曲行业发展新生机
  3. 算法工程师也会遇到35岁这道坎么?
  4. 汽车电子_EMC测试_CE电流法整改
  5. 【笔记整理】通信原理第四章复习——数字基带传输
  6. 热电堆传感器主要参数详解
  7. we learn考试能切屏吗_高中英语听力答题技巧,你真的会吗?从此刻开始练习!...
  8. 对话框程序禁用系统的关闭按钮X
  9. PHP解析HTTP_USER_AGENT 获取客户端手机型号
  10. 小项目:单片机可控硅调光设计带光耦过零检测 元器件清单 源代码原理图等