Dokumentáció távirat létrehozásának engedélyezése gomb

A bemutató lekérdezésformátum bináris adat sorozatprogramozásának TL nyelvet. Minden nagy számban visszük át, mint egy string (karakterlánc), amely tartalmazza a kívánt szekvenciát bájtok sorrendben big-endian. Hash funkciók, mint például SHA1 visszatérő vezetéken (20 bájt), amely úgy is értelmezhető, mint egy big-endian számát. Kis számok (int hosszú int128 int256 ...) általában little-endian; Ha azonban ezek egy részét SHA1, a bájtot nem cserélték. Így, ha vannak hosszú x rövid szénláncú 64 bit a SHA1 s sorok. majd venni az utolsó 8 bájt 20 bájtos vonal SHA1 (ek). és értelmezni, mint egy 64-bites egész.

A műveletek sorrendje

Kiszámítása az egyszer

Ügyfél küld kérést a szervernek:

Nonce érték az ügyfél által választott véletlenszerűen (véletlen szám); Ez a kliens felismeri ennek részeként csere. Miután ezt a lépést, akkor mindenki által ismert.

szerverválasz

A szerver küld egy választ a következő formában:

Itt a „vonal» pq jelentése természetes szám (bináris rendszer big-endian formátumban). Ez a szám a termék két különböző páratlan prímszám. PQ általában nem haladja meg a 2 ^ 63-1. Jelentősége van önkényesen kiválasztott server_nonce szerver; Miután ezt a lépést, akkor mindenki által ismert.

server_public_key_fingerprints - egy listát az ujjlenyomatok nyilvános RSA-kulcsok (alsó 64 bit SHA1 (server_public_key), ahol a nyilvános kulcs képviseli, mint egy meztelen típusú rsa_public_key n: string e: string = RSAPublicKey (csupasz típus; részleteket típusok, lásd a cikk „szerializálásáról bináris adatokat. „), ahol a szokásos módon, az N és e - számok big-endian formátumú, például a sorozatszám sor bájt, majd számítottuk SHA1), a szerver fogadja.

Megjegyzendő, hogy minden további üzenet tartalmaz egy pár (nonce. Server_nonce), valamint a nyílt és a titkosított része, amely lehetővé teszi, hogy használja azt, hogy azonosítsa a „ideiglenes session” (egy run protokoll tárgyalt kulcs létrehozása). A támadó nem képes létrehozni egy párhuzamos munkamenetet a kiszolgáló azonos paraméterekkel, és újra a titkosított kliens vagy szerver oldali üzeneteik saját célra a párhuzamos munkamenetet, mert az új „ideiglenes session” szerver lesz kiválasztva egy másik server_nonce.

Igazolása teljesítmény

Az ügyfél határozza pq száma prímszám p

Most kezdődik a kör kulcscserét Diffie-Helmanu:

Küldő kiszolgáló és hitelesítés

A kliens küld egy kérést:

Itt encrypted_data következőképpen állítjuk elő:

  • new_nonce: = egy másik (jó) egy véletlenszerűen generált számot az ügyfél által; Miután ezt a kérést, köztudott, hogy a kliens és a szerver;
  • adatok: = szerializálni az alábbi: vagy ennek a
  • data_with_hash: = SHA1 (adatok) + (adatok) + (bármely véletlenszerűen bájt); ez a hossz egyenlőnek kell lennie a 255 bájt;
  • encrypted_data: = RSA (data_with_hash, server_public_key); - 255-byte hosszú szám (big-endian) emeljük, a kívánt mértékben a kívánt modulus, az eredmény kerül rögzítésre egy 256 bájtos szám.
A szerver két módja van:

Itt encrypted_answer ily módon kapott:

  • new_nonce_hash: = 128 bit alacsonyabb rendű SHA1 (new_nonce);
  • válasz: = serialization
  • answer_with_hash: = SHA1 (válasz) válasz + + (a véletlenszerűen 0-15 bájt); hossza lehet osztva 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); Itt tmp_aes_key - egy 256 bites kulcs használatát, tmp_aes_iv - egy 256 bites inicializálóvektorból. Csakúgy, mint minden más esetben, hogy használja az AES titkosítási, titkosított adatok felbujtás véletlenszerűen bájtok hossza osztható 16, közvetlenül azelőtt, hogy a titkosítást.

E lépés után new_nonce még ismert, csak a kliens és a szerver. Az ügyfelek biztosak lehetnek benne, hogy ez egy szerver, és azt mondta, hogy a válasz generált kifejezetten válaszul ügyfél kérésére req_DH_params, mivel a válasz adatokat titkosított new_nonce.

Az ügyfél ellenőrzi, hogy p = true dh_prime 2048 bit prímszám (vagyis p és (p-1) / 2 prím szám, és 2 ^ 2047

Ha az ellenőrzés túl sok időt (a régebbi mobil eszközök), akkor kezdetben csak futtatni 15 ismétléseket a Miller-Rabin, hogy ellenőrizze a elsőbbségét / tartozó prímszámokat p és (p - 1) / 2 valószínűséggel hiba nem haladja meg az egy milliárdod és többet tenni ismétléseket később a háttérben.

Egyéb optimalizálási lehet a beágyazás a kliens alkalmazás kód egy kis asztal néhány „jó” pár (g, p) (vagy egyszerűen ismert helyes prímszám p, hiszen g könnyen ellenőrizni végrehajtás közben) ellenőrzik során a kód generáció fázisban, hogy elkerüljék a teljesítmény az ilyen ellenőrzés a futás során. A szerver módosítja ezeket az értékeket ritkán ezért általában szükség helyettesített egy ilyen tábla aktuális értéket dh_prime szerver. Például, az aktuális érték egyenlő dh_prime (annak érdekében, bájtok big-endian)

kulcsgenerálás

A kliens kiszámolja 2048 Véletlenszerűen bit b szám (kellő mennyiségű entrópia), és küld egy kérést a szerver:

Itt encrypted_data ily módon kapott:

  • pow (g, b) mod dh_prime;
  • adatok: = serialization
  • data_with_hash: = SHA1 (adatok) + + adatok (0-15 byte egy véletlenszerűen), a hossza lehet osztva 16;
  • encrypted_data: = AES256_ige_encrypt (data_with_hash, tmp_aes_key, tmp_aes_iv);

Retry_id mező nulla az első kísérlet; vagy egyenlő az előző auth_key_aux_hash zafeylennoy kísérletek (ld. 9.).

számítási auth_key

Ennek megfelelően, auth_key egyenlő pow (g,) mod dh_prime; a szerver van kiszámítva, mint pow (g_b, a) mod dh_prime. és a kliens, mint a (g_a) ^ b mod dh_prime.

számítási auth_key_hash

auth_key_hash számított: = 64 alacsonyabb sorrendű bit SHA1 (auth_key). A szerver ellenőrzi, hogy van egy másik gomb az azonos auth_key_hash és megfelel az alábbi módszerekkel.

Folyamatban van a kulcs csere

A kiszolgáló a következő három módon:

  • new_nonce_hash1, new_nonce_hash2, és new_nonce_hash3 számítva 128-bites SHA1 alacsonyabb sorrendű byte karakterlánc kapott vonal new_nonce hozzáadásával egy bájt, amelynek értéke 1, 2 vagy 3, majd a többi bájt 8 auth_key_aux_hash. Eltérő értékek van szükség, hogy megakadályozzák az elkövető, hogy módosítsa a szerver válasza dh_gen_ok dh_gen_retry.
  • auth_key_aux_hash 64 a legmagasabb rendű bit SHA1 (auth_key). Nem szabad összekeverni auth_key_hash.

Egy másik esetben az ügyfél hozzáfér a 6. pont) létrehozunk egy új b.

Az első esetben a kliens és a szerver végre auth_key. akkor felejtsd el a fennmaradó időben adatokat, és az ügyfél létrehoz egy titkosított ülésen egy másik auth_key. Ugyanakkor server_salt eredetileg telepítve substr (new_nonce, 0, 8) XOR substr (server_nonce, 0, 8). Ha szükséges, az ügyfél megtartja a különbség server_time lépésben kapott 5) és a helyi idő, hogy egy jó közelítő pontossággal a szerver idő, ami ahhoz szükséges, hogy a megfelelő azonosító üzenetet.

hiba Kezelés

Ebben az esetben, ha az ügyfél nem kap választ a szerver a kérést egy bizonyos időn belül, akkor egyszerűen ismételje meg a kérést. Ha a szerver küldött válasz a kérésre (pontosan ez a lekérdezés helyett ugyanazon - az összes paraméter olyan ismétlési kellene ugyanazt az értéket), de nem éri el az ügyfél, akkor a szerver egyszerűen megismételni ugyanazt a választ. A szerver emlékszik válasz után 10 perccel a kérelem kézhezvételét 1). Ha a szerver már elfelejtette a választ, vagy a szükséges időt az adatok, az ügyfél meg kell kezdeni az elejétől.

A szerver joga van feltételezni, hogy ha egy ügyfél küldte a következő lekérdezést, amely felhasználja az adatokat a korábbi szerver válaszul az ügyfél, akkor a válasz minden bizonnyal megkapta a kliens és a szerver elfelejteni.

Alkalmazási példa