Früher haben wir uns Telegramm als zuverlässiges und sicheres Übertragungsmedium für Nachrichten jeglicher Art vorgestellt. Unter der Haube gibt es jedoch eine ziemlich häufige Kombination von a- und symmetrischen Verschlüsselungen. Wo macht das Spaß? Und warum sollte jemand seinen Nachrichten an Dritte vertrauen?

TL; DR - Erfindung eines privaten verdeckten Kanals über Benutzer, die sich gegenseitig blockieren.
Verdeckte Kanäle
Es gibt viele Problemumgehungen, um Daten zwischen zwei Benutzern zu übertragen und direkten Kontakt zu vermeiden. Sie können Zwischenhändler, Krypto- und Steganografiemethoden, Broadcast-Relay-Netzwerke und andere Erweiterungen vorhandener Protokolle verwenden. Manchmal ist es jedoch nützlich, einen sicheren Kontakt nur mit offiziell dokumentierten Funktionen herzustellen. Oder wie man sagen sollte, richten Sie einen verdeckten Kanal ein .
Wir können ein Beispiel dafür in einem sowjetischen Spionagefilm "Seventeen Moments of Spring" sehen (dieser Film ist wirklich gut, versuchen Sie es zu sehen). Darin wurde eine Blume im Fenster des sicheren Hauses verwendet, um zu signalisieren, ob der Spion seine Mission nicht erfüllt hatte oder nicht. Die Blume an sich bedeutet nichts: Sie kann da sein und könnte es auch nicht sein. Eine solche Symbiose ist eine häufige Sache und erzählt uns nur von der Liebe des Besitzers zu Blumen. Nur eine vorgegebene Interpretation unterscheidet die von einem Spion empfangenen Informationen von den von einem zufälligen Passanten empfangenen.

In-Window Flower-basierte Kanäle im Telegramm
Um Ihren eigenen verdeckten Kanal nach dem gleichen Prinzip zu organisieren, benötigen Sie nur zwei Dinge: ein Fenster und eine Blume. Das Fenster stellt ein Objekt dar, mit dem Sie den von anderen gesehenen Zustand und die Blume ändern können - mögliche Zustände und eine Möglichkeit, sie zu ändern.
Also, was könnte Alice im Telegramm ändern, das Bob sehen kann? Eigentlich viele Dinge: Avatare, Benutzernamen, zuletzt besuchte Zeit und mehr. Aber normalerweise sind diese Dinge für alle gleichzeitig verfügbar, was die Privatsphäre des Dialogs einschränkt. Wenn jemand die Übergangsmethode besitzt, kann er alles lesen, was Alice sendet. Überraschenderweise ist es möglich, diese Einschränkung ohne jegliche Verschlüsselung zu umgehen.
Ich blockiere dich, haha
Jeder Benutzer hat seine eigene schwarze Liste, und wenn der Leser nervig genug war, hätte er nach dem Blockieren feststellen müssen, dass sein Status "Zuletzt besucht", der noch kein Freund war, in "Zuletzt gesehen vor langer Zeit" geändert wurde. Die Wahrheit ist, dass er möglicherweise erst vor wenigen Sekunden online war oder gerade jetzt war, aber die Telegramm-API sendet diese Informationen nicht mehr an Ihre App. Auf diese Weise wird die Privatsphäre anderer Benutzer vor unerwünschten geschützt. Im Gegenzug können sie sehen, ob sie auf der schwarzen Liste stehen oder nicht.
Was haben eine Blume zu sehen und blockiert zu werden gemeinsam? Beide können zu einem bestimmten Zeitpunkt überprüft werden, sodass je nachdem, ob Sie blockiert sind oder nicht, eine Information empfangen werden kann. Ein weiterer Vorteil ist die Tatsache, dass Telegram wahrscheinlich keine Protokolle von Benutzern speichert, die sich gegenseitig blockieren (höchstens für kurze Zeiträume zu Journalzwecken).
Bits organisieren
Die Möglichkeit, Bits zu senden und zu empfangen, macht Spaß, aber wir müssen noch den Ausnutzungsmechanismus beschreiben. Das Telegramm weigert sich, Sie zu bemerken, wenn es blockiert wird. Daher sollte jede Aktion "Empfangsbit" vom Empfänger initialisiert werden (nennen wir ihn Bob) und nicht vom Absender abhängen (und sie wird Alice sein), d. H. Vom unabhängigen Empfänger. Daraus folgt auch, dass Alice und Bob Anfragen mit der gleichen Häufigkeit ausführen sollten.
Der Bitaustauschalgorithmus für jede Uhr sieht folgendermaßen aus:
- A prüft das Senden eines Bits und ändert es je nach Wert, wenn es vom vorherigen Wert abweicht:
- A -> T: Block B, wenn Bit 1 ist;
- A -> T: B entsperren, wenn das Bit 0 ist.
- B erhält ein bisschen:
- B -> T: A auflösen;
- T -> B: verfügbar für B Informationen über A;
- B: prüft, ob die empfangenen Informationen den Status haben:
- B: Wenn es ist -> ist er nicht blockiert und das Bit ist 0
- B: Wenn nicht -> ist er blockiert und das Bit ist 1
Die meisten modernen PCs verfügen über gute Frequenzgeneratoren (z. B. eine Systemuhr), sodass wir unsere Uhren mit ihnen synchronisieren können, ohne den Kanal zum Übertragen von Daten außer den Nachrichtenbits zu verwenden. Es ist nur zu beachten, dass Telegramm-API-Anforderungen, sowohl (un) blockierend als auch auflösend für den Benutzerstatus, Netzwerkanrufe sind und nicht schnell funktionieren, insbesondere wenn Sie Proxys oder VPN verwenden. Dies führt zu einer Einschränkung: Die Taktlänge sollte länger sein als eine durchschnittliche Antwortzeit (da wir ineinander passen müssen), und deshalb wird unsere Datenübertragungsgeschwindigkeit begrenzt.
Nachrichten verschlüsseln
Texte in natürlichen Sprachen weisen eine ziemlich hohe Redundanz auf, und fehlerhaft empfangene Nachrichten können von einem Menschen größtenteils noch gelesen werden. Und da Telegram ein Messenger ist (der einige verrückte Dinge ignoriert), können wir die Fehlerkorrektur vernachlässigen, die die mögliche Übertragung von Daten auf einfache Textnachrichten einschränkt.
Unser Kanal hat eine extrem niedrige Bandbreite, weshalb wir die effektivste verfügbare Nachrichtenkodierung für mögliche Nachrichten verwenden müssen. Glücklicherweise erinnert der Name des Boten an Zeiten, in denen ein solches Problem häufig auftrat.
Deshalb werden wir, die wir im 21. Jahrhundert leben, unsere Texte mit einer der effizientesten Kodierungen verschlüsseln, die Telegraphen vor hundert Jahren zur Verfügung standen - dem Baudot-Code . Genauer gesagt, seine endgültige Variante ITA-2, die von Donald Murray entwickelt wurde , um weniger API-Aufrufe an den häufigsten Symbolen der Sprache durchzuführen.
Die einzige Möglichkeit, eine Nachricht erfolgreich zu übertragen, besteht darin, die Grenzen einer Übertragungssitzung zu finden, damit der Empfänger eine gesendete im kontinuierlichen Bitstrom finden kann. Bevor die Übertragung gestartet wurde, ist Bob entweder blockiert oder nicht, und sein Status ändert sich nicht so schnell von selbst. Aus diesem Grund kann Alice den Sitzungsstart signalisieren, indem sie ihn nur für eine Uhr gegen einen anderen austauscht. Am erfolgreichen Ende der Sitzung wird sie ihn entsperren und mit Frieden gehen. Auf der anderen Seite empfängt er weiterhin Null-Bits, bis entschieden wird, dass sie nicht Teil der Nachricht sind - der Baudot-Code hat kein 00000
Symbol.

Nachteile der Methode sind die praktische Unmöglichkeit, eine Verbindung zur laufenden Übersetzung herzustellen (dies ist möglich, erfordert jedoch wahrscheinlich eine manuelle Fehlerkorrektur aufgrund der Bitverschiebung) und die Notwendigkeit, mit Fehlern empfangene Nullsymbole von den gesendeten zu trennen. Aber es gibt alle Probleme bei der Umsetzung.
Hightech
Nachdem ich mehrere Stunden damit verbracht hatte, eine offizielle Bibliothek zur Verwendung der API zu verwenden, wurde ich müde und schrieb alles mit einem Python unter Verwendung einer menschlicheren Telethon- Bibliothek. Es hat sogar eine synchrone API aus seltsamen Gründen, die heutzutage selten sind. Nachrichtencodierung mit ITA-2 Ich habe selbst geschrieben, da ich im Internet nichts Nützliches gefunden habe.
Die Taktsynchronisation erfolgt mit Systemuhren (und ja, es wird () dazwischen geschlafen!), Da sie genau genug ist, wenn man bedenkt, dass die für jeden Netzwerk-API-Aufruf erforderliche Zeit in den meisten Fällen mehr als eine Zehntelsekunde beträgt. Der Benutzer kann die Übertragungsgeschwindigkeit so einstellen, wie er möchte. Ich empfehle jedoch, die Regel "Nicht mehr als eine Anforderung pro Sekunde" zu befolgen, wenn Sie nicht beide Fehler auf der anderen Seite sehen und sich von einem Hochwasserschutzsystem gesperrt fühlen möchten. Das Telegramm erwies sich als sehr wählerisch in Bezug auf die API-Nutzung. Es sperrte meinen Zugriff für einen Tag nach ein paar einfachen (erfolgreichen!) Autorisierungsversuchen hintereinander und blockierte nur zufällig eine Flut während der Übertragung aus einem unbekannten Grund. Sie sollten immer Ihre API-Nutzungsbeschränkungen angeben, Leute.
Wenn der Benutzer einen so seltsamen Kanal zum Austauschen von Nachrichten verwendet, sollte er sich nicht um Funktionen der grafischen Benutzeroberfläche kümmern. Und nicht alle Systeme haben es sowieso, deshalb habe ich meine Anwendung in Form eines Terminal-Tools geschrieben. Es ermöglicht das Senden und Empfangen von Nachrichten über einen Kanal mit einer in Befehlszeilenargumenten angegebenen Benutzer-ID, jedoch nur mit einer Operation pro Start. Natürlich beschränkt Sie niemand darauf, nur eine Kopie eines Programms gleichzeitig auszuführen und mehrere Kanäle gleichzeitig auf beide Arten zu verwenden. Sie müssen lediglich mehrere Kopien desselben Skripts mit unterschiedlichen Parametern ausführen.
Mit dem Zeug
Weitere Informationen zur Verwendung dieses Dings als Befehlszeilenprogramm und als Python3-Bibliothek finden Sie über die API im GitHub (Repository am Ende verlinkt). Das einzige Problem besteht darin, Ihre eigenen API-Anmeldeinformationen zu erwerben (einfaches Handbuch ist hilfreich genug), da Telegram es nicht zulässt, meine anzugeben und gemäß den Werten in Ihrer lokalen Kopie eines Skripts festzulegen. Alles ging über die Befehlszeilenargumente, mit Ausnahme des Autorisierungsteils, der standardmäßig über das stdio erstellt wurde, und sieht folgendermaßen aus:
For Alice: For Bob: Enter your phone number: XXX | Enter your phone number: XXX Enter auth code: YYY | Enter auth code: YYY Started message transmission... | Listening for the message... ---++ ('O', '9') | ---++ ('O', '9') --+-+ ('H', '#') | --+-+ ('H', '#') +++++ (1, 1) | +++++ (1, 1) --++- ('N', ',') | --++- ('N', ',') --+-- (' ', ' ') | --+-- (' ', ' ') ++-++ (0, 0) | ++-++ (0, 0) --+-+ ('H', '#') | --+-+ ('H', '#') -++-- ('I', '8') | -++-- ('I', '8') --+-- (' ', ' ') | --+-- (' ', ' ') --+++ ('M', '.') | --+++ ('M', '.') ++--- ('A', '-') | ++--- ('A', '-') -+-+- ('R', "'") | -+-+- ('R', "'") ++++- ('K', '(') | ++++- ('K', '(') +++++ (1, 1) | +++++ (1, 1) +-++- ('F', '!') | +-++- ('F', '!') --+++ ('M', '.') | --+++ ('M', '.') --+++ ('M', '.') | --+++ ('M', '.') Done, exiting... | ----- ('', '') | ----- ('', '') | Automatically decoded: OH, HI MARK!..
Die empfangene Nachricht wird automatisch dekodiert. Wenn Sie jedoch einige Fehler manuell korrigieren oder den Fortschritt verfolgen möchten, können Sie dies anhand der Befehlszeilenausgabe tun.
Außerhalb des Telegramms
Es ist zu beachten, dass ein solcher Kanal über jeden Messenger und / oder jedes soziale Netzwerk implementiert werden kann, in dem festgestellt werden kann, ob er von anderen Benutzern blockiert wurde oder nicht. Ähnliche Schnittstellen können im vorhandenen Code leicht ersetzt werden. Wenn Sie dies tun möchten, verwenden Sie einfach meine Grundlagen. Die geringe Leistung von Python (im Vergleich zu C / ++ üblich) ist aufgrund der geringen Übertragungsgeschwindigkeit und der Reaktionszeit von API-Aufrufen kein einschränkender Faktor.
PS Besonderer Dank geht an die ungewöhnliche Liebe meiner Leidenschaft, mich zu blockieren