1、第5章 消息认证主要内容 消息认证基本概念消息认证基本概念 消息加密认证消息加密认证 消息认证码消息认证码 hash函数函数 概 念 认证(Authentication):即鉴别、确认,它是证实某事是否名副其实,或是否有效的一个过程。认证与加密的区别:加密用以确保数据的保密性,阻止对手的被动攻击,如截取、窃听。认证用以确保报文发送者和接受者的真实性以及保文的完整性,阻止对手的主动攻击,如冒充、篡改、重播等。认证往往是应用系统中安全保护的第一道防线,极为重要。基本思想 通过验证称谓者(人或事)的一个或多个参数的真实性和有效性,来达到验证称谓者是否名副其实的目的。常用的参数有:口令、标识符、密钥、
2、信物、智能卡、指纹、视网纹等。利用人的生理特征参数进行认证的安全性高,但技术要求也高,至今尚未普及。目前广泛应用的还是基于密码的认证技术。没有消息认证的通信系统是极为危险的 消息认证(Message Authentication)消息认证用于抗击主动攻击消息认证用于抗击主动攻击 验证接收消息的真实性和完整性验证接收消息的真实性和完整性 真实性真实性 的确是由所声称的实体发过来的的确是由所声称的实体发过来的 完整性完整性 未被篡改、插入和删除未被篡改、插入和删除 验证消息的顺序性和时间性(未重排、重验证消息的顺序性和时间性(未重排、重放和延迟)放和延迟)需求1.泄密:将消息透露给没有合法秘密钥的
3、任何人或程序。2.传输分析:分析通信双方的通信模式,如连接频率,时间等3.伪装:攻击者产生一条消息并声称来自某合法实体4.内容修改:对消息进行插入、删除、转化、修改5.顺序修改:对消息顺序进行插入、删除、重新排序6.计时修改:对消息的延时和重放7.发送方否认8.接受方否然对付1、2可用加密;对付3、4、5、6可用消息认证;对付7、8可用数字签名消息认证的基本概念 消息认证:验证所受到的消息确定是来自真正的发送方且未被修改过。认证符:一个用来认证消息的值。由消息的发送方产生认证符,并传递给接收方。认证函数:产生认证符的函数,认证函数实际上代表了一种产生认证符的方法。消息加密消息认证码Hash函数
4、消息加密-在对称加密体制下 由于攻击者不知道密钥K,他也就不知道如何改变密文中的信息位才能在明文中产生预期的改变。接收方可以根据解密后的明文是否具有合理的语法结构来进行消息认证。但有时发送的明文本身并名优明显的语法结构或特征,例如二进制文件,因此很难确定解密后的消息就是明文本身。MEKEK(M)DKM 根据明文M和公开的函数F产生FCS,即错误检测码,或帧校验序列,校验和。把M和FCS合在一起加密,并传输。接收端把密文解密,得到M。根据得到的M,按照F计算FCS,并与接收到的FCS比较是否相等。MFFMFCS比较EK|()KEMF MDKMFCS内部错误控制 攻击者可以构造具有正确错误控制码的
5、消息,虽然攻击者不知道解密后的明文,但可以造成混淆并破坏通信。()KE MMFFCSEK()KF EMDKM外部错误控制F比较()KEM()KEM消息加密-在公钥加密体制下 由于大家都知道B的公钥,所以这种方式不提供认证,只提供加密。MEKUbEKUb(M)DKRbMI.普通加密AB消息加密-在公钥加密体制下 由于只有A有用于产生EKRa(M)的密钥,所以此方法提供认证。由于大家都有KUa,所以此方法不提供加密。MEKRaEKRa(M)DKUaMII.认证和签名AB消息加密-在公钥加密体制下 提供认证和加密。一次通信中要执行四次复杂的公钥算法。MEKRaEKRa(M)DKUaMIII.加密认证
6、和签名ABEKUbEKUb(EKRa(M)DKRbEKRa(M)消息认证码(MAC)Message Authenticaion Code 消息认证码是消息和密钥的公开函数,它产生定长的值,以该值作为认证符。利用密钥和消息生成一个固定长度的短数据块,并将其附加在消息之后。通信双方共享密钥K消息认证码用于认证A和B共享密钥KA计算MAC=Ck(M),M和MAC一起发送到BB对收到的M,计算MAC,比较两个MAC是否相同。M CMACK C比较MKMAC如果两个MAC相等,则:1.接收方可以相信消息未被修改,因为如果攻击者改变了消息,由于不知道k,无法生成正确的MAC。2.接收方可以相信消息的确来自
7、确定的发送方。因为其他人不能生成和原始消息相应的MAC。MAC函数与加密函数的区别 MAC函数与加密函数类似,都需要明文、密钥和算法的参与。但MAC算法不要求可逆性,而加密算法必须是可逆的。例如:使用100比特的消息和10比特的MAC,那么总共有2100个不同的消息,但仅有210个不同的MAC。也就是说,平均每290个消息使用的MAC是相同的。因此,认证函数比加密函数更不易被攻破,因为即便攻破也无法验证其正确性。关键就在于加密函数是一对一的,而认证函数是多对一的。消息认证码的基本用途 只提供消息认证,不提供保密性。(见前)提供消息认证和保密性:M|CK1CMCK(M)K1比较EK2)(|12M
8、CMEKKDK2ABA和B共享K1和K2K1:用于生成MACK2:用于加密与明文有关的认证消息认证码的基本用途 提供消息认证和保密性:ABA和B共享K1和K2K1:用于生成MACK2:用于加密与密文有关的认证M|CK1CK1比较EK2)(21MECKKDK2对MAC的攻击攻击密钥 已知消息M1和MAC算法C,以及MAC1=C k1(M1),现要破解k1。密钥为k个bit,MAC为n个bit。当knkn:可能的密钥个数为2k。可能的MAC个数为2n个。所以许多不同的密钥(约2k-n个),计算出来的MAC都等于MAC1。这些密钥中哪一个是正确的密钥不得而知。这时需要新的M-MAC对来测试这2k-n
9、个密钥,于是有如下的重复攻击:重复攻击 Step 1:给定M1和MAC1=C k1(M1)对所有2k个密钥,判断MACi=C ki(M1)匹配数约为:2k-n Step 2:给定M2和MAC2=C k1(M1)对所有2k-n个密钥,判断MACi=C ki(M2)匹配数约为:2k-2n 平均来讲,若k=x*n,则需x次循环才能找到正确的密钥。所以,用穷举法攻破MAC比攻破加密算法要困难得多。对MAC的攻击攻击算法 考虑下面的算法:消息M=(X1X2Xm)是由64比特长的分组Xi(i=1,m)链接而成 MAC算法是:加密算法是DES。因此,密钥长为56比特。如果敌手得到MCK(M),那么敌手使用穷
10、搜索攻击寻找K将需做256次加密。很困难!但攻击者可以改变M的内容,却使MAC正确。方法如下:12()()()mKKMXXXC MEM 用Y1替换X1,Y2替换X2,Ym替换Xm,其中Y1,Y2,Ym 是攻击者编造的假消息。且 Ym=Y1 Y2 Ym-1 (M),当接收者收到这个消息:M=(Y1Y2Ym)则(M)=Y1 Y2 Ym =(M)所以:CK(M)=CK(M)通过了验证,攻击得逞。MAC函数应具有的性质 若攻击者已知M和CK(M),则他构造满足:CK(M)=CK(M)的消息M在计算上不可行 CK(M)应试均匀分布的,即对于随机消息M和M,CK(M)=CK(M)的概率是2-n,n是MAC
11、的位数基于DES的消息认证码 使用最广泛的MAC算法之一:数据认证算法 过程:把需要认证的数据分成连续的64位的分组。若最后一个分组不是64位,则填0 利用DES加密算法E和密钥K,计算认证码。112213321()()()()KKKNKNNOEDOEDOOEDOOEDO数据认证算法似乎可以满足前面提出的要求。DAC M-bits(16 to 64 bits)为什么不直接使用加密而使用分离的消息认证码?保密性与真实性是两个不同的概念 根本上,信息加密提供的是保密性而非真实性 加密代价大(公钥算法代价更大)鉴别函数与保密函数的分离能提供功能上的灵活性 某些信息只需要真实性,不需要保密性 广播的信
12、息难以使用加密(信息量大)网络管理信息等只需要真实性 政府/权威部门的公告Hash函数(杂凑函数、散列函数)Hash的特点:与消息认证码一样,hash函数的输入是可变的消息M,输出是固定大小的hash码H(M),或称消息摘要(Message Digest)、hash值。与消息认证码不同的是,hash码的产生过程中并不使用密钥。Hash码是所有消息的函数,改变消息的任何一位或多位,都会导致hash码的改变。Hash算法通常是公开的。又称为:哈希函数、数字指纹(Digital finger print)、压缩(Compression)函数、紧缩(Contraction)函数、数据鉴别码DAC(Da
13、ta authentication code)、篡改检验码MDC(Manipulation detection code)h=H(M)假定两次输入同样的数据,那么散列函数应该能够生成相同的散列值。输入数据中的一位发生了变化,会导致生成的散列值完全不一样。散列函数有个非常重要的特性为单向性,也就是从M计算h容易,而从h计算M不可能。散列函数H必须满足以下几个性质 H对于任何大小的数据分组,都能产生定长的输出。对于任何给定的M,H(M)要相对易于计算。单向性:对于任何给定的hash值h,计算出M在计算上不可行。弱无碰撞性:对任何给定的M1,寻找M2,使H(M1)=H(M2)在计算上不可行。强无碰撞
14、性:寻找任何的(M1,M2),使H(M1)=H(M2)在计算上不可行。Hash与MAC的区别 MAC需要对全部数据进行加密 MAC速度慢 Hash是一种直接产生鉴别码的方法 Hash可用于数字签名常用Hash算法 迭代型hash函数的一般结构fffY0Y1YL-1bbbnnnnnIV=CV0CV1CVL-1CVL明文M被分为L个分组Y0,Y1,YL-1b:明文分组长度n:输出hash长度CV:各级输出,最后一个输出值是hash值无碰撞压缩函数f是设计的关键迭代型hash函数 这种结构的hash函数已被证明是合理的,如果采用其他结构,不一定安全。设计新的hash函数只是改进这种结构,或者增加ha
15、sh码长。算法的核心技术是设计无碰撞的压缩函数f,而敌手对算法的攻击重点是f 的内部结构,由于f 和分组密码一样是由若干轮处理过程组成,所以对f 的攻击需通过对各轮之间的位模式的分析来进行,分析过程常常需要先找出f 的碰撞。由于f 是压缩函数,其碰撞是不可避免的,因此在设计f 时就应保证找出其碰撞在计算上是不可行的。MD5 hash算法MD5 Hash Algorithm MD4是MD5杂凑算法的前身,由Ron Rivest于1990年10月作为RFC提出,1992年4月公布的MD4的改进(RFC 1320,1321)称为MD5。MD5的算法框图v输入消息可任意长,压缩后输出为128bits。
16、算法步骤(1)分组填充 消息100064bit消息长度填充图样L512bitKbit 如果消息长度大于264,则取其对264的模。执行完后,消息的长度为512的倍数(设为L倍),则可将消息表示为分组长为512的一系列分组Y0,Y1,YL-1,而每一分组又可表示为16个32比特长的字,这样消息中的总字数为N=L16,因此消息又可按字表示为M0,N-1。算法步骤(2)缓冲区初始化 hash hash函数的中间结果和最终结果保存于函数的中间结果和最终结果保存于128128位的缓冲区中,缓冲区用位的缓冲区中,缓冲区用3232位的寄存器表示。位的寄存器表示。可用可用4 4个个32bits32bits字表
17、示:字表示:A A,B B,C,DC,D。初始存数。初始存数以十六进制表示为以十六进制表示为A A=01234567=01234567B B=89=89ABCDEFABCDEFC C=FEDCBAFEDCBA9898D D=76543210=76543210算法步骤(3)-HMD5运算 以分组为单位对消息进行处理每一分组Yq(q=0,L-1)都经一压缩函数HMD5处理。HMD5是算法的核心,其中又有4轮处理过程。HMD5的4轮处理过程结构一样,但所用的逻辑函数不同,分别表示为F、G、H、I。每轮的输入为当前处理的消息分组Yq和缓冲区的当前值A、B、C、D,输出仍放在缓冲区中以产生新的A、B、C
18、、D。每轮又要进行16步迭代运算,4轮共需64步完成。第四轮的输出与第一轮的输入相加得到最后的输出。压缩函数中的一步迭代基本逻辑函数定义 轮基本函数gg(b,c,d)fFF(b,c,d)(bc)V(bd)fGG(b,c,d)(bd)V(c d)fHH(b,c,d)b c dfII(b,c,d)c (b V d)Xk 当前分组的第k个32位的字。第1轮 x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11x12x13x14x15第2轮 x1 x6 x11 x0 x5 x10 x15 x4 x9 x14 x3 x8 x13 x2 x7 x12第3轮 x5 x8 x11x14
19、x1 x4 x7 x10 x13 x0 x3 x6 x9 x12x15 x2第4轮 x0 x7 x14 x5 x12 x3 x10 x1 x8 x15 x6 x13 x4 x11 x2 x9TiT1,64为64个元素表,分四组参与不同轮的计算。Ti为232abs(Sin(i)的整数部分,i是弧度。Ti可用32 bit二元数表示,T是32 bit随机数源。T1=d76aa478T17=f61e2562T33=fffa3942T49=f4292244T2=e8c7b756T18=c040b340T34=8771f681T50=432aff97T3=242070dbT19=265e5a51T35=6
20、d9d6122T51=ab9423a7T4=c1bdceeeT20=e9b6c7aaT36=fde5380cT52=fc93a039T5=f57c0fafT21=d62f105dT37=a4beea44T53=655b59c3T6=4787c62aT22=02441453T38=4bdecfa9T54=8f0ccc92T7=a8304613T23=d8a1e681T39=f6bb4b60T55=ffeff47dT8=fd469501T24=e7d3fbc8T40=bebfbc70T56=85845dd1T9=698098d8T25=21e1cde6T41=289b7ec6T57=6fa87e4
21、fT10=8b44f7afT26=c33707d6T42=eaa127faT58=fe2ce6e0T11=ffff5bb1T27=f4d50d87T43=d4ef3085T59=a3014314T12=895cd7beT28=455a14edT44=04881d05T60=4e0811a1T13=6b901122T29=a9e3e905T45=d9d4d039T61=f7537e82T14=fd987193T30=fcefa3f8T46=e6db99e5T62=bd3af235T15=a679438eT31=676f02d9T47=1fa27cf8T63=2ad7d2bbT16=49b4082
22、1T32=8d2a4c8aT48=c4ac5665T63=eb86d391CLSs:循环左移s位 第一轮:7、12、17、22 第二轮:5、9、14、20 第三轮:4、11、16、23 第四轮:6、10、15、21MD-5的安全性 MD-5的输出为128-bit,若采用纯强力攻击寻找一个消息具有给定Hash值的计算困难性为2128,用每秒可试验1 000 000 000个消息的计算机需时1.071022年。采用生日攻击法,找出具有相同杂凑值的两个消息需执行264次运算。SHA 算法Secure Hash Algorithm算法简介 美国标准与技术研究所美国标准与技术研究所NISTNIST设计设
23、计 19931993年成为联邦信息处理标准年成为联邦信息处理标准(FIPS PUB(FIPS PUB 180)180)基于基于MD4MD4算法,与之非常类似。算法,与之非常类似。输入为小于输入为小于2 26464比特长的任意消息比特长的任意消息 分组分组512bit512bit长长 输出输出160bit160bit迭代型hash函数的一般结构fffY0Y1YL-1bbbnnnnnIV=CV0CV1CVL-1CVL明文M被分为L个分组Y0,Y1,YL-1b:明文分组长度n:输出hash长度CV:各级输出,最后一个输出值是hash值无碰撞压缩函数f是设计的关键算法描述 消息填充:与消息填充:与MD
24、5完全相同完全相同 附加消息长度:附加消息长度:64bit长度长度 缓冲区初始化缓冲区初始化 A67452301 BEFCDAB89 C98BADCFB D10325476 EC3D2E1F0分组处理模232加SHA-1压缩函数(单步)ft-基本逻辑函数 CLS5:32位的变量循环左移5位。CLS30:32位的变量循环左移30位。Wt-从当前512位输入分组导出的32位字 前16个值(即W0,W1,W15)直接取为输入分组的16个相应的字,其余值(即W16,W17,W79)取为1161483()tttttWCLS WWWWKt-加法常量步骤十六进制0t19Kt=5A82799920t39Kt=
25、6ED9EBA140t59Kt=8F1BBCDC60t79Kt=CA62C1D6SHA与MD5的比较 抗穷举搜索能力抗穷举搜索能力 寻找指定寻找指定hashhash值,值,SHASHA:O(2O(2160160),MD5MD5:O(2O(2128128)生日攻击:生日攻击:SHASHA:O(2O(28080),MD5MD5:O(2O(26464)抗密码分析攻击的强度抗密码分析攻击的强度 SHASHA似乎高于似乎高于MD5MD5 速度速度 SHASHA较较MD5MD5慢慢 简捷与紧致性简捷与紧致性 描述都比较简单,都不需要大的程序和代换表描述都比较简单,都不需要大的程序和代换表其它hash算法
26、MD4 MD4使用三轮运算,每轮16步;MD5使用四轮运算,每轮16步。MD4的第一轮没有使用加法常量,第二轮运算中每步迭代使用的加法常量相同,第三轮运算中每步迭代使用的加法常量相同,但不同于第二轮使用的加法常量;MD5的64部使用的加法常量Ti均不同。MD4使用三个基本逻辑函数,MD5使用四个。MD5中每步迭代的结果都与前一步的结果相加,MD4则没有。MD5比MD4更复杂,所以其执行速度也更慢,Rivest认为增加复杂性可以增加安全性。RIPEMD-160 欧共体RIPE项目组研制。输入可以是任意长的报文,输出160位摘要。对输入按512位分组。以分组为单位处理。算法的核心是具有十轮运算的模
27、块,十轮运算分成两组,每组五轮,每轮16步迭代。对Hash函数的攻击 对一个hash算法的攻击可分三个级别:预映射攻击(Preimage Attack):给定Hash值h,找到其所对应的明文M,使得Hash(M)=h,这种攻击是最彻底的,如果一个hash算法被人找出预映射,那这种算法是不能使用的。次预映射攻击(Second Preimage Attack):给定明文M1,找到另一明文M2(M1M2),使得hash(M1)=hash(M2),这种攻击其实就是要寻找一个弱碰撞;碰撞攻击(Collision Attack):找到M1和M2,使得hash(M1)=hash(M2),这种攻击其实就是要寻
28、找一个强碰撞。生日攻击 给定一个散列函数H和某和某hash值值H(x),假定假定H有n个可能的输出。如果H有k个随机输入,k必须为多大才能使至少存在一个输入y,使得H(y)=H(x)的概率大于0.5?K=n/2结论 如果hash码为m位,则有2m个可能的hash码。如果给定h=H(X),要想找到一个y,使H(y)=h的概率为0.5,则要进行多次的尝试,尝试的次数k=2m/2=2m-1 所以,对于一个使用64位的hash码,攻击者要想找到满足H(M)=H(M)的M来替代M,平均来讲,他要找到这样的消息大约要进行263次尝试。但是,存在一种攻击,称为“生日攻击”,却可以大大减小尝试的次数,对于64
29、位的hash码,所需的代价仅为232次。生日悖论 一个教室中,最少应有多少学生,才使至少有两人具有相同生日的概率不小于1/2?概率结果与人的直觉是相违背的.实际上只需23人,即任找23人,从中总能选出两人具有相同生日的概率至少为1/2。一个不等式:(1-x)e-x (x0)当x很小,趋近于0时,(1-x)e-x两个集合中元素的重复 给定两个集合X和Y,每个集合有k个元素:X:x1,x2,xk,Y:y1,y2,yk,其中,各元素的取值是1n之间的均匀分布的随机值(kn)那么,这两个集合中至少有一个元素相同(重复)的概率R(n,k)是多少呢?给定x1,那么y1=x1的概率为1/n,所以y1x1的概
30、率为1-1/n。那么Y中的k个值都不等于x1的概率为(1-1/n)k 同理,给定x2,那么Y中的k个值都不等于x2的概率为(1-1/n)k 同理,给定xk,那么Y中的k个值都不等于xk的概率为(1-1/n)k 所以,Y中没有元素与X中元素相同的概率为:那么,Y中至少有一个元素与X中元素相同的概率为:211(1)(1)k kkrPnn21(,)1(1)kR n kn 211(1)(1)kkkrPnn 根据不等式:(1-x)e-x (x0)可知:2122221111(1)(0)(1)()1(,)1(1)1()1()0.5,(,)0.5knln2nkknkknknenennR n keneR n k
31、 当实施生日攻击 前面提到过,对于一个使用64位的hash码,攻击者要想找到满足H(M)=H(M)的M来替代M,平均来讲,他要找到这样的消息大约要进行263次尝试。这太困难了!设M和hash算法生成64位的hash值。攻击者可以根据M,产生232个表达相同含义的变式(例如在词与词之间多加一个空格)。同时准备好伪造的消息M,产生232个表达相同含义的变式。在这两个集合中,找出产生相同hash码的一对消息M1和M1。根据生日悖论,找到这样一对消息的概率大于0.5。最后,攻击者将拿M1给发送者签名,但发送时,把M1和经加密的hash码一起发送。Birthday Attacks:example A准备两份合同M和M,一份B会同意,一份会取走他的财产而被拒绝 A对M和M各做32处微小变化(保持原意),分别产生232个64位hash值 根据前面的结论,超过0.5的概率能找到一个M和一个M,它们的hash值相同 A提交M,经B审阅后产生64位hash值并对该值签名,返回给A A用M替换M