Tämä mtproton päästä päähän-salausta käsittelevä artikkeli on tarkoitettu edistyneille käyttäjille.Jos haluat lisätietoja salaisista keskusteluista vähemmän uhkaavasta lähteestä, tutustu yleisiin FAQ-kysymyksiimme.
huomaa, että versiosta 4.6 lähtien suuret Telegram-asiakkaat käyttävät MTProto 2.0: aa.MTProto v. 1.0 on vanhentunut, ja sitä ollaan parhaillaan poistamassa käytöstä.
salaiset chatit ovat kahdenkeskisiä chatteja, joissa viestit salataan avaimella, joka on vain chatin osallistujien hallussa. Huomaa, että näiden päästä päähän salattujen salaisten keskustelujen skeema on erilainen kuin pilvikeskusteluissa:
huomautus MTProto 2.0: ssa
tässä artikkelissa kuvataan päästä päähän-salauskerros MTProto-protokollan versiossa 2.0.Tärkeimmät erot versioon 1.0 (kuvattu tässä viitteenä) ovat seuraavat:
- SHA-256 käytetään SHA-1: n sijasta;
- Padottavat tavut osallistuvat msg_keyn laskemiseen;
- msg_key riippuu paitsi salattavasta viestistä, myös osasta salaista chat-avainta;
- 12..1024 täytettä tavua käytetään 0: n sijasta..15 täytettä tavua v. 1.0: ssa.
Katso myös: MTProto 2.0: Pilvikeskustelut, palvelimen ja asiakkaan salaus
avaimen generointi
avaimet luodaan Diffie-Hellman-protokollaa käyttäen.
Tarkastellaanpa seuraavaa skenaariota: Käyttäjä A haluaisi aloittaa päästä päähän salatun viestinnän käyttäjän B kanssa.
pyynnön lähettäminen
Käyttäjä A suorittaa viestit.getDhConfig saada Diffie-Hellman parametrit: alkuluku p, ja suurjärjestyselementti g.
tämän menetelmän suorittaminen ennen jokaista uuden avaimen sukupolven menettelyä on erittäin tärkeää. On järkevää välimuistiin arvot parametrien yhdessä version, jotta ei tarvitse vastaanottaa kaikkia arvoja joka kerta. Jos asiakkaalle tallennettu versio on edelleen ajan tasalla, palvelin palauttaa rakentajan viestit.dhconfignoa ei muutettu.
asiakkaan odotetaan tarkistavan, onko P turvallinen 2048-bittinen alkuluku (eli sekä p että (p-1)/2 ovat alkuluku, ja että 2^2047 < p < 2^2048), ja että g luo alkuluvun syklisen aliryhmän (p-1)/2 eli on neliöjäännös Mod P. koska G on aina yhtä suuri kuin 2, 3, 4, 5, 6 tai 7, tämä on helppo tehdä käyttämällä neliömäistä vastavuoroisuuslakia, jolloin saadaan yksinkertainen ehto p Mod 4G: lle-nimittäin P Mod 8 = 7 g = 2; p mod 3 = 2 g = 3; ei ylimääräistä ehtoa g = 4; p Mod 5 = 1 tai 4 g = 5; p Mod 24 = 19 tai 23 g = 6; ja p mod 7 = 3, 5 tai 6, Kun G = 7. Kun asiakas on tarkistanut g: n ja p: n, on järkevää kätkeä tulos, jotta vältyttäisiin toistamasta pitkiä laskelmia tulevaisuudessa. Tämä välimuisti voidaan jakaa Valtuutustietoavaimen luomiseen käytettävän välimuistin kanssa.
jos asiakkaalla on riittämätön satunnaislukugeneraattori, on järkevää siirtää random_length-parametri (random_length> 0), joten palvelin luo oman sopivan mittaisen satunnaisjärjestyksen satunnaisen.Tärkeää: käyttämällä palvelimen satunnaista sekvenssiä sen raa ’ assa muodossa voi olla vaarallista. Se on yhdistettävä asiakassekvenssiin esimerkiksi generoimalla samanpituinen Asiakaskohtainen luku (client_random) ja käyttämällä final_random := random XOR client_random
.
asiakas a laskee 2048-bittisen luvun a (käyttäen riittävää entropiaa tai palvelimen satunnaista; KS.yllä) ja suorittaa viestit.requestEncryption ohitettuaan g_a := pow(g, a) mod dh_prime
.
käyttäjä B vastaanottaa update updateEncryption kaikille valtuutustietoavaimille (kaikille valtuutetuille laitteille) chat constructor encryptedChatRequested-keskustelupalstalla. Käyttäjälle on näytettävä perustiedot käyttäjästä A ja häntä on pyydettävä hyväksymään tai hylkäämään pyyntö.
molempien asiakkaiden on tarkistettava, että g, g_a ja g_b ovat suurempia kuin yksi ja pienempiä kuin p-1. Suosittelemme tarkistamaan, että g_a ja g_b ovat myös välillä 2^{2048-64} ja p-2^{2048-64} .
pyynnön hyväksyminen
käyttäjä B: n vahvistettua salaisen chatin luomisen A: n kanssa client-käyttöliittymässä asiakas b saa myös ajantasaiset konfiguraatioparametrit Diffie-Hellman-menetelmälle. Sen jälkeen se luo satunnaisen 2048-bittisen luvun b käyttäen samanlaisia sääntöjä kuin a.
saatuaan g_a: n päivityksestä encryptedChatRequested-ohjelmalla, se voi välittömästi luoda lopullisen jaetun avaimen: key = (pow(g_a, b) mod dh_prime)
. Jos avaimen pituus < 256 tavua, lisätään pehmusteeksi useita johtavia nolla tavua — niin, että avain on täsmälleen 256 tavun pituinen. Sen sormenjälki, key_fingerprint, on yhtä suuri kuin SHA1: n 64 viimeistä bittiä (avain).
Huomautus 1: tässä tapauksessa SHA1: tä käytetään tässä myös MTProto 2.0: n salaisissa keskusteluissa.
Huomautus 2: tätä sormenjälkeä käytetään saniteettitarkistuksena avaimen vaihtomenettelyssä vikojen havaitsemiseksi asiakasohjelmistoa kehitettäessä-sitä ei ole kytketty avainvisualisointiin, jota käytetään asiakkailla ulkoisen todennuksen välineenä salaisissa keskusteluissa. Key visualisointeja asiakkaille luodaan käyttäen ensimmäinen 128 bittiä SHA1(intial key) ja ensimmäinen 160 bittiä SHA256 (avain käytetään, kun salainen chat päivitettiin tasolle 46).
asiakas B suorittaa viestit.acceptEncryption läpäistyään sen g_b := pow(g, b) mod dh_prime
and key_fingerprint.
kaikkien asiakas B: n valtuuttamien laitteiden, paitsi nykyisen, päivitetyt salauspäivitykset lähetetään constructorin salatulla chatdiscardilla. Tämän jälkeen ainoa laite, joka pääsee salaiseen chatiin, on laite B, joka soitti puhelun viesteihin.hyväksy salaus.
käyttäjälle A lähetetään päivittyvä salauspäivitys constructor encryptedchatin kanssa chatin käynnistäneelle valtuutustietoavaimelle.
päivityksestä saadulla G_b: llä asiakas A voi laskea myös jaetun avaimen key = (pow(g_b, a) mod dh_prime)
. Jos avaimen pituus < 256 tavua, lisätään pehmusteeksi useita johtavia nolla tavua — niin, että avain on täsmälleen 256 tavun pituinen. Jos vastaanotetun avaimen sormenjälki on sama kuin salatussa chatissa, saapuvat viestit voidaan lähettää ja käsitellä. Muuten viestejä.discardEncryption on suoritettava ja siitä on ilmoitettava käyttäjälle.
Perfect Forward Secret
aiemman viestinnän suojaamiseksi viralliset Telegram-asiakkaat aloittavat uudelleenavaamisen, kun avainta on käytetty yli 100 viestin salauksen purkamiseen ja salaamiseen tai se on ollut käytössä yli viikon, jos avainta on käytetty vähintään yhden viestin salaamiseen. Vanhat avaimet hävitetään turvallisesti, eikä niitä voida rekonstruoida, vaikka käytössä olevat uudet avaimet olisivat käytettävissä.
uudelleenavaamisprotokollaa kuvataan tarkemmin tässä artikkelissa: Perfect Forward Secret Secret Chats.
huomaa, että asiakkaan on tuettava eteenpäin salaista salassapitoa salaisissa keskusteluissa ollakseen yhteensopiva virallisten Telegram-asiakkaiden kanssa.
viestien lähettäminen ja vastaanottaminen salaisessa chatissa
Lähtevien viestien sarjallistaminen ja salaus
luodaan TL-olio, jonka tyyppi on salattu viesti, joka sisältää viestin selkotekstinä. Taaksepäin yhteensopivuus, objekti on käärittävä rakentaja salauksenpurkukerroksen kanssa merkintä tuetun kerroksen (alkaen 46).
päästä päähän-salattujen viestien sisällön TL-skeema löytyy täältä ”
tuloksena oleva konstruktio on sarjattu tavujen joukkona käyttäen yleisiä TL-sääntöjä. Tuloksena joukko on edeltänyt 4 tavua, jotka sisältävät taulukon pituus ei lasketa näitä 4 tavua.
tavurivistö on pehmustettu 12-1024 satunnaisella pehmusteella, jotta sen pituus olisi jaollinen 16 tavulla. (Vanhemmassa MTProto 1.0-salauksessa käytettiin vain 0-15 pehmustetavua.)
Viestiavain, msg_key, lasketaan edellisessä vaiheessa saadun tiedon SHA256: n 128 keskibittinä, jota edeltää 32 tavua jaetusta avainavaimesta. (Vanhemmalle MTProto 1.0-salaukselle msg_key laskettiin eri tavalla, sillä edellisissä vaiheissa saadun tiedon 128 alempaa bittiä SHA1: tä lukuun ottamatta.)
MTProto 2.0: lle lasketaan AES-avain aes_key ja alustusvektori aes_iv (avain on avaimen generoinnin aikana saatu jaettu avain) seuraavasti:
- msg_key_large = SHA256 (substr (key, 88 + x, 32) + plaintext + random_padding);
- msg_key = substr (msg_key_large, 8, 16);
- sha256_a = SHA256 (msg_key + substr (avain, x, 36));
- sha256_b = SHA256 (substr (avain, 40+x, 36) + msg_key);
- aes_key = substr (sha256_a, 0, 8) + substr (sha256_b, 8, 16) + substr (sha256_a, 24, 8);
- aes_iv = substr (sha256_b, 0, 8) + substr (sha256_a, 8, 16) + SUBSTR (sha256_b, 24, 8);
mtprotolle 2.0, x=0 viestien lähettäjälle salainen chat, x=8 viestejä vastakkaiseen suuntaan.
vanhentuneelle Mtprotolle 1.0, msg_key, aes_key, ja aes_iv laskettiin eri tavalla (katso tämä asiakirja viite).
Data salataan 256-bittisellä avaimella, aes_keyllä, ja 256-bittisellä alustusvektorilla, aes-iv, käyttäen AES-256-salausta, jossa on infinite garble extension (IGE). Salausavaimen sormenjälki key_fingerprint ja viestiavain msg_key lisätään alkuun tuloksena tavu array.
salattu tieto on upotettu a-viesteihin.sendEncrypted API call ja välitetty Telegram server toimitettavaksi toiselle osapuolelle salaisen Chat.
päivittäminen MTProto 2.0: aan Mtprotosta 1.0
heti kun molemmat salaisen keskustelun osapuolet käyttävät vähintään tasoa 73, heidän tulee käyttää vain MTProto 2.0: aa kaikissa lähtevissä viesteissä. Osa ensimmäisistä vastaanotetuista viesteistä voi käyttää MTProto 1.0: aa, jos riittävän korkeaa aloituskerrosta ei ole neuvoteltu salaisen chatin luomisen aikana. Kun ensimmäinen viesti, joka on salattu MTProto 2.0: lla (tai ensimmäinen viesti, jossa on taso 73 tai uudempi), on vastaanotettu, kaikki viestit, joissa on korkeampi järjestysnumero, on salattava myös MTProto 2.0: lla.
niin kauan kuin nykyinen taso on alle 73, jokaisen osapuolen tulee yrittää purkaa vastaanotetut viestit MTProto 1.0: lla, ja jos tämä ei onnistu (msg_key ei täsmää), kokeile MTProto 2.0: aa. Kun ensimmäinen MTProto 2.0-salattu viesti saapuu (tai taso on päivitetty 73: ksi), ei tarvitse yrittää MTProto 1.0-salauksen purkua muille viesteille (ellei asiakas vielä odota joidenkin aukkojen sulkeutumista).
saapuvan viestin salauksen purkaminen
yllä olevat vaiheet suoritetaan käänteisessä järjestyksessä. Kun salattu viesti vastaanotetaan, sinun on tarkistettava, että msg_key on itse asiassa yhtä suuri kuin salatun viestin SHA256-hashin 128 keskimmäistä bittiä, joita edeltää jaetusta avaimesta otettu 32 tavua.Jos viestitaso on suurempi kuin asiakkaan tukema, käyttäjälle on ilmoitettava, että asiakasversio on vanhentunut, ja häntä on pyydettävä päivittämään.
järjestysnumerot
kaikki viestit on tulkittava alkuperäisinä, jotta ne suojautuvat mahdollisilta manipulaatioilta. Salaiset chatit tukevat erityistä mekanismia seq_no-laskurien käsittelyyn itsenäisesti palvelimesta.
näiden laskureiden asianmukaista käsittelyä kuvataan tarkemmin tässä artikkelissa: järjestysnumerot salaisissa keskusteluissa.
huomaa, että asiakkaan on tuettava järjestysnumeroita salaisissa keskusteluissa ollakseen yhteensopiva virallisten Telegram-asiakkaiden kanssa.
salattujen tiedostojen lähettäminen
kaikki salaisiin keskusteluihin lähetetyt tiedostot salataan kertanäppäimillä, jotka eivät liity millään tavalla chatin jaettuun avaimeen. Ennen salatun tiedoston lähettämistä oletetaan, että salatun tiedoston osoite liitetään salatun viestin ulkopuolelle käyttäen viestien tiedostoparametria.sendEncryptedFile menetelmä ja että avain suoraan salauksen lähetetään rungon viestin (avain parametri rakentajat salattu messagemediaphoto, decryptedMessageMediaVideo ja decryptedMessageMediaFile.
ennen tiedoston lähettämistä salaiseen chatiin lasketaan 2 satunnaista 256-bittistä numeroa, jotka toimivat tiedoston salaamiseen käytettävänä AES-avaimena ja alustusvektorina. AES-256-salausta infinite garble extension (IGE) käytetään samalla tavalla.
avaimen sormenjälki lasketaan seuraavasti:
- digest = MD5(key + iv)
- fingerprint = substr(digest, 0, 4) XOR substr(digest, 4, 4)
tiedoston salattu sisältö tallennetaan palvelimelle paljolti samalla tavalla kuin tiedoston sisältö pilvikeskusteluissa: pala palalta käyttäen puheluita lataamiseen.saveFilePart.Myöhempi puhelu viesteihin.sendEncryptedFile määrittää tallennetulle tiedostolle tunnisteen ja lähettää osoitteen yhdessä viestin kanssa. Vastaanottaja saa päivityksen kanssa encryptedMessage, ja tiedosto parametri sisältää tiedoston tiedot.
saapuvat ja lähtevät salatut tiedostot voidaan siirtää muihin salaisiin keskusteluihin käyttämällä constructor inputencrypted-tiedostoa, jotta samaa sisältöä ei tallenneta palvelimelle kahdesti.
Päivitysruudun kanssa työskentely
salaiset chatit liittyvät tiettyihin laitteisiin (tai pikemminkin valtuutustietoavaimiin), eivät käyttäjiin. Tavanomainen viestilaatikko, joka käyttää pts: ää asiakkaan tilan kuvaamiseen, ei sovellu, koska se on suunniteltu viestien pitkäaikaiseen tallennukseen ja viestien käyttöön eri laitteilla.
tämän ongelman ratkaisuksi otetaan käyttöön ylimääräinen väliaikainen viestijono. Kun salaisesta chatista lähetettyä viestiä koskeva päivitys lähetetään, lähetetään Uusi QTS-arvo, joka auttaa rekonstruoimaan eron, jos yhteydessä on ollut pitkä katkos tai jos päivitys on kadonnut.
tapahtumien lukumäärän kasvaessa qts: n arvo kasvaa 1: llä jokaisen uuden tapahtuman myötä. Alkuarvo ei välttämättä ole (eikä tule olemaan) yhtä suuri kuin 0.
se, että asiakas on vastaanottanut ja tallentanut tilapäisen jonon tapahtumia, kuitataan yksiselitteisesti soittamalla viesteihin.receedqueue-menetelmällä tai implisiittisesti päivityspyynnöllä.getDifference (arvo qts kulunut, ei lopullinen tila). Kaikki asiakkaan toimittamat viestit sekä kaikki yli 7 päivää vanhat viestit voidaan (ja tullaan) poistaa palvelimelta.
de-valtuutuksen yhteydessä vastaavan laitteen tapahtumajono tyhjennetään väkisin, ja qts: n arvo muuttuu merkityksettömäksi.
päivittäminen uusille tasoille
asiakkaan tulee aina tallentaa maksimikerros, jonka asiakkaan tiedetään tukevan salaisen chatin toisella puolella. Kun salainen chat luodaan ensimmäisen kerran, tämä arvo on alustettava 46: een. Tämä etäkerroksen arvo on aina päivitettävä välittömästi sen jälkeen, kun on vastaanotettu jokin ylemmän kerroksen tietoja sisältävä paketti, ts.:
- mikä tahansa salainen keskusteluviesti, joka sisältää layer_no sen
decryptedMessageLayer
kanssa layer>=46, tai - salattu messageactionnotifylayer-palveluviesti, kääritty ikään kuin se olisi vanhentuneen kerroksen 8 (constructor
decryptedMessageService#aa48327d
).
ilmoittamalla etäasiakkaalle paikallisesta tasostasi
, jotta etäasiakkaalle voidaan ilmoittaa paikallisesta tasostasi, asiakkaan on lähetettävä viesti decryptedMessageActionNotifyLayer
type. Tämä ilmoitus on käärittävä sopivan kerroksen rakentajaan.
on kaksi tapausta, joissa asiakkaan on ilmoitettava etäasiakkaalle paikallisesta tasostaan:
- heti kun uusi salainen chat on luotu, heti kun salainen avain on onnistuneesti vaihdettu.
- välittömästi sen jälkeen, kun paikallinen asiakas on päivitetty tukemaan uutta salaista chat-tasoa. Tässä tapauksessa ilmoitukset on lähetettävä kaikille nykyisille salaisille keskusteluille. Huomaa, että tämä on tarpeen vain päivitettäessä uusille tasoille, jotka sisältävät muutoksia salaisten chatien toteutuksessa (esim. sinun ei tarvitse tehdä tätä, Kun asiakas päivitetään kerroksesta 46 kerrokseen 47).