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] :

  1. Clientul C trimite o cerere către serverul S cu un șir compus dintr-o secvență aleatorie de 128 de biți.
  2. 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).
  3. 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.
  4. 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.
  5. 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.
  6. C alege cheia privată b , calculează cheia publicăși cheia publică. Apoi(în formă criptată) este trimis către serverul S [4] .

Creați un chat secret între doi utilizatori

Utilizatorii A și B doresc să inițialeze un chat secret [5] :

  1. 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.
  2. A calculează cheia publicășio trimite utilizatorului B.
  3. 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 .
  4. B calculează cheia publicăși o trimite către A .
  5. Ambii utilizatori generează o cheie publică partajată . Aceasta completează schimbul de chei secrete între utilizatori [5] .
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 .
  • 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] .

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
  1. 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ă.
  2. Folosind funcția de derivare a tastei, se formează cheia AES și IV
  3. 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.
  4. 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:

  1. Auth_key_id primit este comparat cu cel stocat pe dispozitiv.
  2. 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.
  3. Se calculează msg_key și se compară cu cea primită.
  4. 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] .

Atacul #1 ( cu creșterea lungimii mesajului )

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] .

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] .

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. 1 2 3 4 5 6 Security of MTProto, 2016 .
  2. 1 2 Criptanaliză a protocolului de mesagerie Telegram .
  3. Criptanaliza protocolului de mesagerie Telegram , p. 32.
  4. 1 2 Criptanaliză a protocolului de mesagerie Telegram , p. 32-34.
  5. 1 2 Criptanaliză a protocolului de mesagerie Telegram , p. 34-36.
  6. Criptanaliza protocolului de mesagerie Telegram , p. 35.
  7. Criptanaliza protocolului de mesagerie Telegram , p. 37-41.
  8. Criptanaliza protocolului de mesagerie Telegram , p. 41-43.
  9. 1 2 Criptanaliză a protocolului de mesagerie Telegram , p. 51.
  10. Criptanaliza protocolului de mesagerie Telegram , p. 51-52.
  11. Criptanaliza protocolului de mesagerie Telegram , p. 47.
  12. Criptanaliza protocolului de mesagerie Telegram , p. 48.
  13. Criptanaliza protocolului de mesagerie Telegram , p. 49.
  14. 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