Telegram DH Key Exchange

Telegram 的密钥交换过程是一个 RSA 与 DH 相结合的过程,对通常的 DH 算法交换参数也进行加密传输。过程如下:

Telegram DH

上述描述的是客户端与服务端交互使用的密钥交换过程,而对于端到端(end-to-end)的会话消息只在两个设备之间加密与解密,服务端只是二者之间通信的管道,它们间借助服务端进行基本的 DH 过程。

首先,A 先从 Server 取得 p、q、slat,然后生成 ga,将它发送给 B。B 从 Server 取得 p、q、slat、ga,然后生成 gbauth_key,随后将 gb 发给 A 让其可以计算出 auth_key

(nonce, server_nonce) 标识一次握手

首先,客户端生成一个随机数 nonce 发给服务端。服务端也生成一个随机数 server_nonce,再附加一个 RSA 公钥指纹一起发客户端,这样就可以用这两个随机数对来标识一次握手。

(server_nonce, new_nonce) 导出临时密钥来加密 DH 参数

客户端带着 RSA 公钥指纹,再生成一个随机数 new_nonce 通过 RSA 加密传给服务端,这样子 new_nonce 别人是不知道的,就可以用它来导出 AES 加密的临时密钥。

DH 密钥交换得到加密密钥 auth_key

有了上一步的临时密钥就开始进入常规的 DH 密钥交换过程(如下图),这个过程的参数将通过这个临时密钥进行加密传输,然后就可以导出 auth_key

DH