1.41k likes | 1.57k Views
密码算法与应用基础. 六、公开密钥密码应用基础 阳振坤 yzk@icst.pku.edu.cn 计算机科学技术研究所 http://www.icst.pku.edu.cn/cryptocourse/. 内容提要. 信息安全引论 对称密钥密码 对称密钥密码应用基础 公开密钥密码 数字签名与 hash 函数 公开密钥密码应用基础 密钥管理. 公钥密码应用基础. 认证协议 双向认证协议 单向认证协议 X.509 认证服务 识别协议 引言 数学基础 零知识证明介绍 识别协议 . 双向认证介绍 (1). .
E N D
密码算法与应用基础 六、公开密钥密码应用基础 阳振坤 yzk@icst.pku.edu.cn 计算机科学技术研究所 http://www.icst.pku.edu.cn/cryptocourse/
内容提要 • 信息安全引论 • 对称密钥密码 • 对称密钥密码应用基础 • 公开密钥密码 • 数字签名与hash函数 • 公开密钥密码应用基础 • 密钥管理
公钥密码应用基础 • 认证协议 • 双向认证协议 • 单向认证协议 • X.509认证服务 • 识别协议 • 引言 • 数学基础 • 零知识证明介绍 • 识别协议
双向认证介绍(1) • 双向认证使通信双方确认对方的身份 • 密钥分发时使用过双向认证 • 用对称密码分发对称密钥(基于KDC) • Needham & Schroeder的建议 AKDC: (IDA||IDB||N1) KDCA: EKa[Ks||N1||EKb(Ks,IDA)] • AB: EKb(Ks||IDA) • BA: EKs(N2) • AB: EKs(f(N2)) e.g., f(x)=x+1 • 该协议不能抵抗重放攻击
双向认证介绍(2) • 用公钥密码分发对称密钥 • 每个用户知道授权机构的公钥 • 用户通过请求授权机构获得通信对方的公钥: • AAuth: (IDA,IDB,T1) (T1可以是时间戳或随机数) • AuthA: EKRauth(KUb,T1) • A和B获得了双方的公钥后的相互认证: AB: EKUb(IDA,N1) BA: EKUa(N1,N2) AB: EKUb(N2)
双向认证介绍(3) • 双向认证的核心: “保密性+时效性” • 保密性 • 双方的身份证明信息: 抵抗假冒 • 双方的会话密钥: 保证后续通信的隐秘 • 需要预先存在共享密钥或知道对方的公钥
双向认证介绍(4) • 时效性: 抵抗重放攻击 • 重放攻击例子: • 简单重放 • 在有效时间内重放 • 不能检测的重放: 原始的消息没有到达 • 针对消息发送者的重放(对称加密) • 保障时效性的措施 • 使用序列号: • 需初始值且要随机性维护同步(系统崩溃) • 时间戳 • 请求/应答
双向认证介绍(5) • 时间戳 • 通信双方时钟要同步 • 需要有协议保证时钟的同步 • 该协议必须有良好的容错性和安全性 • 任一方失去时钟同步,攻击就可能发生 • 时间窗口必须大于网络延时 • 不适合于有连接的环境 • 在Windows2000/Kerberos使用(登录时被同步) • 请求/应答 • 能很好地抵抗重放攻击 • 适合于有连接的通信 • 不能用于无连接的通信(如email系统)
基于对称密码的双向认证(1) • 需要可信任的KDC • KDC产生并安全地分发随机会话密钥 • Needham & Schroeder的建议: 分发Ks到A和B AKDC: (IDA||IDB||N1) KDCA: EKa[Ks||N1||EKb(Ks,IDA)] • AB: EKb(Ks||IDA) • BA: EKs(N2) • AB: EKs(f(N2)) e.g., f(x)=x+1 • 攻击者获得一个旧Ks即可冒充A实施重放攻击
基于对称密码的双向认证(2) • Denning的改进: 增加时间戳 AKDC: (IDA||IDB||N1) KDCA: EKa[Ks||N1||EKb(Ks,IDA,T)] • AB: EKb(Ks||IDA||T) • BA: EKs(N2) • AB: EKs(f(N2)) e.g., f(x)=x+1 • |Clock-T|<t1+t2时,消息有效 t1:A/B与KDC时间差, t2: 估计的网络延时 • 若A/B时钟比KDC快,攻击者可截获KDC到A/B消息,并延迟到A/B的时间再发出(replay)
基于对称密码的双向认证(3) • 一种改进: B向KDC确认A的请求 AKDC: (IDA||IDB||N1) KDCA: EKa[Ks||N1||EKb(Ks,IDA,N2)] • AB: EKb(Ks||IDA||N2) • BKDC: (IDB||IDA||N2||N3) • KDCB: EKb(N3) • BA: EKs(N4) • AB: EKs(f(N4)) e.g., f(x)=x+1
基于对称密码的双向认证(4) • Kehn的改进 AB: (IDA||Na) A生成nonce(Na),连同身份信息传给B,以后Na将被加密后传回给A以保证时效性 BKDC: IDB||Nb||EKb(IDA,Na,Tb) B生成nonce(Nb),连同身份信息传给KDC,以后Nb将被加密后传回给B以保证时效性;此外,A的身份和nonce (Na)再加上B的时间戳Tb被加密后也传给KDC. • 问题: 为什么B既使用nonce,又使用时间戳?
基于对称密码的双向认证(5) • KDCA:EKa(IDB,Ks,Na,Tb)||EKb(IDA,Ks,Tb)||Nb • KDC把B的身份和时间戳,A的nonce(Na)以及会话密钥Ks用EKa加密传给A:A收到了自己开始发出的nonce(Na),知道这不是一个重放;把A的身份,Ks以及B的时间戳Tb用EKb加密也传给A(作为一张传票);KDC也把B的nonce(Nb)传给A:为了Nb能被传回给B • AB: EKb(IDA,Ks,Tb)||EKs(Nb) • A把传票给B,同时把B的nonce(Nb)用会话密钥Ks加密后也传给B: B收到了自己的nonce(Nb),知道这不是一个重放,同时也确认了会话密钥Ks.
基于对称密码的双向认证(6) • Kehn的改进: AB: (IDA||Na) BKDC: IDB||Nb||EKb(IDA,Na,Tb) • KDCA:EKa(IDB,Ks,Na,Tb)||EKb(IDA,Ks,Tb)||Nb • AB: EKb(IDA,Ks,Tb)||EKs(Nb) • 问题: B为什么既使用nonce,又使用时间戳? • 无需时钟同步,A在有效时间内可多次使用上述的传票,避免多次访问KDC AB: EKb(IDA,Ks,Tb)||Na B检查传票是在有效时间内, BA:Nb||EKs(Na) • BA: EKs(Nb)
基于公钥密码的双向认证(1) • 用公钥密钥分发对称密钥: AB: EKUb(IDA,N1) BA: EKUa(N1,N2) AB: EKUb(N2) AB: Y=EKUb(EKRa(Ks)) B解密Y获得会话密钥Ks=DKUa(DKRb(Y)) • 前提: A和B已知双方的公钥,这需要公钥的分发. • 问题: 看上去好像没有什么用.果真如此吗? • 若缺少,则E可以冒充A执行,而B无法察觉,即没有实现B对A的认证.
基于公钥密码的双向认证(2) • 公钥分发: Denning建议 • AS是认证服务器,其公钥广为人知. AAS: IDA||IDB ASA: EKRas(IDA,KUa,T)||EKRas(IDB,KUb,T) T是时间戳 AB: EKRas(IDA,KUa,T)||EKRas(IDB,KUb,T)|| EKUb(EKRa(Ks,T)) • 认证服务器AS不知道会话密钥 • 问题: A,B和AS需要时间同步
基于公钥密码的双向认证(3) • 公钥分发: Woo & Lam建议 • AS是认证服务器,其公钥广为人知. AAS: IDA||IDB ASA: EKRas(IDB,KUb) AB: EKUb(IDA,Na) BAS: IDA||IDB||EKUas(Na) ASB: EKRas(IDA,KUa)||EKUb(EKRas(Na,Ks,IDB)) BA: EKUa(EKRas(Na,Ks,IDB)||Nb) AB: EKs(Nb) • 这个协议比较安全.问题:它足够安全吗?
基于公钥密码的双向认证(4) • 公钥分发: 对Woo & Lam建议的攻击 • 假定B是中央服务器(有大量服务),E监听与B的连接,不同的人可能产生相同nonce,假如E发现J(在前)和A(在后) AAS: IDA||IDB ASA: EKRas(IDB,KUb) AB: EKUb(IDA,Na) BAS: IDA||IDB||EKUas(Na) ASB:EKRas(IDA,KUa)||EKUb(EKRas(Na,Ksab,IDB)) EB: EKRas(IDA,KUa)||EKUb(EKRas(Na,Ksjb,IDB)) BA: EKUa(EKRas(Na,Ksjb,IDB)||Nb) AB: EKs(Nb) • 通信方无法察觉受到的攻击.
基于公钥密码的双向认证(5) • 增加随机数的位数可减少被攻击的机会 • 公钥分发: Woo & Lam建议的修改 AAS: IDA||IDB ASA: EKRas(IDB,KUb) AB: EKUb(IDA,Na) BAS: IDA||IDB||EKUas(Na) ASB:EKRas(IDA,KUa)||EKUb(EKRas(IDA,Na,Ks,IDB) BA: EKUa(EKRas(IDA,Na,Ks,IDB)||Nb) AB: EKs(Nb) • 由于IDA与Na绑定,E无法实施前述replay攻击 • 设计安全的协议比看起来困难得多
单向认证(1) • 双向认证需要双方同时在线(有连接的通信) • email最大的优势是不需要双方同时在线(无连接+存储+转发) • 邮件协议(如SMTP)要传送邮件,所以email的头部(信封)必须要可见 • 保密:email的内容不需要对邮件协议可见 • 认证:接收者能对邮件的来源有一定的认证
基于对称密码的单向认证 • 基于非中心化的对称密钥方案 AB: EKab(Ks,IDA)||EKs(M) • 基于中心化的对称密钥方案 AKDC: (IDA||IDB||N1) KDCA: EKa[Ks||IDB||N1||EKb(Ks,IDA)] AB: EKb(Ks,IDA)||EKs(M) • 不能抵抗重放攻击
基于公钥密码的单向认证(1) 只需要保密: • AB: EKUb(Ks)||EKs(M) • 条件: A需要知道B的公钥且确定其有效 只需要认证: • AB: M||EKRa(H(M)) • 条件: B需要知道A的公钥且确定其有效 既需要保密,又需要认证: • AB: EKUb(Ks)||EKs[M||EKRa(H(M))] • 条件:A和B都要知道对方的公钥且确定其有效
基于公钥密码的单向认证(2) • 使用数字证书: 只需要认证: • AB: M||EKRa(H(M))||EKRas(T,IDA,KUa) • 条件: B能确定A的数字证书的有效性(知道证书签署者的公钥且能确定其有效性) 既需要保密,又需要认证: • AB: EKUb(Ks)|| EKs(M, EKRa(H(M)))||EKRas(T,IDA,KUa) • 条件: A需要知道B的公钥且确定其有效,B能确定A的数字证书的有效性
X.509认证服务 • X.509针对认证服务定义了数字证书的内容以及基于公钥证书的认证协议 • 1988年发布第一版,1993年发布第二版,1995年发布第三版(X.509v3) • 基础是公钥密码(数字签名) • 推荐使用RSA算法 • 有广泛的应用 • S/MIME: 加密电子邮件 • IP Security: 安全IP层 • SSL/TLS: 安全传输层 • SET: 安全电子交易(信用卡)
Certification Authority(CA) • X.509的核心是数字证书 • 数字证书由某个认证中心(CA)产生并签署 • CA保证了证书与持有者之间的对应关系 • CA存储用户的数字证书 • CA提供目录服务(目录服务器) • 目录服务器不为用户生成密钥对(公钥私钥) • 目录服务器不提供认证服务
Digital Certificate(2) • Version: X.509版本号(v1,v2,v3) • Serial number: CA内标识证书(用户)的整数,不同证书 (用户)的序列号不同(同一CA内) • Signature algorithm identifier: CA用来签署该证书的算法和参数,在后面也出现. • Issuer name: 发行并签署该证书的CA • Period of validity: 有效期(起始日期和终止日期) • Subject name: 证书持有者的姓名 • Subject’s public-key info:证书持有者的的公钥,算法类型及参数(可与CA的签名算法不同)
Digital Certificate(3) • Issuer unique identifier(v2): 标识证书发行者的位串,很少使用 • Subject unique identifier(v2): 标识证书持有者的位串,很少使用 • Extensions(v3): 一些扩展属性,共三类(后面详细介绍) • Signature & algorithm identifier: 用CA私钥签名的hash值以及签名算法和参数
Digital Certificate(4) • CA签发给A的证书可表示为: CA<<A>> = CA{V,SN,AI,CA,TA,A,Ap} • G<<U>> := 由G签发给U的数字证书 • G{I} := the signing of I by G • 假如CA的公钥是广为人知的,那么: • 任何人能从别人的数字证书中获得对方的公钥 • 除了CA,任何人都不能修改证书而不被发觉 • 数字证书可存放在公共只读目录供所有人访问
多个CA的情形 • 数量,地域…多个CA存在是必要性的 • 假定A,B的证书分别由X,Y签发,即 X<<A>> Y<<B>> • 如果A不知道B证书的CA(Y)的公钥,则B的证书对A没有任何用处 • 如果A,B的CA之间互相知道对方的公钥,A,B就可以验证和使用对方的证书: A从X(A的CA)获得X<<Y>>: 获得Y的公钥 A从Y(B的CA)获得Y<<B>>: 获得B的公钥 • A获得B的证书: X<<Y>> Y<<B>> • 扩展到多个CA:X1<<X2>>X2<<Z3>>…XN<<B>> • 条件: 任意两个(Xi,Xi+1)之间要互相签署证书
多个CA的树状结构(1) • AB: X<<W>>W<<V>>V<<Y>>Y<<Z>>Z<<B>> • BA: Z<<Y>>Y<<V>>V<<W>>W<<X>>X<<A>>
多个CA的树状结构(2) • Forward certificates: Certificates of X generated by others. • 对于V: W<<V>>, U<<V>>, Y<<V>> • Reverse certificates: Certificates of others generated by X . • 对于V: V<<W>>, V<<U>>, V<<Y>>
证书撤销 • 证书被撤销原因: 证书过了有效期(自动被撤销) 用户的私钥泄漏 CA不再担保某用户 CA的私钥泄漏(该CA签署的证书全部要撤销) • 每个CA需要维护证书撤销列表(CRL) • CRL只包含被撤销证书的序列号 • CRL不包含过期的证书 • 使用者需要检查证书是否被撤销 • 使用者在本地缓冲证书撤销列表以提高速度
X.509认证过程(1) • X.509定义了三种认证过程 • 假定双方已经有了对方的有效证书 • One-way authentication • AB: A{Ta,Na,B,SgnData,EKUb(Kab)} • Ta包含起始时间和终止时间 • Na在有效时间内唯一,B缓冲Na直到过了有效期 • 仅仅使用nonce容易被replay攻击 • SgnData是签名数据 • 仅实现了A的身份认证 • 需要时间同步
X.509认证过程(2) • Two-way authentication • AB: A{Ta,Na,B,SgnData,EKUb(Kab)} • BA: B{Tb,Nb,A,Na,SgnData,EKUa(Kba)} • 有冗余信息 • 也实现了对B的身份认证 • 能抵抗重放攻击 • 需要时间同步 • Three-way authentication • AB: A{Ta,Na,B,SgnData,EKUb(Kab)} • BA: B{Tb,Nb,A,Na,SgnData,EKUa(Kba)} • AB: A{Nb} • 无需时间同步
X.509 Version 3 • X.509v3没有增加固定域,而是灵活的扩展项 • 每个扩展项包含: 标识符,不可忽略指示,扩展值 • 如果遇到一个扩展不能被处理,且其不可忽略指示为TRUE,则该证书被认为是无效的. • X.509v3的扩展有三类: Key and policy information Certificate subject and issuer attributes Certification path constrains
Key and Policy Information(1) • 这类扩展提供关于证书的发行者和持有者的附加信息以及证书的策略指示(如针对EDI交易的证书可能指示交易的价格范围) • Authority key identifier: CA公钥标记,标识该公钥用来验证本证书或者CRL,可用于CA公钥升级. • Subject key identifier: 用户的公钥标记,可用于用户公钥的升级以及一个用户有多个公钥的情形(用于不同的目的:签名,密钥加密…)
Key and Policy Information(2) • Key usage: 现在公钥的使用范围,如签名,不可否认性,加密密钥,加密数据,密钥协议,CA数字证书签名的验证,CA的CRL签名的验证… • Private-key usage period: 私钥的有效期(用作数字签名的私钥的有效期一般比公钥短) • Certificate policies: 证书可使用的多种环境或策略 • Policy mappings: 仅用于CA相互签署的证书,标识签署者的一条或多条策略是否可用于被签署者
Certificate subject & issuer attributes • 这类扩展提供关于证书发行者和持有者的别名或其他信息(公司的邮政地址,图片等) • Subject alternative name: 证书持有者的别名信息,如在email,EDI等中的别名. • Issuer alternative name: 证书发行者的别名 • Subject directory attributes: 证书持有者的目录服务属性
Certification path constrains • 这类扩展仅用于CA之间的签署证书,限制被签署CA可以签发的证书类型,或者允许其出现在后续的证书链中 • Basic constraint: 标识证书持有者是否可以作为CA,如果是,一个证书链长度可以给出. • Name constrains: 指示一个后续的证书持有者的名字必须出现的名字空间 • Policy constrains: 关于证书链的后续节点的策略指示
识别协议引言(1) • 用户登录的实现: 初始化: 用户设置密码, 计算机记到磁盘上 登录: 用户输入密码,计算机跟记住的密码比较 • 问题: 访问磁盘就可能获得用户的密码 • 用户登录实现的改进 初始化: 用户设置密码, 计算机进行hash,把hash值记到磁盘上,立即销毁用户密码 登录: 用户输入密码,计算机执行hash,再跟记住的hash值比较 • 问题: 攻击者输入一个串,产生hash,访问磁盘并用该hash替换用户密码的hash,可假冒用户登录
识别协议引言(2) • 用户登录实现的再改进: 初始化: 用户设置密码, 计算机进行hash,用hash值对一段已知明文以及用户的账号等关键数据进行加密并保存,立即销毁用户的密码以及其hash值 登录: 用户输入密码,计算机执行hash,再对同样已知明文加密,与保存的加密结果比较,若相同, 则试图解密用户账号等关键数据 • 攻击: 攻击者输入串,产生假冒hash并用其加密已知明文,访问磁盘并用该加密结果替换原来的已知明文的加密结果,则计算机执行第一步会通过,但假冒的hash不能解密用户的账号等关键数据
识别协议引言(3) • 安全的识别协议应该满足: 证明者A能向验证者B证明他的确是A 在证明者A向验证者B证明其身份后,验证者B不能假冒A(向第三方证明他是A) • 证明者A在证明中泄漏的信息越少越好,验证者B从验证中获得的关于A的信息越少越好 • 如果证明者A除了向B证明自己是A外没有泄漏任何其他信息,则属于“身份的零知识证明”
剩余类 • 我们曾用过模n的剩余类一些结论,现在给出正式的定义. • 对任何非0整数nZ(全体整数集合),集合Zn={0,1,2,…,n-1}称为模n的最小剩余集 • Zn中可“自然”地定义加法和乘法运算(模n运算): (a+b)|Zn := ((a+b)|Z mod n) (ab)|Zn := ((ab)|Z mod n) • 容易知道上述运算满足交换率,结合率和分配率 • 加法的负元素: (-a)|Zn := (n-a)|Z,并定义减法为: (a-b)|Zn := (a+(-b))|Zn := ((a-b)|Z mod n) • 乘法的逆元素: 若aZn且x使得(ax)|Zn=1,则称说a是可逆的且称x是a的逆,记作a-1
逆的唯一性 • 结论: Zn中一个元素的逆若存在,则必是唯一的 • 证明: 假设a,x,yZn, ax = 1且ay = 1 则 x = x1 = x(ay) = (xa)y (结合律) = (ax)y (交换律) = 1y = y x = y • Zn中除法运算: 若aZn中且a可逆,则 (b/a)|Zn := (b(a-1))|Zn • Zn中的加,减,乘,除运算跟Z中加,减,乘,除运算有非常相似的性质
逆存在的充分必要条件(1) • 结论: Zn中元素a的逆存在 gcd(a,n)=1 • 证明: 假定Zn中元素a的逆存在 那么bZn使得(ab)|Zn = 1 (ab)|Z 1 mod n 整数k,使得(ab)|Z = (kn+1)|Z (ab-kn)|Z = 1 若a,n有大于1的共因子d,则左式能被d整除,而右式等于1(不能被d整除!),矛盾. gcd(a,n) = 1; 反过来,假定若gcd(a,n) = 1 扩展的Euclidean算法可算出a的逆(从而证明了逆的存在性),下面的方法也能证明逆的存在.
逆存在的充分必要条件(2) 令集合S={(ax)|Zn:对所有x属于Zn},显然SZn.我们要证明S=Zn,这只要证明S和Zn的元素个数一样多,为此只要证明任意两个(ax)|Zn不等,即: x yZn, 必有(ax)|Zn (ay)|Zn 否则, (a(x-y))|Zn = (ax)|Zn - (ay)|Zn = 0 n|(a(x-y)),由于gcd(a,n)=1,因此n|(x-y), 但是, 0 x y < n, n|(x-y)不可能成立. 由此可知S=Zn S包含元素1 bZn使得(ab)|Zn=1 a的逆存在
逆的计算 • 定义: Zn*={aZn且a可逆}={aZn且gcd(a,n)=1} • 结论: |Zn*| = (n), (n)是Euler函数. • 若p是素数,则Zp*={1,2,…,p-1}=Zp\{0} • 由Euler定理可知, aZn*,则a(n) 1 mod n,从而有: a-1=a(n)-1 mod n • 尽管Euler定理给出了的a-1计算公式,但这个公式的计算效率是很低的,扩展的Euclidean算法更有效.
二次剩余 • 二次剩余: 设aZn*,若x使得 x2 a mod n,则称a是n的一个二次剩余,x称为a的一个平方根,n的二次剩余集合记为Qn, n的二次非剩余集合记为NQn,则NQn= Zn*\Qn. • aZn* gcd(a,n)=1, 若x2 a mod n,那么显然gcd(x,n)=1 xZn* ,即二次剩余的平方根还是可逆元素. • 许多因子分解算法利用二次剩余进行 • 结论:若x是a的平方根,则n-x是也是一个平方根 • 问题: 二次剩余的平方根就是两个吗? • 若n是奇素数,则结论成立;若n是一个RSA模(即n=pq, pq奇素数),则二次剩余的平方根为四个.