现代密码学-认证协议

发布于:2024-06-07 ⋅ 阅读:(130) ⋅ 点赞:(0)

A.B两个用户想通过网络先建立安全的共享密钥再进行保密通信?A(B)如何确信自己正在和B(A)通信而不是C?这种通信方式为双向通信,此时的认证为相互认证。

相互认证

A/B两个用户在建立共享密钥时需要考虑的核心问题:保密性和实时性;

保密性:防止会话密钥伪造或泄露,会话密钥组哎通信双方之间交换时应该以密文的形式--所以通信双方事先应该有密钥或公钥。

实时性:防止消息的重放攻击。常用两种方法:时间戳(要求各方的时钟同步,每次收到的消息里都包含一个时间戳,接收方需要用该时间戳和自己本地的时间作比较;该方法不能用于面向连接的应用过程)和询问-应答(发送者发一个一次性随机数询问,接收者回应正确的一次性随机数;该方法不适合于无连接场景)。

单钥加密体制

单密钥体制需要有一个可信的密钥分配中心KDC,每个用户与KDC都有一个共享的密钥--主密钥K_A,K_B。KDC为通信双方建立一个短期的会话密钥,用主密钥加密会话密钥后分配给用户。

  1. A向KDC发起向B通信的请求:A\rightarrow KDC:ID_{A}||ID_{B}||N_1
  2. A从KDC处获得会话密钥K_sKDC\rightarrow A:E_{K_A}[K_s||ID_B||N_1||E_{K_B}[K_s||ID_A]]
  3. A将KDC发来的消息用自己的密钥解密,获得会话密钥K_s和要发给B的密文信息E_{K_B}[K_s||ID_A]发给B:A\rightarrow B:E_{K_B}[K_s||ID_A]
  4. B用自己的密钥解密获得会话密钥 ,B生成一次性随机数并用会话密钥加密发给A:B\rightarrow A:E_{K_s}[N_2]
  5. A收到消息用会话密钥解密获得B发的随机数,并应答B的消息:A\rightarrow B:E_{K_s}[f(N_2)]

第4,5步用于防止重放攻击。攻击者可以截获第3步消息进行重放攻击,如果没有第4,5步,B无法检测出自己得到的会话密钥式重放的旧的密钥。

攻击者在截获第3部消息后,可进一步截获第4步B发出的询问,然后假冒A做出第5步回答。对于这一攻击场景,可以在第2,3步加上时间戳。

  1. A\rightarrow KDC:ID_{A}||ID_{B}
  2. KDC\rightarrow A:E_{K_A}[K_s||ID_B||T||E_{K_B}[K_s||ID_A||T]]
  3. A\rightarrow B:E_{K_B}[K_s||ID_A||T]
  4. B\rightarrow A:E_{K_s}[N_1]
  5. A\rightarrow B:E_{K_s}[f(N_1)]

时间戳用于保证会话密钥的时效性。|Clock-T|< \Delta t_1+\Delta t_2,Clock为本地时钟。t1为本地时钟与KDC时钟差,t2为网络时延。

上面的改进还存在问题:等待重放攻击:利用时钟同步差异进行攻击,若发送方时钟超前,攻击者截获发送方消息并等待消息时间戳接近接收方时间再重发该消息。---应对方法:网络各方以KDC时钟为基准定期检测调整;还可增加使用一次性随机数握手协议

A\rightarrow B:ID_A||N_A

B\rightarrow KDC:ID_B || N_B||E_{K_B}[ID_A||N_A||T_B]

KDC\rightarrow A:E_{K_A}[ID_B || N_A||K_s||T_B]||E_{K_B}[ID_A||K_s||T_B]||N_B

A\rightarrow B:E_{K_B}[ID_A||K_s||T_B]||E_{K_s}[N_B]

 


公钥加密体制

认证服务器AS密钥对SK_{AS},PK_{AS},A的密钥对SK_A,PK_A,B的密钥对SK_B,PK_B

  1. A将自己的身份和想通信的对象身份一起发给AS:A\rightarrow AS:ID_A ||ID_B
  2. AS发给A两个链接的数据项都利用AS的私钥加密(AS签名),分别作为分发给双方的公钥证书AS\rightarrow A:E_{SK_{AS}}[ID_A||PK_{A}||T]||E_{SK_{AS}}[ID_B||PK_B||T]
  3. A选取会话密钥并经自己的密钥和B的公钥加密后连同两个证书一起发给BA\rightarrow B:E_{SK_{AS}}[ID_A||PK_{A}||T]||E_{SK_{AS}}[ID_B||PK_B||T]||E_{PK_B}[E_{SK_{A}}[K_s]||T]

时间戳T用于防止重放 攻击,需要各方时间同步。

也可使用一次性随机数,不要要同步时钟。

 KDC密钥对SK_{KDC},PK_{KDC}

  1. A\rightarrow KDC:ID_A||ID_B
  2. KDC\rightarrow A:E_{SK_{KDC}}[ID_B||PK_B]
  3. A\rightarrow B:E_{PK_B}[N_A||ID_A]
  4. B\rightarrow KDC:ID_B||ID_A||E_{PK_{KDC}}[N_A]
  5. KDC\rightarrow B:E_{SK_{KDC}}[ID_A||PK_A]||E_{PK_B}[{E_{SK_{KDC}}[N_A||K_s||ID_B]}]
  6. B\rightarrow A:E_{PK_A}[E_{SK_{KDC}}[N_A||K_s||ID_B]||N_B]
  7. A\rightarrow B:E_{K_s}[N_B]