В примерах ниже опущены заголовки TCP-транспорта.
При необходимости отправки полезной нагрузки (пакета) от сервера к клиенту или от клиента к серверу она инкапсулируется следующим образом: спереди дописывается 4 байта длины (включая длину, порядковый номер и CRC32; всегда делится на четыре) и 4 байта с порядковым номером пакета внутри данного tcp-соединения (первый отправленный пакет помечается 0, следующий — 1 и т.д.), а в конце — 4 байта CRC32 (длины, порядкового номера и полезной нагрузки вместе).
Есть сокращённая версия этого же протокола: если клиент отправляет 0xef
как первый байт (важно: только перед самым первым пакетом данных), то после этого длина пакета кодируется одним байтом (0x01..0x7e
= длина данных, делённая на 4; либо 0x7f
, а затем 3 байта длины (little-endian), делённой на 4) после чего следуют собственно данные (порядковый номер и CRC32 не добавляется). Ответы сервера в этом случае имеют тот же вид (при этом сервер не отправляет первый байт 0xef
).
Подробная документация по созданию ключей авторизации здесь: создание ключа авторизации.
req_pq#60469778
nonce:int128
= ResPQ;
Параметр | Сдвиг, длина | Значение | Описание |
---|---|---|---|
auth_key_id | 0, 8 | 0 |
Поскольку сообщение незашифрованное |
message_id | 8, 8 | 51e57ac42770964a |
Точный unixtime * 2^32 |
message_length | 16, 4 | 20 |
Длина тела сообщения |
%(req_pq) | 20, 4 | 60469778 |
Номер конструктора req_pq из TL-схемы |
nonce | 24, 16 | 3E0549828CCA27E966B301A48FECE2FC |
Случайное число |
Длина заголовка — 20 байтов, длина тела сообщения — 20 байтов, полная длина отправляемого сообщения — 40 байтов.
0000 | 00 00 00 00 00 00 00 00 4A 96 70 27 C4 7A E5 51
0010 | 14 00 00 00 78 97 46 60 3E 05 49 82 8C CA 27 E9
0020 | 66 B3 01 A4 8F EC E2 FC
0000 | 00 00 00 00 00 00 00 00 01 C8 83 1E C9 7A E5 51
0010 | 40 00 00 00 63 24 16 05 3E 05 49 82 8C CA 27 E9
0020 | 66 B3 01 A4 8F EC E2 FC A5 CF 4D 33 F4 A1 1E A8
0030 | 77 BA 4A A5 73 90 73 30 08 17 ED 48 94 1A 08 F9
0040 | 81 00 00 00 15 C4 B5 1C 01 00 00 00 21 6B E8 6C
0050 | 02 2B B4 C3
Разбор ответа по следующей формуле:
resPQ#05162463
nonce:int128
server_nonce:int128
pq:string
server_public_key_fingerprints:Vector long
= ResPQ;
Параметр | Сдвиг, длина в байтах | Значение | Описание |
---|---|---|---|
auth_key_id | 0, 8 | 0 |
Поскольку сообщение незашифрованное |
message_id | 8, 8 | 51E57AC91E83C801 |
Идентификатор сообщения от сервера |
message_length | 16, 4 | 64 |
Длина тела сообщения |
%(resPQ) | 20, 4 | 05162463 |
Номер конструктора resPQ из TL-схемы |
nonce | 24, 16 | 3E0549828CCA27E966B301A48FECE2FC |
Значение, генерируемое клиентом в шаге 1 |
server_nonce | 40, 16 | A5CF4D33F4A11EA877BA4AA573907330 |
Рандомное число, генерируемое сервером |
pq | 56, 12 | 17ED48941A08F981 |
Однобайтовый префикс, обозначающим длину, строка длиной 8 байтов и три байта выравнивания |
%(Vector long) | 68, 4 | 1cb5c415 |
Номер конструктора Vector long из TL-схемы |
count | 72, 4 | 1 |
Количество элементов в списке отпечатков ключей |
fingerprints[] | 76, 8 | c3b42b026ce86b21 |
Младшие 64 бита SHA1 (server_public_key ) |
Был выбран публичный ключ server_public_key
, отпечаток которого соответствует единственному, полученному от сервера: c3b42b026ce86b21
.
Pq = 17ED48941A08F981
разложено на 2 простых сомножителя:
p = 494C553B
q = 53911073
p_q_inner_data#83c95aec
pq:string
p:string
q:string
nonce:int128
server_nonce:int128
new_nonce:int256
= P_Q_inner_data;
Параметр | Сдвиг, длина в байтах | Значение | Описание |
---|---|---|---|
%(p_q_inner_data) | 0, 4 | 83c95aec |
Номер конструктора p_q_inner_data из TL-схемы |
pq | 4, 12 | 17ED48941A08F981 |
Однобайтовый префикс, обозначающим длину, строка длиной 8 байтов и три байта выравнивания |
p | 16, 8 | 494C553B |
Первый простой сомножитель: однобайтовый префикс, обозначающим длину, строка длиной 4 байта и три байта выравнивания |
q | 24, 8 | 53911073 |
Второй простой сомножитель: однобайтовый префикс, обозначающим длину, строка длиной 4 байта и три байта выравнивания |
nonce | 32, 16 | 3E0549828CCA27E966B301A48FECE2FC |
Значение, генерируемое клиентом в шаге 1 |
server_nonce | 48, 16 | A5CF4D33F4A11EA877BA4AA573907330 |
Значение, полученное от сервера в шаге 2 |
new_nonce | 64, 32 | 311C85DB234AA2640AFC4A76A735CF5B 1F0FD68BD17FA181E1229AD867CC024D |
Рандомное число, генерируемое клиентом |
Сериализация P_Q_inner_data
дает некую строку data. Далее находится encrypted_data
:
SHA1 (data) = DB761C27718A2305044F71F2AD951629D78B2449
RSA (data_with_hash, server_public_key) = 7BB0100A523161904D9C69FA04BC60DECFC5DD74B99995C768EB60D8716E2109BAF2D4601DAB6B09610DC11067BB89021E09471FCFA52DBD0F23204AD8CA8B012BF40A112F44695AB6C266955386114EF5211E6372227ADBD34995D3E0E5FF02EC63A43F9926878962F7C570E6A6E78BF8366AF917A5272675C46064BE62E3E202EFA8B1ADFB1C32A898C2987BE27B5F31D57C9BB963ABCB734B16F652CEDB4293CBB7C878A3A3FFAC9DBEA9DF7C67BC9E9508E111C78FC46E057F5C65ADE381D91FEE430A6B576A99BDF8551FDB1BE2B57069B1A45730618F27427E8A04720B4971EF4A9215983D68F2830C3EAA6E40385562F970D38A05C9F1246DC33438E6
Длина итоговой строки составила 256 байтов.
req_DH_params#d712e4be
nonce:int128
server_nonce:int128
p:string
q:string
public_key_fingerprint:long
encrypted_data:string
= Server_DH_Params;
Параметр | Сдвиг, длина в байтах | Значение | Описание |
---|---|---|---|
auth_key_id | 0, 8 | 0 |
Поскольку сообщение незашифрованное |
message_id | 8, 8 | 51e57ac917717a27 |
Точное UNIX-время unixtime * 2^32 |
message_length | 16, 4 | 320 |
Длина тела сообщения |
%(req_DH_params) | 20, 4 | d712e4be |
Номер конструктора req_DH_params из TL-схемы |
nonce | 24, 16 | 3E0549828CCA27E966B301A48FECE2FC |
Значение, генерируемое клиентом в шаге 1 |
server_nonce | 40, 16 | A5CF4D33F4A11EA877BA4AA573907330 |
Значение, полученное от сервера в шаге 2 |
p | 56, 8 | 494C553B |
Первый простой сомножитель: однобайтовый префикс, обозначающим длину, строка длиной 4 байта и три байта выравнивания |
q | 64, 8 | 53911073 |
Второй простой сомножитель: однобайтовый префикс, обозначающим длину, строка длиной 4 байта и три байта выравнивания |
public_key_fingerprint | 72, 8 | c3b42b026ce86b21 |
Использованный отпечаток публичного ключа |
encrypted_data | 80, 260 | См. выше | См. «Генерация encrypted_data» |
0000 | 00 00 00 00 00 00 00 00 27 7A 71 17 C9 7A E5 51
0010 | 40 01 00 00 BE E4 12 D7 3E 05 49 82 8C CA 27 E9
0020 | 66 B3 01 A4 8F EC E2 FC A5 CF 4D 33 F4 A1 1E A8
0030 | 77 BA 4A A5 73 90 73 30 04 49 4C 55 3B 00 00 00
0040 | 04 53 91 10 73 00 00 00 21 6B E8 6C 02 2B B4 C3
0050 | FE 00 01 00 7B B0 10 0A 52 31 61 90 4D 9C 69 FA
0060 | 04 BC 60 DE CF C5 DD 74 B9 99 95 C7 68 EB 60 D8
0070 | 71 6E 21 09 BA F2 D4 60 1D AB 6B 09 61 0D C1 10
0080 | 67 BB 89 02 1E 09 47 1F CF A5 2D BD 0F 23 20 4A
0090 | D8 CA 8B 01 2B F4 0A 11 2F 44 69 5A B6 C2 66 95
00A0 | 53 86 11 4E F5 21 1E 63 72 22 7A DB D3 49 95 D3
00B0 | E0 E5 FF 02 EC 63 A4 3F 99 26 87 89 62 F7 C5 70
00C0 | E6 A6 E7 8B F8 36 6A F9 17 A5 27 26 75 C4 60 64
00D0 | BE 62 E3 E2 02 EF A8 B1 AD FB 1C 32 A8 98 C2 98
00E0 | 7B E2 7B 5F 31 D5 7C 9B B9 63 AB CB 73 4B 16 F6
00F0 | 52 CE DB 42 93 CB B7 C8 78 A3 A3 FF AC 9D BE A9
0100 | DF 7C 67 BC 9E 95 08 E1 11 C7 8F C4 6E 05 7F 5C
0110 | 65 AD E3 81 D9 1F EE 43 0A 6B 57 6A 99 BD F8 55
0120 | 1F DB 1B E2 B5 70 69 B1 A4 57 30 61 8F 27 42 7E
0130 | 8A 04 72 0B 49 71 EF 4A 92 15 98 3D 68 F2 83 0C
0140 | 3E AA 6E 40 38 55 62 F9 70 D3 8A 05 C9 F1 24 6D
0150 | C3 34 38 E6
Ответ от сервера был получен со следующим контентом:
0000 | 00 00 00 00 00 00 00 00 01 54 43 36 CB 7A E5 51
0010 | 78 02 00 00 5C 07 E8 D0 3E 05 49 82 8C CA 27 E9
0020 | 66 B3 01 A4 8F EC E2 FC A5 CF 4D 33 F4 A1 1E A8
0030 | 77 BA 4A A5 73 90 73 30 FE 50 02 00 28 A9 2F E2
0040 | 01 73 B3 47 A8 BB 32 4B 5F AB 26 67 C9 A8 BB CE
0050 | 64 68 D5 B5 09 A4 CB DD C1 86 24 0A C9 12 CF 70
0060 | 06 AF 89 26 DE 60 6A 2E 74 C0 49 3C AA 57 74 1E
0070 | 6C 82 45 1F 54 D3 E0 68 F5 CC C4 9B 44 44 12 4B
0080 | 96 66 FF B4 05 AA B5 64 A3 D0 1E 67 F6 E9 12 86
0090 | 7C 8D 20 D9 88 27 07 DC 33 0B 17 B4 E0 DD 57 CB
00A0 | 53 BF AA FA 9E F5 BE 76 AE 6C 1B 9B 6C 51 E2 D6
00B0 | 50 2A 47 C8 83 09 5C 46 C8 1E 3B E2 5F 62 42 7B
00C0 | 58 54 88 BB 3B F2 39 21 3B F4 8E B8 FE 34 C9 A0
00D0 | 26 CC 84 13 93 40 43 97 4D B0 35 56 63 30 38 39
00E0 | 2C EC B5 1F 94 82 4E 14 0B 98 63 77 30 A4 BE 79
00F0 | A8 F9 DA FA 39 BA E8 1E 10 95 84 9E A4 C8 34 67
0100 | C9 2A 3A 17 D9 97 81 7C 8A 7A C6 1C 3F F4 14 DA
0110 | 37 B7 D6 6E 94 9C 0A EC 85 8F 04 82 24 21 0F CC
0120 | 61 F1 1C 3A 91 0B 43 1C CB D1 04 CC CC 8D C6 D2
0130 | 9D 4A 5D 13 3B E6 39 A4 C3 2B BF F1 53 E6 3A CA
0140 | 3A C5 2F 2E 47 09 B8 AE 01 84 4B 14 2C 1E E8 9D
0150 | 07 5D 64 F6 9A 39 9F EB 04 E6 56 FE 36 75 A6 F8
0160 | F4 12 07 8F 3D 0B 58 DA 15 31 1C 1A 9F 8E 53 B3
0170 | CD 6B B5 57 2C 29 49 04 B7 26 D0 BE 33 7E 2E 21
0180 | 97 7D A2 6D D6 E3 32 70 25 1C 2C A2 9D FC C7 02
0190 | 27 F0 75 5F 84 CF DA 9A C4 B8 DD 5F 84 F1 D1 EB
01A0 | 36 BA 45 CD DC 70 44 4D 8C 21 3E 4B D8 F6 3B 8A
01B0 | B9 5A 2D 0B 41 80 DC 91 28 3D C0 63 AC FB 92 D6
01C0 | A4 E4 07 CD E7 C8 C6 96 89 F7 7A 00 74 41 D4 A6
01D0 | A8 38 4B 66 65 02 D9 B7 7F C6 8B 5B 43 CC 60 7E
01E0 | 60 A1 46 22 3E 11 0F CB 43 BC 3C 94 2E F9 81 93
01F0 | 0C DC 4A 1D 31 0C 0B 64 D5 E5 5D 30 8D 86 32 51
0200 | AB 90 50 2C 3E 46 CC 59 9E 88 6A 92 7C DA 96 3B
0210 | 9E B1 6C E6 26 03 B6 85 29 EE 98 F9 F5 20 64 19
0220 | E0 3F B4 58 EC 4B D9 45 4A A8 F6 BA 77 75 73 CC
0230 | 54 B3 28 89 5B 1D F2 5E AD 9F B4 CD 51 98 EE 02
0240 | 2B 2B 81 F3 88 D2 81 D5 E5 BC 58 01 07 CA 01 A5
0250 | 06 65 C3 2B 55 27 15 F3 35 FD 76 26 4F AD 00 DD
0260 | D5 AE 45 B9 48 32 AC 79 CE 7C 51 1D 19 4B C4 2B
0270 | 70 EF A8 50 BB 15 C2 01 2C 52 15 CA BF E9 7C E6
0280 | 6B 8D 87 34 D0 EE 75 9A 63 8A F0 13
Для разложения ответа используется следующая формула:
server_DH_params_fail#79cb045d
nonce:int128
server_nonce:int128
new_nonce_hash:int128
= Server_DH_Params;
server_DH_params_ok#d0e8075c
nonce:int128
server_nonce:int128
encrypted_answer:string
= Server_DH_Params;
Параметр | Сдвиг, длина в байтах | Значение | Описание |
---|---|---|---|
auth_key_id | 0, 8 | 0 |
Поскольку сообщение незашифрованное |
message_id | 8, 8 | 51E57ACB36435401 |
Точное UNIX-время unixtime * 2^32 |
message_length | 16, 4 | 632 |
Длина тела сообщения |
%(server_DH_params_ok) | 20, 4 | d0e8075c |
Номер конструктора server_DH_params_ok из TL-схемы |
nonce | 24, 16 | 3E0549828CCA27E966B301A48FECE2FC |
Значение, генерируемое клиентом в шаге 1 |
server_nonce | 40, 16 | A5CF4D33F4A11EA877BA4AA573907330 |
Значение, полученное от сервера в шаге 2 |
encrypted_answer | 56, 596 | См. ниже |
encrypted_answer = 28A92FE20173B347A8BB324B5FAB2667C9A8BBCE6468D5B509A4CBDDC186240AC912CF7006AF8926DE606A2E74C0493CAA57741E6C82451F54D3E068F5CCC49B4444124B9666FFB405AAB564A3D01E67F6E912867C8D20D9882707DC330B17B4E0DD57CB53BFAAFA9EF5BE76AE6C1B9B6C51E2D6502A47C883095C46C81E3BE25F62427B585488BB3BF239213BF48EB8FE34C9A026CC8413934043974DB03556633038392CECB51F94824E140B98637730A4BE79A8F9DAFA39BAE81E1095849EA4C83467C92A3A17D997817C8A7AC61C3FF414DA37B7D66E949C0AEC858F048224210FCC61F11C3A910B431CCBD104CCCC8DC6D29D4A5D133BE639A4C32BBFF153E63ACA3AC52F2E4709B8AE01844B142C1EE89D075D64F69A399FEB04E656FE3675A6F8F412078F3D0B58DA15311C1A9F8E53B3CD6BB5572C294904B726D0BE337E2E21977DA26DD6E33270251C2CA29DFCC70227F0755F84CFDA9AC4B8DD5F84F1D1EB36BA45CDDC70444D8C213E4BD8F63B8AB95A2D0B4180DC91283DC063ACFB92D6A4E407CDE7C8C69689F77A007441D4A6A8384B666502D9B77FC68B5B43CC607E60A146223E110FCB43BC3C942EF981930CDC4A1D310C0B64D5E55D308D863251AB90502C3E46CC599E886A927CDA963B9EB16CE62603B68529EE98F9F5206419E03FB458EC4BD9454AA8F6BA777573CC54B328895B1DF25EAD9FB4CD5198EE022B2B81F388D281D5E5BC580107CA01A50665C32B552715F335FD76264FAD00DDD5AE45B94832AC79CE7C511D194BC42B70EFA850BB15C2012C5215CABFE97CE66B8D8734D0EE759A638AF013
tmp_aes_key = F011280887C7BB01DF0FC4E17830E0B91FBB8BE4B2267CB985AE25F33B527253
tmp_aes_iv = 3212D579EE35452ED23E0D0C92841AA7D31B2E9BDEF2151E80D15860311C85DB
answer = BA0D89B53E0549828CCA27E966B301A48FECE2FCA5CF4D33F4A11EA877BA4AA57390733002000000FE000100C71CAEB9C6B1C9048E6C522F70F13F73980D40238E3E21C14934D037563D930F48198A0AA7C14058229493D22530F4DBFA336F6E0AC925139543AED44CCE7C3720FD51F69458705AC68CD4FE6B6B13ABDC9746512969328454F18FAF8C595F642477FE96BB2A941D5BCD1D4AC8CC49880708FA9B378E3C4F3A9060BEE67CF9A4A4A695811051907E162753B56B0F6B410DBA74D8A84B2A14B3144E0EF1284754FD17ED950D5965B4B9DD46582DB1178D169C6BC465B0D6FF9CA3928FEF5B9AE4E418FC15E83EBEA0F87FA9FF5EED70050DED2849F47BF959D956850CE929851F0D8115F635B105EE2E4E15D04B2454BF6F4FADF034B10403119CD8E3B92FCC5BFE000100262AABA621CC4DF587DC94CF8252258C0B9337DFB47545A49CDD5C9B8EAE7236C6CADC40B24E88590F1CC2CC762EBF1CF11DCC0B393CAAD6CEE4EE5848001C73ACBB1D127E4CB93072AA3D1C8151B6FB6AA6124B7CD782EAF981BDCFCE9D7A00E423BD9D194E8AF78EF6501F415522E44522281C79D906DDB79C72E9C63D83FB2A940FF779DFB5F2FD786FB4AD71C9F08CF48758E534E9815F634F1E3A80A5E1C2AF210C5AB762755AD4B2126DFA61A77FA9DA967D65DFD0AFB5CDF26C4D4E1A88B180F4E0D0B45BA1484F95CB2712B50BF3F5968D9D55C99C0FB9FB67BFF56D7D4481B634514FBA3488C4CDA2FC0659990E8E868B28632875A9AA703BCDCE8FCB7AE551
Для разложения Server_DH_inner_data
используется следующая формула:
server_DH_inner_data#b5890dba
nonce:int128
server_nonce:int128
g:int
dh_prime:string
g_a:string
server_time:int
= Server_DH_inner_data;
Параметр | Сдвиг, длина в байтах | Значение | Описание |
---|---|---|---|
%(server_DH_inner_data) | 0, 4 | b5890dba |
server_DH_inner_data constructor number from TL schema |
nonce | 4, 16 | 3E0549828CCA27E966B301A48FECE2FC |
Значение, генерируемое клиентом в шаге 1 |
server_nonce | 20, 16 | A5CF4D33F4A11EA877BA4AA573907330 |
Значение, полученное от сервера в шаге 2 |
g | 36, 4 | 2 |
Значение, полученное от сервера в шаге 2 |
dh_prime | 40, 260 | C71CAEB9C6B1C9048E6C522F70F13F73 980D40238E3E21C14934D037563D930F 48198A0AA7C14058229493D22530F4DB FA336F6E0AC925139543AED44CCE7C37 20FD51F69458705AC68CD4FE6B6B13AB DC9746512969328454F18FAF8C595F64 2477FE96BB2A941D5BCD1D4AC8CC4988 0708FA9B378E3C4F3A9060BEE67CF9A4 A4A695811051907E162753B56B0F6B41 0DBA74D8A84B2A14B3144E0EF1284754 FD17ED950D5965B4B9DD46582DB1178D 169C6BC465B0D6FF9CA3928FEF5B9AE4 E418FC15E83EBEA0F87FA9FF5EED7005 0DED2849F47BF959D956850CE929851F 0D8115F635B105EE2E4E15D04B2454BF 6F4FADF034B10403119CD8E3B92FCC5B |
|
g_a | 300, 260 | 262AABA621CC4DF587DC94CF8252258C 0B9337DFB47545A49CDD5C9B8EAE7236 C6CADC40B24E88590F1CC2CC762EBF1C F11DCC0B393CAAD6CEE4EE5848001C73 ACBB1D127E4CB93072AA3D1C8151B6FB 6AA6124B7CD782EAF981BDCFCE9D7A00 E423BD9D194E8AF78EF6501F415522E4 4522281C79D906DDB79C72E9C63D83FB 2A940FF779DFB5F2FD786FB4AD71C9F0 8CF48758E534E9815F634F1E3A80A5E1 C2AF210C5AB762755AD4B2126DFA61A7 7FA9DA967D65DFD0AFB5CDF26C4D4E1A 88B180F4E0D0B45BA1484F95CB2712B5 0BF3F5968D9D55C99C0FB9FB67BFF56D 7D4481B634514FBA3488C4CDA2FC0659 990E8E868B28632875A9AA703BCDCE8F |
|
server_time | 560, 4 | 1373993675 |
Серверное время |
b = 6F620AFA575C9233EB4C014110A7BCAF49464F798A18A0981FEA1E05E8DA67D9681E0FD6DF0EDF0272AE3492451A84502F2EFC0DA18741A5FB80BD82296919A70FAA6D07CBBBCA2037EA7D3E327B61D585ED3373EE0553A91CBD29B01FA9A89D479CA53D57BDE3A76FBD922A923A0A38B922C1D0701F53FF52D7EA9217080163A64901E766EB6A0F20BC391B64B9D1DD2CD13A7D0C946A3A7DF8CEC9E2236446F646C42CFE2B60A2A8D776E56C8D7519B08B88ED0970E10D12A8C9E355D765F2B7BBB7B4CA9360083435523CB0D57D2B106FD14F94B4EEE79D8AC131CA56AD389C84FE279716F8124A543337FB9EA3D988EC5FA63D90A4BA3970E7A39E5C0DE5
client_DH_inner_data#6643b654
nonce:int128
server_nonce:int128
retry_id:long
g_b:string
= Client_DH_Inner_Data;
Параметр | Сдвиг, длина в байтах | Значение | Описание |
---|---|---|---|
%(client_DH_inner_data) | 0, 4 | 6643b654 |
Номер конструктора client_DH_inner_data из TL-схемы |
nonce | 4, 16 | 3E0549828CCA27E966B301A48FECE2FC |
Значение, генерируемое клиентом в шаге 1 |
server_nonce | 20, 16 | A5CF4D33F4A11EA877BA4AA573907330 |
Значение, полученное от сервера в шаге 2 |
retry_id | 36, 8 | 0 |
Поскольку первая попытка |
g_b | 44, 260 | 73700E7BFC7AEEC828EB8E0DCC04D09A 0DD56A1B4B35F72F0B55FCE7DB7EBB72 D7C33C5D4AA59E1C74D09B01AE536B31 8CFED436AFDB15FE9EB4C70D7F0CB14E 46DBBDE9053A64304361EB358A9BB32E 9D5C2843FE87248B89C3F066A7D5876D 61657ACC52B0D81CD683B2A0FA93E8AD AB20377877F3BC3369BBF57B10F5B589 E65A9C27490F30A0C70FFCFD3453F5B3 79C1B9727A573CFFDCA8D23C721B135B 92E529B1CDD2F7ABD4F34DAC4BE1EEAF 60993DDE8ED45890E4F47C26F2C0B2E0 37BB502739C8824F2A99E2B1E7E41658 3417CC79A8807A4BDAC6A5E9805D4F61 86C37D66F6988C9F9C752896F3D34D25 529263FAF2670A09B2A59CE35264511F |
g^b mod dh_prime |
Сериализация Client_DH_Inner_Data
производит некоторую строку данных (data). За этим следует encrypted_data
:
data_with_hash := SHA1(data) + data + (0-15 random bytes); such that the length be divisible by 16;<br>AES256_ige_encrypt (data_with_hash, tmp_aes_key, tmp_aes_iv) = 928A4957D0463B525C1CC48AABAA030A256BE5C746792C84CA4C5A0DF60AC799048D98A38A8480EDCF082214DFC79DCB9EE34E206513E2B3BC1504CFE6C9ADA46BF9A03CA74F192EAF8C278454ADABC795A566615462D31817382984039505F71CB33A41E2527A4B1AC05107872FED8E3ABCEE1518AE965B0ED3AED7F67479155BDA8E4C286B64CDF123EC748CF289B1DB02D1907B562DF462D8582BA6F0A3022DC2D3504D69D1BA48B677E3A830BFAFD67584C8AA24E1344A8904E305F9587C92EF964F0083F50F61EAB4A393EAA33C9270294AEDC7732891D4EA1599F52311D74469D2112F4EDF3F342E93C8E87E812DC3989BAECFE6740A46077524C75093F5A5405736DE8937BB6E42C9A0DCF22CA53227D462BCCC2CFE94B6FE86AB7FBFA395021F66661AF7C0024CA2986CA03F3476905407D1EA9C010B763258DB1AA2CC7826D91334EFC1FDC665B67FE45ED0
Длина финальной строки равна 336 байтам.
set_client_DH_params#f5045f1f
nonce:int128
server_nonce:int128
encrypted_data:string
= Set_client_DH_params_answer
Параметр | Сдвиг, длина в байтах | Значение | Описание |
---|---|---|---|
auth_key_id | 0, 8 | 0 |
Поскольку сообщение незашифрованное |
message_id | 8, 8 | 51e57acd2aa32c6d |
Точное UNIX-время unixtime * 2^32 |
message_length | 16, 4 | 20 |
Длина тела сообщения |
%(set_client_DH_params) | 20, 4 | f5045f1f |
Номер конструктора set_client_DH_params из TL-схемы |
nonce | 24, 16 | 3E0549828CCA27E966B301A48FECE2FC |
Значение, генерируемое клиентом в шаге 1 |
server_nonce | 40, 16 | A5CF4D33F4A11EA877BA4AA573907330 |
Значение, полученное от сервера в шаге 2 |
encrypted_data | 56, 340 | См. выше |
0000 | 00 00 00 00 00 00 00 00 6D 2C A3 2A CD 7A E5 51
0010 | 78 01 00 00 1F 5F 04 F5 3E 05 49 82 8C CA 27 E9
0020 | 66 B3 01 A4 8F EC E2 FC A5 CF 4D 33 F4 A1 1E A8
0030 | 77 BA 4A A5 73 90 73 30 FE 50 01 00 92 8A 49 57
0040 | D0 46 3B 52 5C 1C C4 8A AB AA 03 0A 25 6B E5 C7
0050 | 46 79 2C 84 CA 4C 5A 0D F6 0A C7 99 04 8D 98 A3
0060 | 8A 84 80 ED CF 08 22 14 DF C7 9D CB 9E E3 4E 20
0070 | 65 13 E2 B3 BC 15 04 CF E6 C9 AD A4 6B F9 A0 3C
0080 | A7 4F 19 2E AF 8C 27 84 54 AD AB C7 95 A5 66 61
0090 | 54 62 D3 18 17 38 29 84 03 95 05 F7 1C B3 3A 41
00A0 | E2 52 7A 4B 1A C0 51 07 87 2F ED 8E 3A BC EE 15
00B0 | 18 AE 96 5B 0E D3 AE D7 F6 74 79 15 5B DA 8E 4C
00C0 | 28 6B 64 CD F1 23 EC 74 8C F2 89 B1 DB 02 D1 90
00D0 | 7B 56 2D F4 62 D8 58 2B A6 F0 A3 02 2D C2 D3 50
00E0 | 4D 69 D1 BA 48 B6 77 E3 A8 30 BF AF D6 75 84 C8
00F0 | AA 24 E1 34 4A 89 04 E3 05 F9 58 7C 92 EF 96 4F
0100 | 00 83 F5 0F 61 EA B4 A3 93 EA A3 3C 92 70 29 4A
0110 | ED C7 73 28 91 D4 EA 15 99 F5 23 11 D7 44 69 D2
0120 | 11 2F 4E DF 3F 34 2E 93 C8 E8 7E 81 2D C3 98 9B
0130 | AE CF E6 74 0A 46 07 75 24 C7 50 93 F5 A5 40 57
0140 | 36 DE 89 37 BB 6E 42 C9 A0 DC F2 2C A5 32 27 D4
0150 | 62 BC CC 2C FE 94 B6 FE 86 AB 7F BF A3 95 02 1F
0160 | 66 66 1A F7 C0 02 4C A2 98 6C A0 3F 34 76 90 54
0170 | 07 D1 EA 9C 01 0B 76 32 58 DB 1A A2 CC 78 26 D9
0180 | 13 34 EF C1 FD C6 65 B6 7F E4 5E D0
Для вычисления auth_key
используется формула g^{ab} mod dh_prime
:
auth_key = AB96E207C631300986F30EF97DF55E179E63C112675F0CE502EE76D74BBEE6CBD1E95772818881E9F2FF54BD52C258787474F6A7BEA61EABE49D1D01D55F64FC07BC31685716EC8FB46FEACF9502E42CFD6B9F45A08E90AA5C2B5933AC767CBE1CD50D8E64F89727CA4A1A5D32C0DB80A9FCDBDDD4F8D5A1E774198F1A4299F927C484FEEC39F29647E43C3243986F93609E23538C21871DF50E00070B3B6A8FA9BC15628E8B43FF977409A61CEEC5A21CF7DFB5A4CC28F5257BC30CD8F2FB92FBF21E28924065F50E0BBD5E11A420300E2C136B80E9826C6C5609B5371B7850AA628323B6422F3A94F6DFDE4C3DC1EA60F7E11EE63122B3F39CBD1A8430157
Сервер проверяет, что auth_key_hash
является уникальным:
Ключ является уникальным.
0000 | 00 00 00 00 00 00 00 00 01 30 AA C5 CE 7A E5 51
0010 | 34 00 00 00 34 F7 CB 3B 3E 05 49 82 8C CA 27 E9
0020 | 66 B3 01 A4 8F EC E2 FC A5 CF 4D 33 F4 A1 1E A8
0030 | 77 BA 4A A5 73 90 73 30 CC EB C0 21 72 66 E1 ED
0040 | EC 7F B0 A0 EE D6 C2 20
Для разложения Set_client_DH_params_answer
используется следующая формула:
dh_gen_ok#3bcbf734
nonce:int128
server_nonce:int128
new_nonce_hash1:int128
= Set_client_DH_params_answer;
dh_gen_retry#46dc1fb9
nonce:int128
server_nonce:int128
new_nonce_hash2:int128
= Set_client_DH_params_answer;
dh_gen_fail#a69dae02
nonce:int128
server_nonce:int128
new_nonce_hash3:int128
= Set_client_DH_params_answer;
Параметр | Сдвиг, длина в байтах | Значение | Описание |
---|---|---|---|
%(dh_gen_ok) | 0, 4 | 3bcbf734 |
Номер конструктора dh_gen_ok из TL-схемы |
nonce | 4, 16 | 3E0549828CCA27E966B301A48FECE2FC |
Значение, генерируемое клиентом в шаге 1 |
server_nonce | 20, 16 | A5CF4D33F4A11EA877BA4AA573907330 |
Значение, полученное от сервера в шаге 2 |
new_nonce_hash1 | 36, 4 | CCEBC0217266E1EDEC7FB0A0EED6C220 |
См. «Генерация encrypted_data» |