Î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: Clientul trimite o cerere: Aici encrypted_data obținut după cum urmează: Aici encrypted_answer obținute în acest fel: 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) 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: 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). 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. 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. Serverul răspunde cu una din cele trei moduri: Î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. Î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.Trimiterea server și autentificare
Serverul răspunde în două moduri:
generarea de chei
Calcul auth_key
Calcul auth_key_hash
Finalizarea schimbului cheie
eroare de manipulare
exemplu de utilizare