Documentația telegramă crearea unei chei de autorizare

În descrierea formatului de interogare este binar serializarea date și limba TL. Toate numerele mari sunt transferate ca un șir de caractere (string), care conține secvența dorită de octeți în ordine big-endian. funcții hash cum ar fi linia de retur SHA1 (20 bytes), care poate fi interpretat ca un număr mare-endian. Numerele mici (int int256 lung int128 ...) este de obicei little-endian; Cu toate acestea, în cazul în care acestea fac parte din SHA1, octeții nu sunt schimbate. Astfel, dacă există x lungime mai mici de 64 de biți de SHA1 a s rânduri. apoi luat ultimii 8 octeți ai liniei SHA1 (e) 20 byte. și interpretată ca un întreg pe 64 de biți.

secvență de acțiuni

Calcularea nonce

Clientul trimite solicitarea de la server:

Valoarea Nonce ales de client aleatoriu (număr aleator); Acesta identifică clientul, ca parte a acestui schimb. După această etapă, este cunoscut tuturor.

răspunsul serverului

Serverul trimite un răspuns în formă de:

Aici, „linia» PQ reprezintă un număr natural (într-un sistem binar în format big-endian). Acest număr este produsul a două numere prime impare distincte. PQ, de obicei, nu depășește 2 ^ 63-1. Semnificația este ales în mod arbitrar serverul server_nonce; După această etapă, este cunoscut tuturor.

server_public_key_fingerprints - o listă a amprentelor digitale ale publice RSA-chei (mai mici de 64-biți SHA1 (server_public_key); în care cheia publică este reprezentat ca un gol de tip rsa_public_key n: string e: string = RSAPublicKey (tip goale; detalii despre tipurile, consultați articolul „serializarea date binare. „), în cazul în care ca de obicei, n și e - numerele în format big-endian, ca un șir de octeți serializate, și SHA1 apoi calculat), serverul va accepta.

Rețineți că toate mesajele ulterioare conțin o pereche (nOdată. Server_nonce) și în aer liber, iar în partea criptat care vă permite să-l utilizați pentru a identifica „sesiune temporară“ (un protocol de a alerga discutat crearea de cheie). Atacatorul nu este capabil de a crea o sesiune paralelă cu serverul cu aceiași parametri și reutilizați partea de client sau server criptate mesajelor lor pentru propriile lor scopuri în sesiunea paralelă, deoarece noul server „sesiune temporară“ va fi selectat un alt server_nonce.

Dovada performanței

Clientul stabilește numărul de pq de amorse p

Acum, începe schimbul cheie rundă de Diffie-Helmanu:

Trimiterea server și autentificare

Clientul trimite o cerere:

Aici encrypted_data obținut după cum urmează:

  • new_nonce: = alt (bun) un număr aleator generat de client; După această solicitare, este cunoscut pentru client și server;
  • Date: = serializa următoarele: sau această
  • data_with_hash: = SHA1 (date) + (date) + (orice bytes aleator); această lungime ar trebui să fie egală cu 255 de octeți;
  • encrypted_data: = RSA (data_with_hash, server_public_key); - 255-byte număr lung (big-endian) este ridicată la gradul dorit de modul dorit, rezultatul este înregistrat ca un număr de 256 de octeți.
Serverul răspunde în două moduri:

Aici encrypted_answer obținute în acest fel:

  • new_nonce_hash: = 128 biți de SHA1 ordin inferior (new_nonce);
  • Răspuns: = serializare
  • answer_with_hash: = SHA1 (răspuns) răspuns + + (a aleator 0-15 bytes); Lungimea poate fi împărțită la 16;
  • tmp_aes_key: = SHA1 (new_nonce + server_nonce) + substr (SHA1 (server_nonce + new_nonce), 0, 12);
  • tmp_aes_iv: = substr (SHA1 (server_nonce + new_nonce), 12, 8) + SHA1 (new_nonce + new_nonce) + substr (new_nonce, 0, 4);
  • encrypted_answer: = AES256_ige_encrypt (answer_with_hash, tmp_aes_key, tmp_aes_iv); aici tmp_aes_key - este o cheie de 256 de biți, tmp_aes_iv - este un vector de inițializare 256-biți. La fel ca și în toate celelalte cazuri care folosesc criptarea AES, datele criptate care incită la întâmplare bytes la o lungime divizibil cu 16, chiar înainte de criptare.

După acest pas new_nonce încă cunoscut numai pentru client și server. Clienții sunt siguri că acesta este un server și a spus că răspunsul generat în mod specific ca răspuns la o cerere de client req_DH_params, deoarece datele de răspuns sunt criptate folosind new_nonce.

Din clientul va verifica dacă p = true dh_prime 2048-bit prim număr (ceea ce înseamnă că ambele p și (p-1) / 2 sunt numere prime, și că 2 ^ 2047

Dacă verificarea durează prea mult timp (în cazul dispozitivelor mobile mai vechi), acesta poate rula inițial doar 15 iterații ale Miller-Rabin, pentru a verifica întâietatea / aparținând numerelor prime p și (p - 1) / 2 cu probabilitatea de eroare să nu depășească o miliardime și de a face mai multe iterații mai târziu, în fundal.

Alte optimizare pot fi încorporate în codul aplicației client este o masă mică, cu unele pereche „bune“ (g, p) (sau pur și simplu cunoscut amorse corect p, deoarece g este ușor de verificat în timpul execuției) este verificată în timpul fazei de generare a codului, pentru a evita performanța o astfel de verificare în timpul rulării. Serverul modifică aceste valori rareori, astfel, necesită de obicei substituite într-o astfel de valoare curentă de server dh_prime tabel. De exemplu, valoarea curentă este egală cu dh_prime (în ordinea bytes big-endian)

generarea de chei

Clientul calculeaza 2048 bit Randomly numărul b (folosind suficientă entropie) și trimite o cerere la server:

Aici encrypted_data obținute în acest fel:

  • pow (g, b) dh_prime mod;
  • date: = serializare
  • data_with_hash: = SHA1 (date) + + date (0-15 bytes un mod aleator), lungimea poate fi împărțită la 16;
  • encrypted_data: = AES256_ige_encrypt (data_with_hash, tmp_aes_key, tmp_aes_iv);

câmp Retry_id este zero, în timpul prima încercare; sau egal cu încercările anterioare auth_key_aux_hash zafeylennoy (a se vedea alin. 9).

Calcul auth_key

Prin urmare, este egal cu auth_key pow (g) dh_prime mod; serverul este calculat ca pow (g_b, a) dh_prime mod. și pe client ca (g_a) ^ b dh_prime mod.

Calcul auth_key_hash

auth_key_hash calculat: = 64 SHA1 inferior bit ordine (auth_key). Controalele de server în cazul în care există o cheie diferită de aceeași auth_key_hash și îndeplinește una dintre următoarele metode.

Finalizarea schimbului cheie

Serverul răspunde cu una din cele trei moduri:

  • new_nonce_hash1, new_nonce_hash2 și new_nonce_hash3 calculat ca șir de 128 de biți SHA1 ordin inferior octet obținut din linia plus new_nonce de un octet cu o valoare de 1, 2 sau 3, urmat de alți octeți cu 8 auth_key_aux_hash. Sunt necesare valori diferite pentru a preveni contravenientului de a schimba răspunsul serverului la dh_gen_ok dh_gen_retry.
  • auth_key_aux_hash 64 este cea mai mare SHA1 biți ordine (auth_key). Nu ar trebui să fie confundat cu auth_key_hash.

Într-un alt caz, clientul accesează elementul 6) generarea unui nou b.

În primul caz, clientul și serverul de a pune în aplicare auth_key. atunci ei uita tot restul datelor de timp, iar clientul creează o sesiune criptată folosind un alt auth_key. În același timp server_salt instalat inițial ca substr (new_nonce, 0, 8) substr XOR (server_nonce, 0, 8). Dacă este necesar, clientul reține diferența dintre server_time obținut în etapa 5), ​​și timpul local pentru a avea o precizie de aproximativ bun la timpul de server, care este necesar pentru a genera mesajul corect ID-ul.

eroare de manipulare

În acest caz, în cazul în care clientul nu primește nici un răspuns de la server la solicitarea dvs. într-un anumit interval de timp, se poate repeta pur și simplu cererea. În cazul în care serverul a trimis un răspuns la cererea (exact această interogare, mai degrabă decât pe aceeași - toți parametrii la o repetare ar trebui să ia aceeași valoare), dar el nu a ajuns la client, serverul va repeta pur și simplu același răspuns. Serverul își amintește de răspuns la 10 minute după primirea cererii 1). Dacă serverul ar fi uitat răspunsul sau datele de timp necesare, clientul va trebui să înceapă de la început.

Serverul are dreptul să-și asume că, dacă un client a trimis următoarea interogare, care utilizează date din răspunsul serverului anterior la acest client, atunci răspunsul este cu siguranță primit de către client și server poate uita.

exemplu de utilizare