MTProto
Versiunea actuală a paginii nu a fost încă revizuită de colaboratori experimentați și poate diferi semnificativ de
versiunea revizuită pe 29 august 2018; verificările necesită
35 de modificări .
MTProto este un protocol criptografic utilizat în sistemul de mesagerie Telegram pentru a cripta corespondența utilizatorilor. Protocolul a fost dezvoltat de Nikolay „Kot” Durov și alți programatori Telegram.
Protocolul se bazează pe combinația originală a algoritmului de criptare simetrică AES (în modul IGE), protocolul Diffie-Hellman pentru schimbul de chei RSA pe 2048 de biți între două dispozitive și o serie de funcții hash. Protocolul permite utilizarea criptării end-to-end cu verificarea cheii opționale [1] [2] .
Tot pe baza protocolului, a fost creat MTProxy .
Crearea de sesiuni
Înregistrarea dispozitivului
Când aplicația este lansată pentru prima dată, utilizatorul își introduce numărul de telefon, care primește un cod de confirmare din cinci cifre [3] .
După introducerea codului, aplicația pornește protocolul de autorizare [4] :
- Clientul C trimite o cerere către serverul S cu un șir compus dintr-o secvență aleatorie de 128 de biți.
- S trimite înapoi o altă secvență aleatorie de 128 de biți, numărul n ( 64 de biți ) și semnătura digitală a cheii publice RSA (obținută din cei 64 de biți inferiori ai hash-ului SHA1 ai cheii publice a serverului).
- C descompune n în două numere prime p și q astfel încât p < q , iar aceasta servește ca un test al lucrării. Clientul are un set de chei publice de server stocate pe dispozitiv. Din ea C alege o cheiepotrivită pentru semnătura primită de laserverul S.
![{\displaystyle server_{pk))](https://wikimedia.org/api/rest_v1/media/math/render/svg/2bf6a76ec7b438d06aafd5c816a6338de129e173)
- C selectează un alt șir aleatoriu de 256 de biți care este diferit de șirul anterior al clientului și al serverului. Clientul colectează un set de trei șiruri aleatorii, numere n , p și q , îl criptează cu o cheiefolosind algoritmul RSA și îl trimite către serverul S.
![{\displaystyle server_{pk))](https://wikimedia.org/api/rest_v1/media/math/render/svg/2bf6a76ec7b438d06aafd5c816a6338de129e173)
- S raspunde cu parametrii Diffie-Hellman g , p ,criptati cu algoritmul AES-256 in modul IGE , folosind o cheie temporara si un Salt obtinut de la client si server sir nou.
![g_a](https://wikimedia.org/api/rest_v1/media/math/render/svg/43e812849f3629f8cc1408d02bf8010185910157)
- C alege cheia privată b , calculează cheia publicăși cheia publică. Apoi(în formă criptată) este trimis către serverul S [4] .
![{\displaystyle g_{b}=g^{b}{\bmod {p}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/bc3a10e806d61f80ec677c1e564ad20de14376b1)
![{\displaystyle K=(g_{a})^{b}{\bmod {p}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/0175ef6b491759b7a58d4f79483ac490067858b4)
![g_b](https://wikimedia.org/api/rest_v1/media/math/render/svg/39c4965fcd21438c14c526794f9da7d65aad8ae7)
Creați un chat secret între doi utilizatori
Utilizatorii A și B doresc să inițialeze un chat secret [5] :
- A se conectează la server pentru a obține parametrii pentru protocolul Diffie-Hellman - un simplu p și un generator g . A primește, de asemenea, un pentru generarea unei chei secrete.
![{\displaystyle r_{server)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/271e52587268f00adf492d8857a33a91e369c722)
- A calculează cheia publicășio trimite utilizatorului B.
![{\displaystyle g_{a}=g^{a}{\bmod {p)}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/1aa9daaf492f40cac71d2e32da84b8e2eeba5131)
- B primește o solicitare de a crea un chat și confirmă inițializarea acestuia doar pe unul dintre dispozitivele sale autorizate. Se conectează la server pentru a obține cei mai recenti parametri Diffie-Hellman și își generează cheia privată b .
- B calculează cheia publicăși o trimite către A .
![{\displaystyle g_{b}=g^{b}{\bmod {p}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/bc3a10e806d61f80ec677c1e564ad20de14376b1)
- Ambii utilizatori generează o cheie publică partajată . Aceasta completează schimbul de chei secrete între utilizatori [5] .
![{\displaystyle K=(g_{a})^{b}{\bmod {p}}=(g_{b})^{a}{\bmod {p}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/2c0d4130c459b32e68b4feadf02c06b17bb4d8c0)
Note
- Cheia secretă a este generată conform regulii: , unde 2048 de biți generați de generatorul de numere aleatoare de pe dispozitivul client sunt 2048 de biți generați de server pentru a întări securitatea cheii a în cazul unui generator nesigur .
![{\displaystyle a=r_{client}\oplus r_{server)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/9cb4db629394152a6ecb424ced5d36f2833ff5f8)
![{\displaystyle r_{client)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/dd11d52caff90b2c69e8ed9a07ee5cb1c17087a0)
![{\displaystyle r_{server)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/271e52587268f00adf492d8857a33a91e369c722)
- Ambii clienți verifică dacă serverul le-a trimis un număr prim sigur p (cum ar fi, de asemenea, prim), un număr și generează un subgrup ciclic în prima radix . Parametrii p și q primiți de la server sunt fixați și se pot schimba doar între versiunile aplicației [6] .
![{\displaystyle q={p-1 \over 2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/8d769644f82dde1f2a70c633e053ef59c45f5db7)
![{\displaystyle g\in \{2,3,4,5,6,7\)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/608e807d3788839025f2bc20ca0e5e41bb32075b)
![{\displaystyle {p-1 \over 2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/f7b073558cd53b32214a9d81d696b1ff564b3db0)
Criptarea mesajelor
Compoziția pachetului de criptare
Lungime
|
antet
|
biți aleatori
|
strat
|
seq_in
|
seq_out
|
antet
|
id aleatoriu
|
TTL
|
mesaj
|
antet
|
Captuseala
|
pe 32 de biți
|
pe 32 de biți
|
128 de biți
|
pe 32 de biți
|
pe 32 de biți
|
pe 32 de biți
|
pe 32 de biți
|
pe 64 de biți
|
pe 32 de biți
|
Lungime arbitrară
|
pe 32 de biți
|
0-96 biți
|
Blocul 1
|
Blocul 2
|
Blocul 3
|
Blocul 4
|
Blocuri
|
Blocul N
|
- Lungime - lungime pachet fără umplutură
- Antet - fiecare pachet este format din trei anteturi care conțin informații despre versiunea protocolului, tipul fișierelor media atașate
- Biți aleatori - 120 de biți generați de client și 8 biți determină lungimea câmpului în octeți. Folosit ca sare pentru criptare
- Layer - indică versiunea protocolului
- seq_in - numărul de mesaje trimise creatorului de chat
- seq_out - numărul de mesaje trimise de la creatorul chatului
- Id-ul aleatoriu - număr aleator generat de clientul expeditor, trimis ca text
- TTL este numărul de secunde în care destinatarul poate vedea mesajul înainte de a-l șterge
- Mesaj - mesajul introdus de utilizator (lungime arbitrară)
- Umplutură - adăugată chiar înainte de criptare
Schema de criptare
- auth_key - cheie publică de criptare primită la crearea unui chat
- Sarcină utilă - un pachet pentru criptare (din paragraful anterior)
- msg_key - 128 de biți mai mici din hash-ul SHA1 al pachetului criptat. Folosit pentru a verifica corectitudinea decriptării
- Umplutură - 0-96 de biți adăugați pentru a face dimensiunea blocului pentru criptare egală cu 128 de biți
- Cheia AES și IV - parametri pentru criptarea AES în modul IGE. Obținut cu KDF
- KDF (funcția de derivare a cheii) - cheie AES și funcție de generare IV bazată pe msg_key și auth_key
- auth_key_id este cei 64 de biți inferiori ai hash-ului SHA1 al cheii publice K . În cazul unei coliziuni, cheia publică va fi generată din nou [7]
Decriptarea mesajelor
Structura mesajului criptat
auth_key_id
|
tasta msg
|
Date criptate
|
64 de biți
|
128 de biți
|
N*128 biți
|
- Clientul primește mesajul criptat, autentifică auth_key_id - calculează cei 64 de biți inferiori ai hash-ului SHA1 ai cheii publice K. Dacă valorile se potrivesc, decriptarea mesajului continuă.
- Folosind funcția de derivare a tastei, se formează cheia AES și IV
- Apoi, datele sunt decriptate bloc cu bloc folosind algoritmul AES-IGE. Ca rezultat, obținem un pachet care trebuie să se potrivească cu pachetul expeditorului.
- Comparați cei 128 de biți inferiori ai hash-ului SHA1 ai pachetului decriptat cu msg_key primit . Ca rezultat, primim mesajul decriptat [8] .
Atacuri de protocol
Atacul în oglindă și atacul repetat
Înainte de versiunea 16 a protocolului, clienții trebuiau să aibă încredere în server pentru a stoca numerele de secvență a mesajelor, iar mesajele în sine nu aveau un astfel de mecanism. Dar asta însemna că serverul atacatorului avea control deplin asupra fluxului de mesaje. Serverul nu era capabil să citească informațiile transmise, dar putea să rețină mesaje, să le modifice ordinea, să le trimită din nou. Dacă cel puțin unul dintre clienți folosește protocolul versiunea 16 și mai jos, chat-ul nu este protejat de acest tip de atac [9] .
Timing atac
Acest tip de atac folosește intervalul de timp dintre trimiterea unui mesaj și primirea unui răspuns de eroare. Majoritatea utilizatorilor Telegram îl folosesc pe dispozitivele mobile cu semnal slab, din acest motiv autentificarea mesajelor încetinește (timpul necesar procesorului pentru a procesa informațiile este mult mai mic decât timpul necesar pentru a le primi) [9] .
În Telegram , verificările sunt efectuate în următoarea ordine:
- Auth_key_id primit este comparat cu cel stocat pe dispozitiv.
- După decriptare, lungimea mesajului primit trebuie să fie mai mare decât 0 și mai mică decât numărul de octeți primiți.
- Se calculează msg_key și se compară cu cea primită.
- Numerele secvenței mesajelor sunt verificate cu un contor local.
Procesul de decriptare este întrerupt imediat dacă este detectată o eroare.
Pentru a efectua atacul, este necesar să trimiteți un mesaj într-un chat secret, dar înlocuiți pachetul criptat cu o secvență aleatorie. În urma verificărilor, destinatarul nu confirmă primirea mesajului, iar în fereastra expeditorului, acest mesaj va rămâne pentru totdeauna necitit [10] .
Criptanaliză
Potrivit publicațiilor, protocolul nu are nici criptare autentificată (AE) și nici indistinguire în cazul atacului de text cifrat ales (INDCCA) [1] [2] .
La textul cifrat generat , care este decriptat într-un mesaj , se adaugă un alt bloc de 128 de biți, adică textul cifrat primit . Ca rezultat, mesajul convertit este decriptat ca , în care , iar lungimea este mai mare decât lungimea blocului. Deoarece lungimea nu este verificată, decriptarea mesajului va reuși [1] [11] .
![{\displaystyle C=\{etichete,y_{1},y_{2},...,y_{l}\}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/da4529b5d33b5bc50d5bfc18c254a85eb08c0837)
![{\displaystyle X=\{etichete, mesaj, umplutură\}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/17a040fef4bb14e3473300bc9f1a9141e557ea19)
![{\displaystyle C'=\{etichete,y_{1},y_{2},...,y_{l},r\))](https://wikimedia.org/api/rest_v1/media/math/render/svg/7ec8c6fa6f9b0814be4c5a7f07dc201d26bf7188)
![{\displaystyle X'=\{etichete, mesaj, umplutură'\}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/c22bfdfa8213ba5cb4f261dd8f7313f677eca6c1)
![{\displaystyle padding'=\{padding,padding^{*}\}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/94e58bb7fcfc4d28fa3db23938c4153ee790b272)
![{\displaystyle padding'}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a3cff727f46ad2e9f83d3f99464cbae9af1df2ed)
![{\displaystyle padding}](https://wikimedia.org/api/rest_v1/media/math/render/svg/39c09b825a18fb1abd1d82ca604b26fb294d9285)
Pentru a preveni acest tip de atac, este necesar doar să verificați lungimea blocului de umplutură; dacă dimensiunea admisă este depășită, este necesar să opriți decriptarea mesajului [1] [12] .
Atacul #2 (schimbarea ultimului bloc criptat)
În textul cifrat generat , care este decriptat într-un mesaj , ultimul bloc de 128 de biți este modificat, adică textul cifrat primit . Ca rezultat, mesajul convertit este decriptat ca , iar lungimea este egală cu lungimea . Cu probabilitate, mesajul decriptat este același cu cel original, dar întrucât lungimea maximă a blocului suplimentar este de 96 de biți, probabilitatea este , deci acest tip de atac este mult mai dificil decât se aștepta [1] [13] .
![{\displaystyle C=\{etichete,y_{1},y_{2},...,y_{l}\}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/da4529b5d33b5bc50d5bfc18c254a85eb08c0837)
![{\displaystyle X=\{etichete, mesaj, umplutură\}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/17a040fef4bb14e3473300bc9f1a9141e557ea19)
![{\displaystyle C'=\{etichete,y_{1},y_{2},...,y_{l-1},r\))](https://wikimedia.org/api/rest_v1/media/math/render/svg/221824bfd6d207a6f4ac66f0e06647160d13f3dd)
![{\displaystyle X'=\{etichete, mesaj', umplutură'\}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/826069dd14d01c69f1c3ef728a206166aab425f1)
![{\displaystyle padding'}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a3cff727f46ad2e9f83d3f99464cbae9af1df2ed)
![{\displaystyle padding\ (p)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/4ce3334e500696c7bdd48d5711536aaa2f64597c)
![{\displaystyle 2^{PB}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/939176d7595a327c803d7f92f8e1d3f5ad181c33)
![{\displaystyle padding}](https://wikimedia.org/api/rest_v1/media/math/render/svg/39c09b825a18fb1abd1d82ca604b26fb294d9285)
![{\displaystyle 2^{-32}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/f6c5244b1622127f7f8009d261fca9759696ce5c)
Pentru a preveni acest tip de atac, este necesar să adăugați o etichetă de validare a umpluturii la antetele mesajului trimis, dar remedierea protocolului va împiedica utilizatorii cu noul protocol să facă schimb de mesaje cu utilizatorii care au încă vechiul [1] [14] .
Biblioteci pentru limbaje de programare
Nume
|
limbi)
|
Sursă
|
Descriere
|
@mtproto/core
|
JavaScript
|
https://github.com/alik0211/mtproto-core
|
Biblioteca client Telegram API (MTProto) pentru browser
|
MadelineProto
|
PHP
|
https://github.com/danog/MadelineProto
|
API client/server PHP asincron pentru protocolul telegram MTProto
|
Teleton
|
Piton
|
https://github.com/LonamiWebs/Telethon
|
Biblioteca client Pure Python 3 MTProto API Telegram, și pentru roboți!
|
pirogramă
|
Piton
|
https://github.com/pyrogram/pyrogram
|
Biblioteca client API Telegram MTProto și cadru pentru Python
|
gramaticii
|
Rugini
|
https://github.com/lonami/grammers
|
Un set de biblioteci Rust pentru a interacționa cu API-ul Telegram
|
TLSharp
|
C#
|
https://github.com/sochix/TLSharp
|
Biblioteca client Telegram implementată în C#
|
TDLib
|
Python, JavaScript, Go, Java, Kotlin, C#, C++, Swift, Objective-C, Dart, Rust, Erlang, PHP, Lua, Ruby, Clojure, Emacs Lisp, D, Elixir, 1С, C
|
https://github.com/tdlib/td
|
Bibliotecă multiplatformă pentru construirea de clienți Telegram. Poate fi folosit cu ușurință din aproape orice limbaj de programare
|
MTProto
|
Merge
|
https://github.com/xelaj/mtproto
|
Implementarea completă nativă a protocolului MTProto pe Golang!
|
Note
- ↑ 1 2 3 4 5 6 Security of MTProto, 2016 .
- ↑ 1 2 Criptanaliză a protocolului de mesagerie Telegram .
- ↑ Criptanaliza protocolului de mesagerie Telegram , p. 32.
- ↑ 1 2 Criptanaliză a protocolului de mesagerie Telegram , p. 32-34.
- ↑ 1 2 Criptanaliză a protocolului de mesagerie Telegram , p. 34-36.
- ↑ Criptanaliza protocolului de mesagerie Telegram , p. 35.
- ↑ Criptanaliza protocolului de mesagerie Telegram , p. 37-41.
- ↑ Criptanaliza protocolului de mesagerie Telegram , p. 41-43.
- ↑ 1 2 Criptanaliză a protocolului de mesagerie Telegram , p. 51.
- ↑ Criptanaliza protocolului de mesagerie Telegram , p. 51-52.
- ↑ Criptanaliza protocolului de mesagerie Telegram , p. 47.
- ↑ Criptanaliza protocolului de mesagerie Telegram , p. 48.
- ↑ Criptanaliza protocolului de mesagerie Telegram , p. 49.
- ↑ Criptanaliza protocolului de mesagerie Telegram , p. cincizeci.
Literatură
- Jakob Bjerre Jakobsen. Pe CCA (in)Securitatea MTProto. - 2016. - ISBN 978-1-4503-4564-4 .
Link -uri