MTProto

**MTProto** (**M**obile **T**ransport **P**rotocol) — Telegram ijtimoiy tarmogʻida foydalanuvchilar yozishmalarini shifrlash uchun ishlatiladigan kriptografik protokol. Ushbu protokol Nikolay Durov va boshqa dasturchilar bilan birgalikda yaratilgan.

Protokol, simmetrik shifrlash algoritmi AES (IGE rejimida) hamda ikki qurilma oʻrtasida 2048-bitli RSA kalitlarni almashish uchun moʻljallangan Diffi-Xelman protokolining kombinatsiyasi va bir qator hesh-funksiyalar asosida hosil qilingan. Protokol end-to-end usulida shifrlashni ham qoʻllab-quvvatlaydi.

Shuningdek, ushbu protokol asosida MTProxy protokoli yaratilgan.

## Qurilmani roʻyxatdan oʻtkazish

Telegram ilovasini birinchi marta ishga tushirilganda, foydalanuvchi oʻzining telefon raqamini kiritadi. Ushbu telefon raqamga besh xonali tasdiqlash kodi joʻnatiladi.

Tasdiqlash kodi kiritilgandan soʻng avtorizatsiya protokoli ishga tushadi:

# **C** mijoz, **S** serverga tasodifiy bitlar ketma-ketligidan iborat boʻlgan (128 bit) satr koʻrinishidagi soʻrovni yuboradi.
# **S** javob tariqasida boshqa bitlar ketma-ketligini, yaʼni 64 bitli **n** son hamda RSA ning ochiq kalitini joʻnatadi.
# **C** mijoz, **n** sonni ikkita **p** va **q** tub sonlarga ajratadi. Mijozda serverning ochiq kalitlari toʻplami mavjud boʻlib, u qurilma xotirasida saqlanadi. Mijoz ularning ichidan **S** serverdan kelgan shifrga mos keladigan server_{pk} kalitni tanlaydi.
# Shundan soʻng **C** boshqa bir 256 bitli tasodifiy satrni tanlaydi, ushbu satr avvalgisidan farq qilishi kerak. Mijoz bu satrdan **n**, **p** va **q** sonlarni tanlaydi hamda RSA algoritmi asosida server_{pk} kaliti bilan shifrlab, serverga joʻnatadi.
# **S** server esa Diffi-Xelman protokoli asosidagi **g**, **p** va **g<sub>a</sub>** parametrlari bilan javob qaytaradi. Bu parametrlar AES-256 bilan shifrlangan. Buning uchun mijoz va serverdan olingan vaqtinchalik kalit va **Salt**dan foydalanilgan.
# **C** mijoz, yopiq kalit **b** ni tanlaydi, uning asosida ochiq kalitni g_{b}=g^{b}\mod p hamda umumiy ochiq kalit K = (g_{a})^{b}\mod p ni hisoblaydi. Shundan soʻng, g_{b} shifrlangan holda **S**ga yuboriladi.

## Xabarlarni shifrlash

* **Length** — paket uzunligi, bunda **padding** hisobga olinmaydi.
* **Header** — har bir paket, protokol versiyasi, joʻnatilayotgan mediafayllar turi haqidagi maʼlumotlarni saqlaydigan uchta sarlavhadan tashkil topgan.
* **Random bits** — mijoz tomonidan hosil qilingan 120 bit hamda maydon uzunligini aniqlovchi 8 bitdan tashkil topgan. Shifrlash uchun **Salt** sifatida ishlatiladi.
* **Layer** — protokol versiyasini bildiradi.
* **seq_in** — chat yaratuvchisiga yuborilgan xabarlar soni.
* **seq_out** — chat yaratuvchisi tomonidan yuborilgan xabarlar soni.
* **Random id** — xabar yuborayotgan mijoz tomonidan hosil qilingan tasodifiy son. Matn koʻrinishida yuboriladi.
* **TTL** — xabarni olgan foydalanuvchi, ushbu xabarni oʻchirilib tashlanishidan oldin koʻrib turishi mumkin boʻlgan vaqt, sekundlarda oʻlchanadi.
* **Message** — foydalanuvchi tomonidan kiritilgan xabar (ixtiyoriy uzunlikda).
* **Padding** — Shifrlash oldidan qoʻshiladi.

### Shifrlash sxemasi
* **auth_key** — chat hosil qilinish paytida olingan ochiq shifrlash kaliti.
* **Payload** — shifrlash paketi.
* **msg_key** — SHA1-heshning dastlabki 128 biti. Rasshifrovkaning toʻgʻri amalga oshirilganini tekshirish uchun foydalaniladi.
* **Padding** — shifrlash paytida blokning oʻlchami 128 bitga teng boʻlishi uchun qoʻshilgan tasodifiy sonlardan iborat 0—96 bit.
* **AES key**va **IV** — IGE rejimida **AES** algoritmi orqali shifrlash parametrlari. KDF yordmida hosil qilinadi.
* **KDF (key derivation function)** — **AES key** va **IV** ni **msg_key** hamda **auth_key** asosida shakllantirish funksiyasi
* **auth_key_id** — SHA1-hesh**K** ochiq kalitining dsatlabki 64-biti. Kolliziya roʻy berganda kalit qaytadan generatsiya qilinadi.

## Xabarlarni deshifrlash

# Mijoz shifrlangan xabarni oladi, **auth_key_id** ning ishonchliligni tekshiradi, yaʼni SHA1-hesh ochiq kaliti **K**ning dastlabki 64-bitini hisoblaydi. Qiymatlar mos kelsa, xabarni deshifrlash qilish davom ettiriladi.
# **key derivation function** yordamida **AES key** va **IV** shakllantiriladi.
# Shundan soʻng maʼlumotlarni **AES-IGE** algoritmi asosida deshifrlash davom ettiriladi. Oxiri joʻnatuvchidagi paketga mos kelgan paket qabul qiluvchida ham hosil boʻladi.
# Deshifrlangan paketdagi SHA1-heshning 128-bitini **msg_key** bilan taqqoslanadi. Va xabar toʻliq deshifrlanadi.

## Dasturlash tillari uchun kutubxonalar

## Yana qarang
* RSA shifrlash algoritmi
* AES shifrlash standarti
* Hesh-funksiyalar

## Manbalar

## Adabiyotlar
* *Jakob Bjerre Jakobsen*, On the CCA (in)Security of MTProto, 2016, 978-1-4503-4564-4, Security of MTProto

## Havolalar
* https://core.telegram.org/mtproto
* https://web.archive.org/web/20161129083141/https://unhandledexpression.com/2013/12/17/telegram-stand-back-we-know-maths/
* https://www.incibe.es/extfrontinteco/img/File/intecocert/EstudiosInformes/INT_Telegram_EN.pdf