最近信息安全实验课有一个编程项目,我们组的选题是加密即时通讯软件。上网搜了一番资料后发现一个OTR加密协议(Off-the-Record)。又搜到几篇关于OTR的论文,从中学到了许多加密协议方面的知识。

0x01 原始协议

第一篇论文Off-the-record communication, or, why not to use PGP提出了OTR协议的初始版本:

设计目标

只有对话双方知道对话内容;对话结束后,任何人包括对话双方都不能得到对话内容的副本;虽然对话双方能相互确认身份,但任何人不能向第三方证明身份;上述几个目标都是为了模拟现实生活中的“私人谈话”。

使用的加密特性

  • Perfect forward secrecy (PFS)
  • Digital signatures
  • Message authentication codes(MAC)
  • Malleable encryption

协议使用DH密钥交换提供前向保密性,使用RSA签名进行身份验证。由于签名提供了不可否认性,使得任何人都能验证消息签名,所以只有DH密钥交换的消息中使用签名认证,对话消息不签名,保证可否认性。为保证消息完整性,验证消息来源,使用MAC。使用流密码加密,使得任何人在不知道密钥的情况下也可以伪造会话消息。

协议过程

Encryption

为保证会话密钥短时性,每次会话都使用DH交换新密钥,DH交换与会话消息发送同时进行。

\[ A \rightarrow B:g^{x_1} \]

\[ B \rightarrow A:g^{y_1} \]

\[ A \rightarrow B: g^{x_2}, E_{k_{11}}(M_1) \]

\[ B \rightarrow A: g^{y_2}, E_{k_{21}}(M_2) \]

\[ A \rightarrow B: g^{x_3}, E_{k_{22}}(M_3) \]

Forgetting Keys

当会话密钥过期后,密钥被丢弃。而当Alice不停向Bob发送消息时,会产生许多会话密钥,由于延迟,Bob使用的会话密钥是不可预知的,因此Alice需维护一个密钥表。

Authentication

MAC密钥从会话密钥经过Hash得到。初始DH密钥交换使用签名认证

\[ A\rightarrow B:Sign_{k_A}(g^{x_1}),K_A \]

\[ B\rightarrow A:Sign_{k_B}(g^{y_1}),K_B \]

正常的会话消息如下

\[ g^{x_{i+1}},E_{k_{ij}}(M_r),MAC_{H(k_{ij})}(\{g^{x_{i+1}},E_{k_{ij}}(M_k)\}) \]

Revealing MAC keys

当Alice收到来自Bob的消息后,Alice把消息的MAC密钥以明文发送出去

0x02 原始协议的问题

第二篇论文Secure Off-the-Record Messaging指出了上篇论文中OTR协议存在的问题

SECURITY ANALYSIS

An authentication failure

原始OTR协议中的DH密钥交换会受到"identity misbinding"攻击。

\[ A \rightarrow E:g^x,Sign_{s_A}(g^x),v_A \]

\[ E\rightarrow B:g^x,Sign_{s_E}(g^x),v_E \]

\[ B\rightarrow E:g^x,Sign_{s_B}(g^x),v_B \]

\[ E\rightarrow A:g^x,Sign_{s_E}(g^x),v_E \]

A freshness-impersonation vulnerability

由于DH密钥交换消息内没有指定接收方,因此会遭受重放攻击

Deniability

如果消息内指定接收方,由于DH密钥交换消息使用签名,因此不具有可否认性。

BUILDING A SOUND AKE FOR OTR

一种可行的密钥交换协议如下:

\[ A\rightarrow B:g^x \]

\[ B\rightarrow A:g^y \]

\[ A\rightarrow B:A,Sign_{sk_A}(g^y,g^x),MAC_{K_m}(0,A),vk_A \]

\[ B\rightarrow A:B,Sign_{sk_B}(g^x,g^y),MAC_{K_m}(1,B),vk_B \]