在 Telegram 中解析解密 encrypted_data
Parsing decrypted encrypted_data in Telegram
我正在尝试通过 Telegram 中的秘密聊天(~类似于自己的客户端)实现 receiving/sending 消息,但在解释解密数据时遇到了一些问题。我已阅读 schema,但无法将其与我的数据相匹配。
更具体地说:我收到一条消息(来自官方客户端),字词为"Test12",解码结果(十六进制)为:
3C0000008917E31B0FF1C770B657C36AF705BDACA4BE2C0B2E2C0B2E000000000000000000000000000000DE91B036000000000000000000000000000000000000000000000000000000000000000000000000,0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0000,0000,00000000000000 c7cd55fa5fa6f7c00
我们可以在这里找到从 57 字节(粗体)开始的整个消息,以及(如果我没记错的话)长度(斜体)。但是我怎样才能匹配其他字节呢?在模式中说消息应该从 8 (salt) + 8 (session_id) + 8 (message_id) + 4 (seq_no) + 4 (message_data_length) = 32 字节,不是来自 57 字节。
此外,当我尝试发送更长的消息(超过 ~256 字节)时,"message text" 从 60 字节开始并且长度编码也有点奇怪:FE000400 用于 1024 字节消息和 FE000200 512 字节(FE 是什么意思?)。
所以,任何人都可以给我一个模式或我做错了什么的线索吗?
好的,看来我成功解码了大部分消息。可能对某些人有用:
3C000000 "valuable" 字节数(不包括末尾需要的随机字节填充)
8917E31B (== 467867529),decryptedMessageLayer(第 17 层)的代码
0FF1C770B657C36AF705BDACA4BE2C0B 序列化随机字节数组(应至少包含 15 个字节),OF = 15 - 当前数量
2E000000好像是最小层数
01000000 in_seq_no,收到 (1 - 1) / 2 = 0 条消息,请参阅 Sequence numbers
62000000 out_seq_no,发送了 62 / 2 = 49 条消息,请参阅 Sequence numbers(消息发送者没有发起该聊天)
DE91B036 代码 decryptedMessage#36b091de
00000000 不知道
38507C7CD5FA6F7C 好像是randomId(可能应该和消息传递的一样?)
00000000 不太清楚,可能是ttl
0654657374313200 序列化字符串:前两个字节(06)表示长度。如果超过 254 个,则改为放置 DE(=254) 并且可以从接下来的 3 个字节中找到长度(在我的 'mentioned' 案例中从 60 位置开始)。字符串字节之后是(平均 Test12)并用 0-3 个空字节 (00) 填充。
之后用随机字节 (0-15) 填充结果以构成完整的 16 字节块。
我正在尝试通过 Telegram 中的秘密聊天(~类似于自己的客户端)实现 receiving/sending 消息,但在解释解密数据时遇到了一些问题。我已阅读 schema,但无法将其与我的数据相匹配。
更具体地说:我收到一条消息(来自官方客户端),字词为"Test12",解码结果(十六进制)为:
3C0000008917E31B0FF1C770B657C36AF705BDACA4BE2C0B2E2C0B2E000000000000000000000000000000DE91B036000000000000000000000000000000000000000000000000000000000000000000000000,0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0000,0000,00000000000000 c7cd55fa5fa6f7c00
我们可以在这里找到从 57 字节(粗体)开始的整个消息,以及(如果我没记错的话)长度(斜体)。但是我怎样才能匹配其他字节呢?在模式中说消息应该从 8 (salt) + 8 (session_id) + 8 (message_id) + 4 (seq_no) + 4 (message_data_length) = 32 字节,不是来自 57 字节。
此外,当我尝试发送更长的消息(超过 ~256 字节)时,"message text" 从 60 字节开始并且长度编码也有点奇怪:FE000400 用于 1024 字节消息和 FE000200 512 字节(FE 是什么意思?)。
所以,任何人都可以给我一个模式或我做错了什么的线索吗?
好的,看来我成功解码了大部分消息。可能对某些人有用:
3C000000 "valuable" 字节数(不包括末尾需要的随机字节填充)
8917E31B (== 467867529),decryptedMessageLayer(第 17 层)的代码
0FF1C770B657C36AF705BDACA4BE2C0B 序列化随机字节数组(应至少包含 15 个字节),OF = 15 - 当前数量
2E000000好像是最小层数
01000000 in_seq_no,收到 (1 - 1) / 2 = 0 条消息,请参阅 Sequence numbers
62000000 out_seq_no,发送了 62 / 2 = 49 条消息,请参阅 Sequence numbers(消息发送者没有发起该聊天)
DE91B036 代码 decryptedMessage#36b091de
00000000 不知道
38507C7CD5FA6F7C 好像是randomId(可能应该和消息传递的一样?)
00000000 不太清楚,可能是ttl
0654657374313200 序列化字符串:前两个字节(06)表示长度。如果超过 254 个,则改为放置 DE(=254) 并且可以从接下来的 3 个字节中找到长度(在我的 'mentioned' 案例中从 60 位置开始)。字符串字节之后是(平均 Test12)并用 0-3 个空字节 (00) 填充。
之后用随机字节 (0-15) 填充结果以构成完整的 16 字节块。