1、第11章 消息认证和散列函数,11.1 对认证的要求 11.2 认证函数 11.3 消息认证码MAC 11.4 散列函数 11.5 散列函数和MAC的安全性,消息认证,认证和加密不同。 消息认证是验证消息完整性的一种机制,能发现对消息的篡改或假冒。 使用对称算法可产生消息认证码MAC 使用公钥算法可对消息进行签名 身份认证是鉴别通信对方的身份是否属实。 散列函数是一个单向的消息摘要函数,在产生MAC、签名中有重要用途。,11.1 认证需求,对网络通信的攻击 窃听流量分析 伪装(假冒)篡改内容修改顺序修改时间(包括重放) 发送方抵赖(拒绝承认曾发出过某消息) 接收方抵赖,11.2 认证函数,用于
2、产生认证符的函数类型1. 对称加密2. 公钥加密3. 消息认证码(MAC) 4. 散列函数(Hash),对称加密能否提供认证,由于密钥没有第三方知道,所以接收方应该可以确信消息的来源真实性。 这并不绝对,因为存在一种可能性,是对密文的篡改。问题:对密文的篡改,能否一定被察觉? 除非已知加密前明文的结构特征(比如是通常文本),而且篡改恰好导致解密后明文丧失了原有特征,则可怀疑有篡改,篡改密文,察觉?,CBC模式加密得到密文 某处被窜改,导致其后续部分解密失败 RC4加密中 对密文部分比特的篡改导致明文对应部分解密错误(如何察觉?) 随意伪造的密文有可能恰好解密为有效的明文 结论:加密并不能完全抵
3、抗篡改或假冒,教训:对密文的保护,在加密之前,给明文添加结构特征M | H(M) 加密E ( M | H(M), K ) = C 传输有可能出错或被篡改 C会变为C 解密 判断恢复的明文是否符合M | H(M)的结构特征,公钥加密,提供保密性 A使用B的公钥加密消息,这不能提供认证。 提供认证 A使用自己的私钥加密消息,这不能提供保密性。 同时提供保密性和认证 A可以先使用自己的私钥加密消息(即签名),再用B的公钥加密。 亦需要给明文消息添加结构特征,11.4 Hash函数,输入是变长的消息M,输出是定长的散列码H(M),也称为散列值,不使用密钥。 Hash函数的用途 给明文增加结构特征以保护
4、密文 产生认证符,用于消息认证 数字签名 从口令衍生密钥 挑战-应答认证协议中 也用来产生随机数,散列函数的基本用途,(1),(2),(3),散列函数的基本用途,(4),(5),(6),散列函数 h=H(x),函数参数 输入:可以任意长度 输出:固定长度n比特,一般n=128、160位 函数特性 单向性:给定h,要找x使H(x)h是困难的 抗弱碰撞性:对于给定的x,找y,使H(y)H(x)是困难的 抗强碰撞性:找x和y,使H(x)H(y)是困难的 * 如果碰撞则意味着数字签名容易被伪造/欺骗,单向性,若h=H(M)不满足单向性,则由h可计算出M。 对于使用秘密值S的方法,攻击者可通过截获消息得
5、到S。 攻击者观察到H(M|S),计算出M|S,由于M以明文形式传输,则攻击者得到S。,抗弱碰撞性,若h=H(M)不满足抗弱碰撞性,则攻击者可伪造消息而不被察觉。 攻击者截获传输中的消息M|E(K, H(M),由明文形式的M计算出H(M),再伪造另一条消息M,使H(M)=H(M),再把M|E(K, H(M)传给接收方。,简单散列函数,散列函数运算过程 输入:n位分组的序列 输出:n位散列值 每次处理一个分组,直到所有分组都被处理完 最简单的散列函数 将每个分组的相应位异或,即不满足抗弱碰撞性 加以改进 每处理完一个分组后将散列值移位一次,改进的简单散列函数,运算过程 n位散列值的初值为0 依次
6、处理每个n位分组: 将当前的散列值循环左移一次 将该分组与散列值异或 不满足抗弱碰撞性 很容易产生一条新消息,使之与给定的消息具有相同的散列码 设传输中的消息为M|E(K, H(M),则攻击者由M计算出H(M),将H(M)循环左移一次,得到H(M),再产生一个新分组bx,使H(M)bx=H(M)。,简单散列函数,若对明文消息M和其散列值都加密,则能否保证数据完整性? 下述加密方法: 将每个分组的相应位异或,生成散列码,即利用CBC方式对消息和散列码都加密,生成密文,生日攻击,发送方对消息M“签名”,用其私钥对n位散列码加密并将加密后的散列码附于消息之后。 攻击者产生M的2n/2种变式,且每种变
7、式表达相同的意义。攻击者再伪造一条消息M,并产生M的2n/2种变式,攻击者准备用M替代M。 比较上述两个集合,找出产生相同散列码的一对消息。根据生日悖论,找到这对消息的概率大于0.5。 攻击者将M的有效变式提供给发送方签名,将该签名附于M的有效变式之后,发送给接收方。由于两个变式的散列码相同,所以它们产生的签名也相同。,生日问题,最多找365+1个人,则必有至少两个人生日相同 问:平均找多少个人,能以1/2的概率找到两人生日相同?(不考虑2月29日) 若k个人生日均不相同,则可能的情况有若允许相同,则可能的情况有365k种 k个人中至少有两人生日相同的概率为当k=23时,上式的值为0.5037
8、 当k=100时,上式的值为0.9999997,生日悖论,生日攻击,设使用n位散列码,则最多尝试2n1条消息,必有至少一对碰撞 问:平均尝试多少条消息,可以以1/2的概率找到一对碰撞? 2n/2 产生消息的变式 改变词的顺序 用同义词或近义词替代原词 结论 散列码应较长,Hash函数设计考虑,奇偶校验 异或 只能检出奇数个比特错误 CRC 常用于帧校验 仍有很高的概率不能检出传输比特错误 * 不能满足单向性和抗碰撞性 复杂的密码学专用散列函数 MD5/SHA,分组链接技术,现有散列函数大多基于CBC,但不用密钥 一种散列函数设计方法(基于某种加密算法) 将消息M分成定长的分组M1, M2, M
9、N 使用对称加密体制,计算散列码 H0 = 初始值 Hi = E(Mi, Hi-1) G = HN 该方法也易受生日攻击,生日攻击实例,设攻击者能截获一条已签名的消息M|E(K, H(M),散列码长度为m位。攻击过程如下: 用上述方法由明文M计算出散列码G。 构造任何形为 Q1, Q2, QN-2 的消息。 对1i(N-2),计算 Hi = E(Qi, Hi-1)。 攻击者产生 2m/2 个随机分组,对每个分组X,计算 HN-1 = E(X, HN-2)。再产生 2m/2 个随机分组,对每个分组Y,计算D(Y, G),其中D是对应E的解密函数。 根据生日悖论,X和Y满足E(X, HN-2)=D
10、(Y, G)的概率较大 构造消息 Q1, Q2, QN-2, X, Y。该消息的散列码也是G,因此可以将该消息与截获的签名一起发送。,11.3 消息认证码 MAC,(假定双方共享密钥) 发送方利用密钥从明文产生一个固定长度的短数据块(MAC),和消息一起传输。 接收方利用密钥计算产生新的MAC,与接收到的MAC进行比较。 消息未被修改 消息来自真正的发送方 与加密函数的区别 不要求可逆 更不易被攻破,MAC函数,MAC函数是多对一函数 定义域:变长的消息M 值域:MAC值和密钥K 若消息长度为100位,MAC值长度为10位,密钥长度为5位,则有2100条可能的消息,有210种可能的MAC值,和
11、25种可能的密钥。 每一种MAC值可以由2100/210=290条消息产生。 从消息集合到MAC值的集合有25种不同的映射。,MAC的基本用途,(1),(2),(3),关于加密和认证分离,加密能提供某种程度的认证 认证和加密的分离带来灵活性 只要认证而不需保密如公文,软件完整性鉴别(防病毒)、网络管理广播报文(如SNMP)等 不能加密的场合(如法规限制) 存档期间的保护(而不仅是传输期间) 通信某一方负荷很大,没有时间解密所有消息,但要求能随机认证,避免使用加密方法产生MAC,生成MAC没有必要整个消息被加密 速度慢、成本高 有时不需保密消息 不需要能恢复明文,但保证明文真实可靠 Key是必要
12、的 从消息产生认证符的数学方法:散列函数 先计算认证符,再把认证符加密的思想 把散列函数和Key结合,即为MACE(K, H(M) 相当于 C(K, M),MAC,讨论 为了方便,MAC码通常较短 实现MAC函数不排斥使用对称加密算法 实现MAC函数希望使用比加密更高效的方法 为防止重放攻击,加注时间、消息序号 对称MAC不能提供签名 因为产生MAC的密钥为两方所有,对MAC的穷举攻击,如何对MAC使用的K进行穷举攻击? 假定攻击者可访问M|C(K,M),且K的长度k比MAC值的长度n要长,即kn 攻击者对每个可能的密钥Ki,选择截获的第一个明文及其MAC值M|C(K,M),计算M对应的MAC
13、值C(Ki,M)。 由于产生的MAC值有2k个,而实际的MAC值只有2n个,因此有多个密钥会产生正确的MAC值。 攻击者对剩余的密钥,选择截获的第二个明文及其MAC值,进行第二轮的穷举攻击。 依此类推,直到剩下唯一的密钥。 若K为80位,n为32位,则需测试3轮才能成功。,对MAC的其它攻击,假定消息M被分成m个64位的分组Xi(M) = X1X2XmC(K, M) = E(K, (M) E为DES加密算法,则K为56位,MAC值为64位 若攻击者能截获M|C(K, M),则他可以伪造一条消息Y,使之与M具有相同的MAC值。 攻击者生成Y1,Y2,Ym-1 计算Ym = Y1Y2Ym-1(M)
14、 将Y1,Y2,Ym-1,Ym作为伪造的消息,连同原MAC值一起发送给接收方。,对MAC函数的要求,若攻击者已知 M 和 C(K,M),则他构造满足C(K,M) = C(K,M) 的消息 M 在计算上是不可行的。 C(K,M) 应当是均匀分布的,即对任何随机选择的消息 M 和 M,C(K,M) = C(K,M)的概率是 2-n ,其中n是MAC值的位数。 设 M是 M的某个已知的变换,即 M = f(M),则 C(K,M)=C(K,M) 的概率是 2-n 。,CBC模式最后分组做为MAC,FIPS 113,11.5 Hash和MAC安全性,对Hash函数/MAC码的攻击方法 穷举攻击 密码分析
15、,对Hash的攻击,穷举攻击(输出为n位的Hash函数) 抗弱碰撞性的能力为 2n 抗强碰撞性的能力为 2n/2 对MD5的密码分析 已有重大进展,可以在数小时至数分钟内产生一对碰撞(攻击抗强碰撞性) 一般认为128位太短,160位也不够安全,散列函数的典型结构,将输入的消息分为L个固定长度的分组,每个分组长为b位,不足时需填充,且最后一个分组包含输入的总长度。 重复使用压缩函数f,其输入是上一步的n位结果(称为链接变量)及当前处理的b位分组,输出一个n位分组。bn,称为压缩。,散列算法的总体结构,对MAC码的攻击,穷举攻击 穷举产生MAC码的密钥,计算复杂度2k 穷举MAC码,计算复杂度2n,小结,加密可以抵抗窃听,而认证是为了保证消息(进一步身份)的真实性。 如果加密时使用合适的方法,也可以把认证特性加入进去,但是把认证和加密分离具有更好的灵活性。 认证码的产生需要密钥。为了效率,可以使用Hash函数。从概念上MAC码可以这样产生:Hash(Message|Key),