telegram使用二进制数据序列化和TL 语言描述查询格式。所有大数都作为包含所需字节序列的字符串以大端顺序传输。哈希函数,例如 SHA1,返回字符串(20 字节),也可以解释为大端数。小数(int, long, int128, int256)通常是小端;但是,如果它们是 SHA1 的一部分,则不会重新排列字节。这样,如果long x是 string 的 SHA1 的 64 个低位s,则取20 字节字符串的最后SHA1(s)8 个字节并将其解释为 64 位整数。
在发送未加密的消息(在这种情况下需要生成授权密钥)之前,客户端必须按照以下方式进行 (p,q) 授权。
DH 交换启动
客户端向服务器发送查询
req_pq_multi#be7e8ef1 nonce:int128 = ResPQ;
nonce的值由客户端随机选择(随机数),并在此通信中标识客户端。经过这一步,大家都知道了。
纸飞机服务器发送表单的响应
resPQ#05162463 nonce:int128 server_nonce:int128 pq:string server_public_key_fingerprints:Vector long = ResPQ;
这里,字符串 pq 是自然数的表示(二进制大端格式)。这个数是两个不同的奇质数的乘积。通常,pq 小于或等于 2^63-1。server_nonce的值由服务器随机选择;经过这一步,大家都知道了。
server_public_key_fingerprints是公共 RSA 密钥指纹列表(SHA1 (server_public_key) 的 64 个低位;公共密钥表示为裸类型rsa_public_key n:string e:string = RSAPublicKey,其中,像往常一样,n 和 е 是大端格式的数字,序列化为字节字符串,之后计算 SHA1)由服务器接收。
电报所有后续消息都包含纯文本形式的对 (nonce, server_nonce) 和加密部分,这使得识别“临时会话”成为可能——本页描述的密钥生成协议的一次运行使用相同的 ( nonce, server_nonce) 对。入侵者无法使用相同的参数与服务器创建并行会话,并在此类并行会话中为自己的目的重用服务器或客户端加密消息的部分,因为服务器将为任何新的“临时会议”。
TG工作证明
客户将 pq 分解为质因数,使得 p < q。
这开始了一轮 Diffie-Hellman 密钥交换。