Skip to content
Notes
GitHub

第 5 章 密钥管理

5.1. 对称加密体制的密钥分配

5.1.1. 基本方法

两个用户在使用单钥体制进行通信时,必须预先共享秘密密钥,并且应当时常更新,用户 A 和 B 共享密钥的 方法主要有

  1. A 选取密钥并通过物理手段发送给 B
  2. 第三方选取密钥并通过物理手段发送给 A 和 B
  3. A, B 事先已有一密钥,其中一方选取新密钥,用已有密钥加密新密钥发送给另一方
  4. A 和 B 分别与第三方 C 有一保密信道,C 为 A, B 选取密钥,分别在两个保密信道上发送给 A 和 B
  • 如果有 n\displaystyle{ n } 个用户,需要两两拥有共享密钥,一共需要 nn12\displaystyle{ n \frac{ n - 1 }{ 2 } } 的密钥
  • 采用第 4 中方法,只需要 n\displaystyle{ n } 个主密钥

public/cypto/crypto06.svg

  • KS\displaystyle{ K _{ S } } 一次性会话密钥
  • N1,N2\displaystyle{ N _{ 1 } , N _{ 2 } } 随机数
  • KA,KB\displaystyle{ K _{ A } , K _{ B } } 为 A 与 B 和 KDC 的共享密钥
  • f\displaystyle{ f } 为某种函数变换
  1. A 向 KDC 发送会话密钥请求。请求信息由两个数据项组成:① A 和 B 的身份 ② 这次业务唯一识别符 N1\displaystyle{ N _{ 1 } }
  2. KDC 为 A 的请求发出应答。应答是由 KA\displaystyle{ K _{ A } } 加密的消息,因此只有 A 能成功解密,并且 A 可以相信该消息是由 KDC 发出的。消息中包含两项内容 ① 一次性会话密钥 KS\displaystyle{ K _{ S } } ② A 在 1 中发出的请求,包括唯一标识符等(可用于验证)
    • 此外还包含 B 希望得到的两项内容 ① 一次性会话密钥 KS\displaystyle{ K _{ S } } ② A 的身份 IDA\displaystyle{ I D _{ A } },由 KB\displaystyle{ K _{ B } } 加密,用于向 B 证明 A 的身份
  3. A 存储会话密钥,向 B 转发 EKB[KSIDA]E_{K_B}[K_S \parallel ID_A],转发过程不会被窃听。B 收到后可获得会话密钥 KS\displaystyle{ K _{ S } },并由 IDA\displaystyle{ I D _{ A } } 验证 A 的身份,从 E{KB}\displaystyle{ E _{ \left\lbrace K _{ B } \right\rbrace } } 知道 KS\displaystyle{ K _{ S } } 确实来自 KDC
  4. B 用会话密钥 KS\displaystyle{ K _{ S } } 加密另一个随机数 N2\displaystyle{ N _{ 2 } },发给 A
  5. A 以 f(N2)\displaystyle{ f \left( N _{ 2 } \right) } 应答 B,用会话密钥加密后发给 B

3 已经完成密钥分配,4 5 用于认证

5.1.5. 无中心的密钥控制

B 与 A 需要提前共享一个主密钥

graph LR Alice -- "1. Request || N1" --> Bob Bob -- "2. EMKm[KS || Request || IDB || f(N1) || N2]" --> Alice Alice -- "3. EKS[f(N2)]" --> Bob
%%{init: {'theme':'dark'}}%% graph LR Alice -- "1. Request || N1" --> Bob Bob -- "2. EMKm[KS || Request || IDB || f(N1) || N2]" --> Alice Alice -- "3. EKS[f(N2)]" --> Bob
  1. A 向 B 发出建立会话密钥的请求和一个一次性随机数 N1\displaystyle{ N _{ 1 } }
  2. B 用与 A 共享的主密钥 MKm\displaystyle{ MK _{ m } } 对应答的消息加密,并发送给 A 。应答的消息中有 B 选取的会话密钥、B 的身份、f(N1)\displaystyle{ f \left( N _{ 1 } \right) }N2\displaystyle{ N _{ 2 } }
  3. A 使用新建立的会话密钥 KS\displaystyle{ K _{ S } }f(N2)\displaystyle{ f \left( N _{ 2 } \right) } 加密后发给 B

5.2. 公钥加密体制的密钥管理

5.2.1. 公钥的分配

1. 公开发布

  • 用户将自己的公钥发给每一个其他用户
  • 方法简单,但没有认证性,因为任何人都可以伪造这种公开发布

3. 公钥管理机构

  • 公钥管理机构为用户建立维护动态的公钥目录。
  • 每个用户知道管理机构的公开钥
  • 只有管理机构知道自己的秘密钥

public/cypto/crypto07.svg

4. 公钥证书

上述公钥管理机构分配公开钥时也有缺点,由于每一用户要想和他人联系都需求助于管理机构,所以管理机构有可能成为系统的瓶颈,而且由管理机构维护的公钥目录表也易被敌手窜扰。

分配公钥的另一方法是公钥证书,用户通过公钥证书相互之间交换自己的公钥而无需与公钥管理机构联系。

公钥证书由证书管理机构 CA(Certificate Authority) 为用户建立,其中的数据项有与该用户的秘密钥相匹配的公开钥及用户的身份和时戳等,所有的数据项经 CA 用自己的秘密钥签字后就形成证书,即证书的形式为

CA=E{SK{CA}}[T,IDA,PKA]\displaystyle{ C _{ A } = E _{ \left\lbrace S K _{ \left\lbrace C A \right\rbrace } \right\rbrace } \left[ T , I D _{ A } , P K _{ A } \right] }
  • IDA\displaystyle{ I D _{ A } } 是用户 A 的身份
  • PKA\displaystyle{ P K _{ A } } 是 A 的公钥
  • T\displaystyle{ T } 是当前时间戳
  • SK{CA}\displaystyle{ S K _{ \left\lbrace C A \right\rbrace } } 是 CA 的秘密钥
  • CA\displaystyle{ C _{ A } } 即为 CA 为 A 产生的证书

public/cypto/crypto08.svg

用户可将自己的公开钥通过公钥证书发给另一用户,接收方可用 CA 的公钥 PK{CA}\displaystyle{ P K _{ \left\lbrace C A \right\rbrace } } 对证书加以验证,即

D{PK{CA}}[CA]=D{PK{CA}}[E{SK{CA}}[T,IDA,PKA]]=(T,IDA,PKA)\displaystyle{ D _{ \left\lbrace P K _{ \left\lbrace C A \right\rbrace } \right\rbrace } \left[ C _{ A } \right] = D _{ \left\lbrace P K _{ \left\lbrace C A \right\rbrace } \right\rbrace } \left[ E _{ \left\lbrace S K _{ \left\lbrace C A \right\rbrace } \right\rbrace } \left[ T , I D _{ A } , P K _{ A } \right] \right] = \left( T , I D _{ A } , P K _{ A } \right) }

因为只有用 CA 的公钥才能解读证书,接收方从而验证了证书的确是由 CA 发放的,且也获得了发方的身份 IDA\displaystyle{ I D _{ A } } 和公开钥 PK\displaystyle{ P K }

时戳 T\displaystyle{ T } 为接收方保证了收到的证书的新鲜性,用以防止发方或敌方重放一旧证书。因此时戳可被当作截止日期,证书如果过旧,则被吊销

5.2.2. 用公钥加密分配对称密码体制的密钥

1. 简单分配

容易受到中间人主动攻击

graph LR A((A)) -- "1. PKA || IDA" --> B((B)) B -- "2. EPKA[KS]" --> A
%%{init: {'theme':'dark'}}%% graph LR A((A)) -- "1. PKA || IDA" --> B((B)) B -- "2. EPKA[KS]" --> A
graph LR A((A)) -- "1. PKA || IDA" --> E{{攻击者 E}} E -- "2. PKE || IDA" --> B((B)) B -- "3. EPKE[KS]" --> E E -- "4. EPKA[KS]" --> A
%%{init: {'theme':'dark'}}%% graph LR A((A)) -- "1. PKA || IDA" --> E{{攻击者 E}} E -- "2. PKE || IDA" --> B((B)) B -- "3. EPKE[KS]" --> E E -- "4. EPKA[KS]" --> A

2. 用公钥加密分配单钥密码体制的密钥

具有保密性和认证性的密钥分配

前提:双方已完成公钥交换

public/cypto/crypto10.svg

5.2.3. Diffie-Hellman 密钥交换

A 和 B 共享一个素数 p\displaystyle{ p } 以及整数 g\displaystyle{ g }g\displaystyle{ g }p\displaystyle{ p } 的本原根

public/cypto/crypto11.svg

中间人攻击

public/cypto/crypto12.svg

习题

在公钥体制中,每一用户 U 都有自己的公开钥 PKU\displaystyle{ P K _{ U } } 和秘密钥 SKU\displaystyle{ S K _{ U } }。如果任意两个用户 A、B 按以下方式通信,A 发给 B 消息 (E{PK{B}}(m),A)\displaystyle{ \left( E _{ \left\lbrace P K _{ \left\lbrace B \right\rbrace } \right\rbrace } \left( m \right) , A \right) },B 收到后,自动向 A 返回消息 (E{PKA}(m),B)\displaystyle{ \left( E _{ \left\lbrace P K _{ A } \right\rbrace } \left( m \right) , B \right) } 以通知 A, B 确实收到报文 m\displaystyle{ m }

(1) 用户 C 怎样通过攻击手段获取报文 m\displaystyle{ m }

解答

A 给 B 发送消息时,并没有对 A 的身份进行验证,因此 C 可以冒充其中一方以获得信息

  • A 发送 (E{PKB}(m),A)\displaystyle{ \left( E _{ \left\lbrace P K _{ B } \right\rbrace } \left( m \right) , A \right) },中途 C 进行截获,并用自己的身份进行替换。
  • B 收到 (E{PKB}(m),C)\displaystyle{ \left( E _{ \left\lbrace P K _{ B } \right\rbrace } \left( m \right) , C \right) },依据身份 C 发送 (E{PKC}(m),B)\displaystyle{ \left( E _{ \left\lbrace P K _{ C } \right\rbrace } \left( m \right) , B \right) },此时 C 可以截获,用自己的私钥来解密
  • C 做后续处理,将消息封装为 (E{PKA}(m),B)\displaystyle{ \left( E _{ \left\lbrace P K _{ A } \right\rbrace } \left( m \right) , B \right) } 发给 A

在这期间,双方都无法发现 C 在中间截获了信息。

graph LR A((A)) -- "(EPKB(m), A)" --> C{{C}} C -- "(EPKB(m), C)" --> B((B)) B -- "(EPKC(m), B)" --> C C -- "(EPKA(m), B)" --> A
%%{init: {'theme':'dark'}}%% graph LR A((A)) -- "(EPKB(m), A)" --> C{{C}} C -- "(EPKB(m), C)" --> B((B)) B -- "(EPKC(m), B)" --> C C -- "(EPKA(m), B)" --> A

(2) 若通信格式变为

  • A 向 B 发送 E{PKB}(E{SKA}(m),m,A)\displaystyle{ E _{ \left\lbrace P K _{ B } \right\rbrace } \left( E _{ \left\lbrace S K _{ A } \right\rbrace } \left( m \right) , m , A \right) }
  • B 向 A 发送 E{PKA}(E{SKB}(m),m,B)\displaystyle{ E _{ \left\lbrace P K _{ A } \right\rbrace } \left( E _{ \left\lbrace S K _{ B } \right\rbrace } \left( m \right) , m , B \right) }

先对信息签名,而后进行加密,传送的消息有了保密性和认证性,安全性提高。