《密码编码学与网络安全》---消息认证与Hash算法学习笔记

目录

导读

 一.信息安全的需求与通信系统典型攻击

二.消息认证(Message Authentication)

1.消息加密

1)对称加密:保密性与认证

2)差错控制

3)公钥加密

         4)私钥加密    

5)公钥加密:保密性、认证、签名

 2.消息认证码

1)基本方法与流程

2)MAC的基本用法

3)MAC的安全性

4)基于DES的消息认证码

5)加密认证的问题

 3.散列函数

1)基本定义与方法

2)散列函数的基本用法

3)散列函数的需求

4)Hash与MAC的区别

5)Hash函数通用结构

三.MD5


导读

      本文是《密码学与安全协议》这门课程第七章的学习笔记,大致分为两个部分:

1)消息认证

2)Hash算法

     主要内容如下:

 一.信息安全的需求与通信系统典型攻击

       信息安全的需求有:1)保密性  2)完整性  3)可用性  4)认证  5)不可否认性

       一个安全的认证系统,需满足:

1) 意向的接收者能够检验和证实消息的合法性、真实性和完整性
2) 消息的发送者和接收者不能抵赖
3) 除了合法的消息发送者,其它人不能伪造合法的消息
       通俗的讲,就是要接收方要能确保消息准确无误,通信双方都不能抵赖,别人也无法伪造假消息。

       通信系统典型攻击如下如所示:

       其中泄密和传输分析破坏了信息的保密性,因此需要通过加密算法进行加密来加以预防。而伪装、内容修改、顺序修改、时间修改都破坏了信息的完整性,这就需要消息认证来帮助通信双方确认消息是否被篡改,保证收到消息的是真实可靠的。

二.消息认证(Message Authentication)

       在生活中,如果有个亲戚发了个信息说急着用钱,让你赚钱给他,这时候我们通常会去联系这位亲戚来确认情况是否属实。在信息系统中,我们也想通过某种手段来实现消息的核实确认,这就引出了消息认证这一个概念。

       认证:一个短的字符串(值)V追加到消息M之后,用以认证该消息

        发送方: M  —>  M||V

                接收方:  M||V  —>  yes/no

注意:V要和M密切相关,也要与通信双方密切相关(V要通过M与某种算法生成,同时要与通信双方的密钥有关联)

       那么要想实现消息认证,我们首先需要找到这个生成字符串V的认证函数,然后再通过一个合理的认证协议来让消息接收者能够有某种方法来实现对消息的一个认证。

       其中,认证函数分成了三大类:1)消息加密函数  2)消息认证码MAC  3)散列函数

1)消息加密函数 (Message encryption) :用完整信息的密文作为对信息的认证
2)消息认证码 MAC (Message Authentication Code) :是密钥和消息的公开函数,产生一个固定长度的值作为认证标识
3) 散列函数 (Hash Function) :是一个公开的函数,它将任意长的信息映射成一个固定长度的信息,做为认证值

1.消息加密

       我们对消息的加密本身就可以作为是一个认证的度量,其中对称加密和公钥加密模式有所不同。回顾之前的学习内容,一共有五种形式的加密,我们一个个进行分析。

1)对称加密:保密性与认证

        A对B发送消息:消息M被A用对称密钥K进行加密,产生密文Ek(M)。接收方B用对称密钥K进行加密的逆运算(3-DES等)进行解密,得到明文M。

       通过我们对对称加密的了解,我们知道这种加密方式能够提供保密性,同时它也提供了认证,但这仅仅来源于A,由于消息进行了加密,攻击者很难准确地通过篡改密文使明文仍然可读(如果密文解密出来不可读,即解密出乱码,那么通信双方便知道遭受到了黑客攻击,便会放弃报文,达不到黑客消息篡改的目的),但由此我们也发现,这种认证机制需要某种结构或者冗余来使得密文解密出来的明文是可读的(比如ASKII码中每个字符都有特定的比特流,这就是一种结构)。不仅如此,在这种形式的加密下,因为没有数字签名,接收方可以自己伪造消息谎称是接收方发的,发送方也可以对发送的消息进行抵赖。总结起来就是以下三个特点:

2)差错控制

       图(a)差错控制下,我们首先进行差错控制,生成F(FCS),然后与消息M合并后用对称密钥K进行加密,生成密文Ek。然后接收方先用对称密钥K解开密文,然后通过差错控制算法对明文进行检验,如果通过则消息没有被篡改,否则丢弃此消息。这种情形下我们先差错控制,后加密,就能顺利运用加密的雪崩效应来隐藏明文与FCS的对应关系,从而达到认证的功能。但当黑客篡改了某个部分后,我们无法确认被篡改的是M还是F,还是都被篡改了,因为任何一个被改动都将导致无法匹配。

        图(b)差错控制发生在加密之后,这样我们的Ek和F能够被黑客同时篡改与比较,没有雪崩效应的掩护下,黑客能够轻松同时改动这两个部分使之重新匹配,进而掩盖消息已被篡改这一事实,因此图(b)无法实现消息认证功能。

3)公钥加密

        我们通过公钥加密体系当中的公钥加密这一个环节,能够提供消息的保密性,但与此同时像之前学习的一样,任何人都有B的公钥,人人都能给B发这样一个消息,所以无法提供消息认证(请注意,消息认证一定要满足上文所提到的那三个特点:不可抵赖、可确认、不可伪造)。

4)私钥加密

     

        我们知道私钥加密是拿发送方的私钥进行加密,而私钥只有本人才有,因此提供了签名,能够确保发送方的不可抵赖以及接收方的不可伪造。若我们能够提供某种结构或者冗余(与对称加密一样),那么我们能够通过明文是否可读来判断密文是否被篡改,从而实现消息认证。但我们要注意到,这种情况下任何人都是能解密出明文的。

5)公钥加密:保密性、认证、签名

       我们可以通过公钥加密整一个体系来进行加密,其中公钥加密提供了保密性,私钥加密实现了数字签名,也完成了认证(从4可知) 。我们回顾信息安全的需求,虽然我们现在实现了保密性、认证、不可否认性,但完整性和可用性却没有实现。由于没有一个校验的过程,我们无法对加密出来的消息进行完整性检验,更加不可能确保传输阶段不被篡改,因此该模式下完整性是没有实现的。而由于公钥加密体系的两个特点:1)速度慢(比DES慢100倍)2)加密长度有限制(不能超过密钥),因此该模式的可用性也相对较差。

 2.消息认证码

1)基本方法与流程

        消息认证码(MAC)的思路其实非常简单明了,就是使用一个只有通信双方知道的一个密钥生成一个固定大小的短数据块,然后加入到消息中。

       具体过程为,发送方通过一个共享密钥KM进行运算,得到消息认证码C',接收方收到消息后对解密出来的M' 也通过K进行同样的操作,生成C'',通过比较C'C''是否相同就可以知道消息是否被篡改。

       我们可以发现,MAC函数类似于一个加密算法,但我们不需要将C转换会M的逆过程,因此比加密算法的弱点要少。

2)MAC的基本用法

        第一种用法中,我们首先用K对M算出认证码C,之后与M合并后发给接收方,接收方收到消息后对M运算的出C',然后将其与C进行对照,若相同则没有被篡改。

        在这种模式下,由于只有通信双方有密钥K,黑客无法在将M进行篡改成M’的同时将C改成能与M’匹配的数据块。因此能够确保发送方进行消息认证。这里要注意,这种用法下没有进行加密,所以信息是以明文进行传输的,是可见的。

        第二种用法中,我们首先用K1生成认证码C,然后与M合并后再用对称密钥K2进行加密,之后发送给接收方。接收方收到密文后先用K2解密,再通过K1计算出新的认证码并与C对比,若一致则未被篡改。

       这种模式下K1提供了认证,K2提供了保密性,此时是密文传输,因此明文是不可见的。

       第三种用法中,我们先用对称密钥对明文进行加密,然后用K1对生成的密文进行运算得到认证码C,之后与密文进行合并发送给接收方,接收方分别用K1对密文运算得到新的认证码并与C比较和用K2对密文进行解码,若认证码对比无误则未被篡改。

       这种用法与第二种的功能一般无二,只是运算顺序不同。 

3)MAC的安全性

       

4)基于DES的消息认证码

      这里介绍的是最广泛的数据认证算法DAA(Data Authentication Algorithm),他使用了CBC(Cipher Block Chaining)的方式,初始向量为0。其中算法E与密钥K都和DES中的如出一辙,这里就不过多赘述。需要注意的是DAA仅需要最后的Os作为消息认证码,而CSC-DES中是每个Oi(1<=i<=s)都需要被使用的,这是不同点。

   

       首先将数据分段为D1,D2,...,DN,之后通过DES操作不断迭代最终生成出ON作为我们的DAC。

 5)加密认证的问题

 3.散列函数

1)基本定义与方法

       Hash函数H(M):输入为任意长的消息M,输出为一个固定长m(=128或=160)的散列值,这称为消息摘要(Message Digest),是所有消息位共同参与运算的一个函数,因此任何一位的变化都将导致散列值的变化。

        同时我们也不难发现,Hash是多对一的映射(明文空间是无穷大的,而散列值只有128或160位),且Hash不使用密钥!

2)散列函数的基本用法

        图(a)中,我们对消息M进行散列函数运算的到散列值H,将M与H合并之后通过对称密钥K进行加密,之后发送给接收方。接收方收到后用K进行解密,之后计算新的散列值并与K进行比较,如果相同则认证成功。

       这种用法我们通过散列函数与对称密钥加密实现了消息的保密性与完整性。

        图(b)中,我们计算出H后对H用对称密钥K进行加密得到E,之后将E与M进行合并,之后发送给接收方,接收方收到后对加密后的散列值进行解密得到D,然后与H进行散列对照,如果散列值相同则认证成功。

       这种方法实现了完整性,由于我们没有对明文加密,因此不具备保密性。

       图(c)中,我们计算出H后用发送方的私钥进行加密,之后合并发送给接收方。接收方用发送方公钥解密出散列值得到D后与自己通过散列函数运算M得到的H进行对照,如果相同则认证成功。

 

       图(d)中,我们计算出散列值H后先用发送方私钥进行签名,得到E,之后合并M和E并用对称密钥K进行加密。接收方首先使用对称密钥进行解密,然后用发送方公钥解密散列值,并与自己对M运算得出的散列值进行比较,相同则认证成功。

       这种方法首先通过对称密钥实现了保密性,然后通过散列函数实现了完整性,最后是私钥加密实现了签名。这里对散列值进行签名和前面课程所讲到的对原始数据进行签名有所不同,从可行性来讲,虽然散列函数是一个多对一的函数,但从目前的科学研究来讲,想找到两个明文产生相同密文还是非常困难的,所以具有一定的可行性。其次从效率来说,我们知道对称密钥加密效率是非常低的,所以我们通过对散列值进行加密大大提高了效率,综合来说,这样的方法目前是更优的。

 

        图(e)中,我们在M的后面加上了一段随机数S(S要被通信双方提前共享),然后进行散列函数计算得到散列值H,之后合并发送。接收方对M加上S后进行运算得到H',如果H'与H能够对应,则认证成功。

       这种方法主要提供了消息的真实性,可用于电视直播这种高码率的消息传输中,重点是S一定要被双方所共享。

       图(f)中,我们在图(e)的基础上加上了对称加密,实现了保密性,这里就不过多赘述。

 

        这是对着六种方法的一个总结,不难发现,有对称加密的就实现了保密性,有私钥加密的就实现了签名,而Hash实现的是认证功能。

3)散列函数的需求

 

       这里的强抗冲突就是很难找到两个不同的明文得到同样的散列值,弱抗冲突就是给定明文x,很难找到另一个明文y让他们的散列值相同。一个有前提,一个没有前提。 

4)Hash与MAC的区别

 5)Hash函数通用结构

 

       这里的Hash函数主要的形式是一个递归,数据包被分为大小为b的块,然后与上一步得到的n位的CV进行f复合运算得到新的n位的CV',最后得到的CVL就是散列值。这在后面的MD5算法钟还会有详细介绍,这里就不过多赘述。

三.MD5

       最后要介绍的就是MD5这一Hash函数。MD5是把数据分为512bits的块,并最终生成128bits的散列值的一个函数。

       整个函数的示意图如下:

       这里我们可以结合上文提到的Hash通用结构来粗略了解一下MD5:

1)它将原始数据M分为一个个长度为512bits的数据块 

2)最后一块的末尾是一个用于记录M长度的64bits的数据块(这个数据块在后续运算中是低字节在前,高字节在后的(低端存储格式),比如M=001001,则M''=001001||06 00 00 00 00 00 00 00),如果最后一块加上这64bits仍然不够标准块的512bits的话,就以100...0这个比特串来填充至512bits

3)初始值IV的长度为128bits,最终输出CV也是128bits

4)压缩函数f此时为HMD5函数

       我们可以知道,MD5就是一个标准的Hash函数,其内部是一个递归的操作,用于对任意长度的明文生成其对应的128位的散列值。 

       然后我们就要介绍最重要的压缩函数部分:

       首先要注意,我们将IV/CV拆分成了ABCD四个部分,每个部分32bits,并且都是低端存储格式,T[i](1<=i<=64)这个数据段通过sin函数生成,总共生成64个,对应着64次基本函数运算,X[k]这个数据段表示的是消息的子分组,即每个512bits的数据段进来后又被分为16个32bits的子分组,用于每个循环中的16次基本运算(每次循环的每次基本函数调用的X[k]都是有记录的,即每个HMD5压缩函数的64次基本运算每一个对应的这个k的值是相同的,下面具体运算中会展示),就此我们准备好了所有数据,可以开始运算了

       一个压缩函数经历四个循环,其中每个循环都有16个步骤,每个步骤都执行一次基本函数,每次基本函数执行完成后,都要对a,b,c,d进行前向移位操作(a,b,c,d->b,c,d,a->c,d,a,b......),其中每个循环对应着一个不同的复合函数g(后面会展示),如此执行4个循环,64个基本函数后就能得到最终的散列值了。下面是每次循环对应的g函数:

       他们代表着:

F(X,Y,Z) =(X&Y)|((~X)&Z)

G(X,Y,Z) =(X&Z)|(Y&(~Z))

H(X,Y,Z) =X^Y^Z

I(X,Y,Z)=Y^(X|(~Z))

       最后,每次的基本运算如下:

这四轮(64步)是:

第一轮

FF(a,b,c,d,M0,7,0xd76aa478)

FF(d,a,b,c,M1,12,0xe8c7b756)

FF(c,d,a,b,M2,17,0x242070db)

FF(b,c,d,a,M3,22,0xc1bdceee)

FF(a,b,c,d,M4,7,0xf57c0faf)

FF(d,a,b,c,M5,12,0x4787c62a)

FF(c,d,a,b,M6,17,0xa8304613)

FF(b,c,d,a,M7,22,0xfd469501)

FF(a,b,c,d,M8,7,0x698098d8)

FF(d,a,b,c,M9,12,0x8b44f7af)

FF(c,d,a,b,M10,17,0xffff5bb1)

FF(b,c,d,a,M11,22,0x895cd7be)

FF(a,b,c,d,M12,7,0x6b901122)

FF(d,a,b,c,M13,12,0xfd987193)

FF(c,d,a,b,M14,17,0xa679438e)

FF(b,c,d,a,M15,22,0x49b40821)

第二轮

GG(a,b,c,d,M1,5,0xf61e2562)

GG(d,a,b,c,M6,9,0xc040b340)

GG(c,d,a,b,M11,14,0x265e5a51)

GG(b,c,d,a,M0,20,0xe9b6c7aa)

GG(a,b,c,d,M5,5,0xd62f105d)

GG(d,a,b,c,M10,9,0x02441453)

GG(c,d,a,b,M15,14,0xd8a1e681)

GG(b,c,d,a,M4,20,0xe7d3fbc8)

GG(a,b,c,d,M9,5,0x21e1cde6)

GG(d,a,b,c,M14,9,0xc33707d6)

GG(c,d,a,b,M3,14,0xf4d50d87)

GG(b,c,d,a,M8,20,0x455a14ed)

GG(a,b,c,d,M13,5,0xa9e3e905)

GG(d,a,b,c,M2,9,0xfcefa3f8)

GG(c,d,a,b,M7,14,0x676f02d9)

GG(b,c,d,a,M12,20,0x8d2a4c8a)

第三轮

HH(a,b,c,d,M5,4,0xfffa3942)

HH(d,a,b,c,M8,11,0x8771f681)

HH(c,d,a,b,M11,16,0x6d9d6122)

HH(b,c,d,a,M14,23,0xfde5380c)

HH(a,b,c,d,M1,4,0xa4beea44)

HH(d,a,b,c,M4,11,0x4bdecfa9)

HH(c,d,a,b,M7,16,0xf6bb4b60)

HH(b,c,d,a,M10,23,0xbebfbc70)

HH(a,b,c,d,M13,4,0x289b7ec6)

HH(d,a,b,c,M0,11,0xeaa127fa)

HH(c,d,a,b,M3,16,0xd4ef3085)

HH(b,c,d,a,M6,23,0x04881d05)

HH(a,b,c,d,M9,4,0xd9d4d039)

HH(d,a,b,c,M12,11,0xe6db99e5)

HH(c,d,a,b,M15,16,0x1fa27cf8)

HH(b,c,d,a,M2,23,0xc4ac5665)

第四轮

Ⅱ(a,b,c,d,M0,6,0xf4292244)

Ⅱ(d,a,b,c,M7,10,0x432aff97)

Ⅱ(c,d,a,b,M14,15,0xab9423a7)

Ⅱ(b,c,d,a,M5,21,0xfc93a039)

Ⅱ(a,b,c,d,M12,6,0x655b59c3)

Ⅱ(d,a,b,c,M3,10,0x8f0ccc92)

Ⅱ(c,d,a,b,M10,15,0xffeff47d)

Ⅱ(b,c,d,a,M1,21,0x85845dd1)

Ⅱ(a,b,c,d,M8,6,0x6fa87e4f)

Ⅱ(d,a,b,c,M15,10,0xfe2ce6e0)

Ⅱ(c,d,a,b,M6,15,0xa3014314)

Ⅱ(b,c,d,a,M13,21,0x4e0811a1)

Ⅱ(a,b,c,d,M4,6,0xf7537e82)

Ⅱ(d,a,b,c,M11,10,0xbd3af235)

Ⅱ(c,d,a,b,M2,15,0x2ad7d2bb)

Ⅱ(b,c,d,a,M9,21,0xeb86d391)

       所有这些完成之后,将A、B、C、D分别加上a、b、c、d。然后用下一分组数据继续运行算法,最后的输出是A、B、C和D的级联。

       MD5算法的介绍到此结束!

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值