910 likes | 1.09k Views
密码算法与应用基础. 五、数字签名与 hash 函数 阳振坤 yzk@icst.pku.edu.cn 计算机科学技术研究所 http://www.icst.pku.edu.cn/cryptocourse/. 内容提要. 信息安全引论 对称密钥密码 对称密钥密码应用基础 公开密钥密码 数字签名与 hash 函数 公开密钥密码应用基础 密钥交换与密钥管理. 信息安全的基本内容. 保密性 (Confidentiality) 真实性 (Authentication) 完整性 (Integrity) 不可否认性 (Nonrepudiation ) …….
E N D
密码算法与应用基础 五、数字签名与hash函数 阳振坤 yzk@icst.pku.edu.cn 计算机科学技术研究所 http://www.icst.pku.edu.cn/cryptocourse/
内容提要 • 信息安全引论 • 对称密钥密码 • 对称密钥密码应用基础 • 公开密钥密码 • 数字签名与hash函数 • 公开密钥密码应用基础 • 密钥交换与密钥管理
信息安全的基本内容 • 保密性(Confidentiality) • 真实性(Authentication) • 完整性(Integrity) • 不可否认性(Nonrepudiation) ……
数字签名与hash函数 • Message authentication • Hash functions • Digital signature • ElGamal公钥算法的实现
Message Authentication • 针对消息真实性的攻击: • Masquerade(send & receive) • Content modification • Sequence modification • Timing modification(delay & replay) • 解决方法: • 信息加密 • Message Authentication Code(MAC): public function + secret key
Hash functions • hash function简介 • hash函数通用模型 • MD5 • SHA-1 • RIPEMD-160 • HMAC • hash函数小结
信息加密: 对称密钥密码 • 前提是通信双方有共享密钥 • 一定程度的内容和来源提供的真实性 C = EK(M)M = DK(C) • 攻击者可以修改内容而不被察觉 • 攻击者可以伪造消息(内容与来源)而不被察觉 • 使用有结构的信息 • 使用纠错码或者校验码
信息加密: 公开密钥密码 • 前提是知道对方的公钥 • 用私钥对信息加密提供真实性(无保密性) C = EKR(M)M = DKU(C) • 用公钥对信息加密提供保密性(无真实性) C = EKU(M)M = DKR(C) • 攻击者可以修改内容而不被察觉 • 攻击者可以伪造消息(内容与来源)而不被察觉 • 使用有结构的信息 • 使用纠错码或者校验码
通过加密得到信息真实性: 问题 • 保密性与真实性是两个不同的概念 • 根本上,信息加密提供的是保密性而非真实性 • 加密代价大(公钥算法代价更大) • 某些信息只需要真实性,不需要保密性 • 广播的信息难以使用加密(信息量大) • 可执行程序不适合使用加密 • 网络管理信息等只需要真实性 • BBS上的消息 • 政府/权威部门的公告 • ……
MAC介绍 • MAC: 对一段消息产生认证码(秘密校验核) • 要求: 不同的消息产生不同的认证码 认证码能够被验证 • 使用公开算法和秘密密钥K对信息M产生秘密校验核(MAC): MAC(M) = CK(M) • 例子:对M产生一个校验核M,再用K对M加密 • 发送者与接收者要有共享密钥K • 发送者生成MAC,接收者验证 • MAC有固定长度 • 强制破译: 2min(|MAC|,|Key|)-1
MAC: Example • M=(X1,X2,…,Xt) • 对M产生校验核M=X1X2…Xt • 秘密校验核MAC = EK(M) • 密钥足够长+加密算法足够好安全 • 攻击者选择M=(Y1,Y2,…,Yt-1,Yt),使得Yt满足: Yt = Y1Y2…Yt-1M • 于是M=MEK(M)=EK(M) CK(M)=CK(M) • 尽管不知道K,攻击者仍然可以伪造消息M.
MAC: requirements • 条件:攻击者知道MAC函数但不知道密钥 已知M和CK(M),构造M使得CK(M)=CK(M)在计算上不可行(计算上无碰撞) CK(M)均匀分布: 随机选择M和M, Pr[CK(M)= CK(M)]=2-|MAC| f是M的一个变换(例如对某些位取反),那么, Pr[CK(M)= CK(f(M))]=2-|MAC|
MAC based on DES • ANSI标准(X9.17) • M=(X1,X2,…,Xt) M1=EK(X1) Mj+1=EK(Xj+1Mj), 1j<t MAC= Mt • DES不安全使得X9.17也不安全 • 加密算法受美国等的出口限制 • 该方法适用于其他加密算法
Hash Function简介 • MAC需要对全部数据进行加密 • MAC速度慢 • Hash是一种直接产生认证码的方法 • Hash函数: h=H(x), 要求: 可作用于任何尺寸数据且均产生定长输出 H(x)能够快速计算 单向性: 给定h,找到x使h=H(x)在计算上不可行 Weak Collision Resistence(WCR):给定x,找到yx使H(x)=H(y)在计算上不可行 Strong Collision Resistence(SCR): 找到yx使H(x)=H(y)在计算上不可行
A Simple Hash Function • M=(X1,X2,…,Xt) • H(M)=X1X2…Xt • H不满足单向性,WCR和SCR中的任一个 • 即使对M以及H(M)都加密仍然是不安全的 • 假如使用CBC加密模式, 令Y0=IV, Xt+1=X1X2…Xt, 那么: Yi=EK(XiYi-1), 1it • Xi=DK(Yi)Yi-1, 1it • Xt+1=X1X2…Xt =(DK(Y1)Y0)(DK(Y2)Y1)… (DK(Yt-1)Yt) • 改变Yi的顺序不影响校验核(Xt+1)
Block Chaining hash function • 用对称加密算法构造hash函数 • M=(M1,M2,…,Mt), H0=Initial value Hi=f(Mi,Hi-1), 例如Hi=EMi(Hi-1) hash: Ht • 速度慢,且许多这样的hash函数被证明不安全(与E的安全性无关) • 下面的四种可能是安全的: Hi=EHi-1(Mi)Mi Hi=EHi-1(Mi)MiHi-1 Hi=EHi-1(MiHi-1)Mi Hi=EHi-1(MiHi-1)MiHi-1 • 现在很少使用
Birthday Attacks(1) • 所有hash函数都可被Birthday attack攻击 k个同龄人中至少有两个人是相同生日的概率 k个在[1,n]的随机数中至少两个数相等的概率. 两个在[1,n]的k个随机数集合有交集的概率. 问题: P(n,k) • 任何两个数都不相等的k-组合的个数是: n(n-1)…(n-k+1) • 全部k-组合的个数是: nn…n=nk P(n,k)=1-(n(n-1)…(n-k+1)/nk) =1-{1(1-1/n)…[1-(k-1)/n]}
Birthday Attacks(2) • 令f(x)=1-x-e-x,则f(0)=0,f(x)=e-x-1<0, x>0 f(x)<0, x>0 1-x<e-x, x>0 P(n,k) = 1-{1(1-1/n)…[1-(k-1)/n]} > 1-e-1/ne-2/n…e-(k-1)/n=1-e-k(k-1)/2n P(n,k)>1-e-k(k-1)/2n • 若要使得P(n,k)0.5, 令1-e-k(k-1)/2n=0.5 k(k-1)=nln(4) k[nln(4)]1/2 1.18n1/2 • 若k1.183651/222.54, 则k个同龄人中有两个人是相同生日的概率不低于0.5 • 若k1.182m/22m/2, 则k个在[1,2m]的随机数中有两个数相等的概率不低于0.5
Birthday Attacks(3) 问题: R(n,k) 两个在[1,n]的k个随机数集合X,Y有交集的概率. • 对xX, yY, Pr(x=y) = 1/n Pr(xy) = 1-1/n Pr(xY) = (1-1/n)kPr((XY)=) = ((1-1/n)k)k R(n,k) = Pr((XY)) = 1-(1-1/n)kk > 1-((e-1/n)kk) = 1-e- kk/n (∵1-x<e-x, x>0) • 若要使得R(n,k)0.5, 令1-e-kk/n=0.5 kk=n/ln(2) k[n/ln(2)]1/2 0.83n1/2 • 若k0.83n1/2,两个在[1,n]的k个随机数集合有交集的概率不小于为0.5
Birthday Attacks: example • 经理要秘书按指定内容写一封信(64位hash签名) • 秘书按要求写一封信M,同时准备另一封信M • 秘书对M和M各做32处微小变化(保持原意),分别产生232个64位hash值 • 根据前面的结论,超过0.5的概率能找到一个M和一个M,它们的hash值相同 • 秘书提交M,经理审阅后产生64位hash值并对该值签名,返回给秘书 • 秘书用M替换M,再与经理数字签名一起发出 • Hash必须足够长(64 128 160)
hash函数通用模型 • 由Merkle于1989年提出 • Ron Rivest于1990年提出MD4 • 几乎被所有hash函数使用 • 具体做法: • 把原始消息M分成一些固定长度的块Yi • 最后一块padding并使其包含消息M长度 • 设定初始值CV0 • 压缩函数f, CVi=f(CVi-1,Yi-1) • 最后一个CVi为hash值
MD5简介 • Merkle于1989年提出hash function模型 • Ron Rivest于1990年提出MD4 • 1992年,MD5出现 • MD5把数据分成512-bit块 • MD5的hash值是128-bit • 在最近数年之前,MD5是最主要的hash算法 • 现行美国标准SHA-1以MD5的前生MD4为基础
MD5: padding • Step 1: Padding M M1 • |M1| 448 mod 512 • |M1| > |M| 如果|M| 448 mod 512,则|M1| = |M|+512 • Padding内容: 100…0 • Step 2: Append 64-bit length M1 M2 • 若|M| > 264,则仅取低64位 • 低字节在前 (little-endian) • |M2|为512的倍数: Y0,Y1,…,YL-1
MD5: compression • Step 3: Initialize MD buffer (little-endian) A = 01 23 45 67 (0x67452301) B = 89 AB CD EF (0xEFCDAB89) C = FE DC BA 98 (0x98BADCFE) D = 76 54 32 10 (0x10325476) • Step 4: Compression CV0=IV CVi=HMD5(CVi-1,Yi) • Step 5: Output MD = CVL
MD5 Step 4: overview • Step 4: CV0=IV, CVi=HMD5(CVi-1,Yi) • (A0,B0,C0,D0)(A,B,C,D) • RoundOne(A,B,C,D,T[1…16],X[0…15]) • RoundTwo(A,B,C,D,T[17…32],X[0…15]) • RoundThree(A,B,C,D,T[33…48],X[0…15]) • RoundFour(A,B,C,D,T[49…64],X[0…15]) • (A,B,C,D)(A+A0,B+B0,C+C0,D+D0) • 512-bit块(X[…]为32-bit表示)在四个Round使用 • 每个Round包含16次循环,每次处理一个32-bit • T[j]= [sin(j)*232]的整数部分, 1 j 64
MD5 Step 4: RoundOne • For(k = 0; k < 16; ++k) { AB + ((A+g1(B,C,D)+X[1(k)]+T[160+k+1]) <<< s1[k mod 4]) (A,B,C,D) (A,B,C,D) >>>32 } • g1(B,C,D) = (B & C) | (B & D) • 1(k) = k, 0 k < 16 • s1[0…3] = [7,12,17,22]
MD5 Step 4: RoundTwo • For(k = 0; k < 16; ++k) { AB + ((A+g2(B,C,D)+X[2(k)]+T[161+k+1]) <<< s2[k mod 4]) (A,B,C,D) (A,B,C,D) >>>32 } • g2(B,C,D) = (B & D) | (C & D) • 2(k) = (1+5k) mod 16, 0 k < 16 • s2[0…3] = [5,9,14,20]
MD5 Step 4: RoundThree • For(k = 0; k < 16; ++k) { AB + ((A+g3(B,C,D)+X[3(k)]+T[162+k+1]) <<< s3[k mod 4]) (A,B,C,D) (A,B,C,D) >>>32 } • g3(B,C,D) = B C D • 3(k) = (5+3k) mod 16, 0 k < 16 • s3[0…3] = [4,11,16,23]
MD5 Step 4: RoundFour • For(k = 0; k < 16; ++k) { AB + ((A+g4(B,C,D)+X[4(k)]+T[163+k+1]) <<< s4[k mod 4]) (A,B,C,D) (A,B,C,D) >>>32 } • g4(B,C,D) = C (B | D) • 4(k) = 7k mod 16, 0 k < 16 • s4[0…3] = [6,10,15,21]
MD5: 总结 • MD5使用little-endian • 生日攻击+64位可计算 128位hash值太短 • Dobbertin在1996年找到了两个不同的512-bit块,它们在MD5计算下产生相同的hash • 至今还没有真正找到两个不同的消息,它们的MD5的hash相等 • MD5不是足够安全的
Secure Hash Algorithm简介 • 1992年NIST制定了SHA(128位) • 1993年SHA成为标准 • 1994年修改产生SHA-1(160位) • 1995年SHA-1成为新的标准 • SHA-1要求输入消息长度<264 • SHA-1的摘要长度为160位 • 基础是MD4
SHA-1: padding • 与MD5相同 • Step 1: Padding M M1 • |M1| 448 mod 512 • |M1| > |M| 如果|M| 448 mod 512,则|M1| = |M|+512 • Padding内容: 100…0 • Step 2: Append 64-bit length M1 M2 • |M| < 264 • 高字节在前 (big-endian) • |M2|为512的倍数: Y0,Y1,…,YL-1
SHA-1: compress • Step 3: Initialize MD buffer (big-endian) A = 67 45 23 01 (0x67452301) B = EF CD AB 89 (0xEFCDAB89) C = 98 BA DC FE (0x98BADCFE) D = 10 32 54 76 (0x10325476) E = C3 D2 E1 F0 (0xC3D2E1F0) • Step 4: Compression CV0=IV CVi=HSHA-1(CVi-1,Yi) • Step 5: Output MD = CVL
SHA-1 step 4: overview • Step 4: CV0=IV, CVi=HSHA-1(CVi-1,Yi) (A0,B0,C0,D0,E0)(A,B,C,D,E), t 0 Round(A,B,C,D,E,K[t],W[t]) 0 t < 80 (A,B,C,D,E)(A+A0,B+B0,C+C0,D+D0,E+E0) • 整个Round包含80次循环,每次处理一个32-bit • W[t] = Yi[t] 0 t < 16 W[t] =(W[t-16]W[t-14]W[t-8]W[t-3])<<<1 16 t < 80 • 每组(16个)W[t]可由前一组W[t]直接计算
SHA-1: compression function • Four rounds: 0 t < 80 E E+f(t,B,C,D)+(A<<<5)+W[t]+K[t] B B<<<30 (A,B,C,D,E)(A,B,C,D,E)>>>32 • f(t,B,C,D) = (B&C)|(B&D) 0 t < 20 K[t] = 230 sqrt(2) • f(t,B,C,D) = B C D 20 t < 40 K[t] = 230 sqrt(3) • f(t,B,C,D) = (B&C)|(B&D)|(C&D) 30 t < 60 K[t] = 230 sqrt(5) • f(t,B,C,D) = B C D 60 t < 80 K[t] = 230 sqrt(10)
SHA-1总结 • SHA-1使用big-endian • 抵抗生日攻击: 160位hash值 • 没有发现两个不同的512-bit块,它们在SHA-1计算下产生相同的“hash” • 速度慢于MD5 • 安全性优于MD5
RIPEMD-160简介 • 欧洲RIPE项目的结果 • RIPEMD为128位 • 更新后成为RIPEMD-160 • 基础是MD5
RIPEMD-160: padding • Step 1: Padding M M1 • |M1| 448 mod 512 • |M1| > |M| 如果|M| 448 mod 512,则|M1| = |M|+512 • Padding内容: 100…0 • Step 2: Append 64-bit length M1 M2 • |M| < 264 • 低字节在前 (little-endian) • |M2|为512的倍数: Y0,Y1,…,YL-1
RIPEMD-160: compression • Step 3: Initialize MD buffer (little-endian) A = 01 23 45 67 (0x67452301) B = 89 AB CD EF (0xEFCDAB89) C = FE DC BA 98 (0x98BADCFE) D = 76 54 32 10 (0x10325476) E = F0 E1 D2 C3 (0xC3D2E1F0) • Step 4: Compression CV0=IV CVi=HRIPE(CVi-1,Yi) • Step 5: Output MD = CVL
RIPEMD-160: compression function • (A0,B0,C0,D0,E0)(A,B,C,D,E) • Five rounds: 0 t < 16 A ((A+f(B,C,D)+X[p[t]]+K)<<<s)+E C C<<<10 (A,B,C,D,E)(A,B,C,D,E)>>>32 A((A+f(B,C,D)+X[p[t]]+K)<<<s)+E CC<<<10 (A,B,C,D,E)(A,B,C,D,E)>>>32 • (A,B,C,D,E) (B0+C+D, C0+D+E, D0+E+A, E0+A+B, A0+B+C)
RIPEMD-160 step 4: fi,, • Function f1,f2,f3,f4,f5: • f1(B,C,D) = B C D • f2(B,C,D) = (B&C)|(!B&D) • f3(B,C,D) = (B|!C) D • f4(B,C,D) = (B&C)|(C&!D) • f5(B,C,D) = B (C|!D) • : 7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8 • : 5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12
RIPEMD-160总结 • RIPEMD-160使用little-endian • 抵抗生日攻击: 160位hash值 • 没有发现两个不同的512-bit块,它们在RIPEMD-160计算下产生相同的“hash” • 速度略慢于SHA-1 • 安全性优于MD5 • 对密码分析的抵抗力好于SHA-1
hash函数小结 • hash函数把变长信息映射到定长信息 • hash函数不具备可逆性 • hash函数速度较快 • hash函数与对称密钥加密算法有某种相似性 • 对hash函数的密码分析比对称密钥密码更困难 • hash函数可用于消息摘要 • hash函数可用于数字签名
HMAC简介 • MAC可用块加密算法产生 • ANSI标准(X9.17): M=(X1,X2,…,Xt) M1=EK(X1), Mj+1=EK(Xj+1Mj), 1j<t • 速度慢 • 加密算法出口受限制 • hash函数可用来构造MAC: HMAC为其中之一 • HMAC作为RFC2104并在SSL中使用