Telegram DH Key Exchange
Telegram 的密钥交换过程是一个 RSA 与 DH 相结合的过程,对通常的 DH 算法交换参数也进行加密传输。过程如下:
上述描述的是客户端与服务端交互使用的密钥交换过程,而对于端到端(end-to-end)的会话消息只在两个设备之间加密与解密,服务端只是二者之间通信的管道,它们间借助服务端进行基本的 DH 过程。
首先,A 先从 Server 取得
p、q、slat
,然后生成ga
,将它发送给 B。B 从 Server 取得p、q、slat、ga
,然后生成gb
与auth_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
。