Jeder ist es gewohnt, Telegramme als zuverlässiges und sicheres Medium für das Versenden von Nachrichten jeglicher Art zu betrachten. Unter der Haube hat er jedoch eine ganz normale Kombination aus a- und symmetrischer Verschlüsselung, was überhaupt nicht interessant ist. Und warum sollten Sie Ihre Nachrichten letztendlich explizit einem Dritten anvertrauen?

TL; DR - erfinden einen privaten versteckten Kanal durch Benutzer, die sich gegenseitig blockieren.
Versteckter Kanal
Es gibt viele Problemumgehungen für die Übertragung von Daten zwischen zwei Benutzern, um expliziten Kontakt zu vermeiden. Sie können Intermediäre, Krypto und Steganografie, Broadcast-Relay-Netzwerke und andere Add-Ons über vorhandene Protokolle verwenden. Manchmal ist es jedoch nützlich, nur mit den offiziell deklarierten Funktionen Kontakt aufnehmen zu können. Das heißt, organisieren Sie einen verdeckten Kanal .
Ein einfaches und verständliches Beispiel für einen versteckten Kanal für einen russischsprachigen Leser ist eine Blume im Erscheinungsfenster von siebzehn Frühlingsmomenten. An sich kann es entweder am Fenster stehen oder nicht - eine solche Symbiose ist völlig normal und spricht nur von der Liebe des Wohnungseigentümers zu Blumen. Nur eine vorgegebene Interpretation unterscheidet die von einem Scout übertragenen Informationen von denen, die ein zufälliger Passant erhalten hat.

Telegramm der Blumenfensterkanäle
Um Ihren versteckten Kanal nach einem solchen Beispiel zu organisieren, werden konzeptionell nur zwei Dinge benötigt: ein Fenster und eine Blume. Das Fenster beschreibt das Objekt, das zum Ändern und Bestimmen des Status verfügbar ist, und die Blume beschreibt die möglichen Werte und die Methode zum Ändern dieser Zustände.
Was kann eine Alice in einem Telegramm ändern, das einem bestimmten Bob angezeigt werden kann? Ja, viele Dinge: Avatare, Benutzernamen, Zeit des letzten Besuchs und vieles mehr. Sie stehen jedoch in der Regel sofort jedem zur Verfügung, was die Privatsphäre eines möglichen Dialogs einschränkt. Jeder, der die Übertragungsmethode kennt, kann die gesendeten Nachrichten abhören. Seltsamerweise kann diese Einschränkung ohne Verwendung von Kryptographie umgangen werden.
Auf die schwarze Liste gesetzt
Jeder Benutzer hat seine eigene eindeutige schwarze Liste, und wenn der Leser mindestens einmal darauf war, sollte er bemerkt haben, dass sich das Datum des letzten Besuchs des Täters zusammen mit einem leeren Avatar in "zuletzt vor langer Zeit gesehen" geändert hat. Tatsächlich könnte der Benutzer vor mindestens einer Sekunde online sein und hundert Siegel in seinem Profil ändern, aber die Telegramm-API gibt diese Daten einfach nicht an die Anwendung zurück. Auf diese Weise wird Ihr persönliches Leben vor unerwünschten Personen geschützt, sodass diese verstehen, dass sie blockiert sind.
Was ist das Ergebnis der Gemeinsamkeit zwischen der Blume im Fenster und der Sperrliste? Sowohl das als auch ein anderes können zu einem bestimmten Zeitpunkt überprüft werden, nachdem Sie eine Information erhalten haben, je nachdem, ob Sie auf der schwarzen Liste stehen oder nicht. Ein zusätzlicher Bonus ist die Tatsache, dass Telegramme höchstwahrscheinlich nicht in ihren Protokollen gespeichert werden (und wenn dies der Fall ist, dauert es nur zu Protokollierungszwecken nicht lange), dass die Benutzer des jeweils anderen blockiert wurden.
Organisieren Sie die Beats
Die Fähigkeit, Bits zu senden und zu empfangen, ist natürlich gut, aber dennoch müssen Sie einen vollwertigen Mechanismus für seinen Betrieb beschreiben. Das Telegramm sendet keine Benutzerbenachrichtigungen, wenn sie zur schwarzen Liste hinzugefügt werden. Daher muss der Empfang jedes Bits vom Empfänger (Bob) initiiert werden und darf nicht vom Absender (Alice) abhängen. Daraus folgt auch, dass Alice und Bob Anforderungen mit derselben Frequenz erfüllen müssen, so dass jeder Taktzyklus des Absenders einem Taktzyklus des Empfängers entspricht.
Der Austauschalgorithmus selbst für jede Kennzahl sieht folgendermaßen aus:
- A prüft das gesendete Bit und, falls ein Signal gesendet werden muss, abhängig von seinem Wert:
- A -> T: Block B;
- A -> T: entsperren B.
- B bekommt ein bisschen:
- B -> T: Benutzer Eine Anfrage;
- T -> B: verfügbare Informationen über A;
- B: prüft, ob die empfangenen Informationen den Status haben:
- B: Wenn es -> gibt, wird es nicht blockiert und 0 empfangen
- B: wenn nicht -> wird es gesperrt und empfangen 1
Die meisten modernen Benutzerprozessoren verfügen über gut eingebaute Frequenzgeneratoren (zumindest die Systemuhr), sodass die Uhren mit ihnen synchronisiert werden können, ohne den Datenkanal selbst zu verwenden. Es ist erwähnenswert, dass die Anforderungen an die Telegramm-API netzwerkbezogen sind und nicht schnell funktionieren, was nicht dazu beiträgt, dass sie in der Russischen Föderation blockiert werden und Proxys verwendet werden müssen. Die Zykluslänge sollte jedoch im Durchschnitt die zum Abschließen dieser Anforderungen erforderliche Zeit überschreiten, sodass die Häufigkeit und Geschwindigkeit der Datenübertragung äußerst gering sind.
Wir verschlüsseln Nachrichten
Texte in natürlicher Sprache weisen eine relativ hohe Redundanz auf, sodass fehlerhaft empfangene Nachrichten für den Menschen häufig noch verständlich sind. Und da das Telegramm trotz der Versuche, alle Arten von Grafik-Audio-Video-Geräten daran anzuhängen, immer noch ein Messenger ist, kann die Fehlerkorrektur vernachlässigt werden, wodurch die übertragenen Daten auf Textnachrichten beschränkt werden.
Aufgrund des geringen Durchsatzes des verdeckten Kanals müssen Sie die effizienteste Codierung für mögliche Nachrichten verwenden. Glücklicherweise erinnert uns der Name des Boten an die Zeiten, als solche Probleme an der Tagesordnung waren.
Daher werden wir im 21. Jahrhundert Texte mit einer der effektivsten Methoden codieren, die Telegraphen vor einem Jahrhundert zur Verfügung standen - dem Bodo-Code . Genauer gesagt wurde seine neueste Variante von ITA-2 von Murray verfasst, um weniger API-Aufrufe für häufig vorkommende Charaktere durchzuführen. Sie können sich über das Fehlen der russischen Sprache beschweren, aber meiner Meinung nach ist die Transliteration ein einfacherer Weg als das Opfer zusätzlicher Zeichen für Yu und Sch .
Es bleibt nur der Beginn und das Ende jeder Datenübertragungssitzung zu bestimmen, damit die empfangende Seite unter dem großen Strom die an sie übertragenen Nachrichten hervorheben kann. Bevor die Übertragung beginnt, wird Bob entweder auf die schwarze Liste gesetzt oder außerhalb. Dann signalisiert Alice den Beginn der Übertragung und ändert diesen Zustand um einen Schlag in die entgegengesetzte Richtung. Am Ende des Programms schaltet sie Bob einfach frei. Es empfängt weiterhin Nullzeichen, bis es sich genug angesammelt hat, um das Ende der Übertragung zuverlässig anzugeben.

Der Nachteil dieses Ansatzes ist die praktische Unmöglichkeit der Verbindung (genauer gesagt, Sie können eine Verbindung herstellen, aber Sie müssen an der manuellen Fehlerkorrektur basteln) zur laufenden Übertragung und Trennung von fälschlicherweise empfangenen Nullzeichen von den tatsächlich übertragenen Zeichen. Dies ist jedoch bereits ein Implementierungsproblem.
Hightech
Nachdem ich mehrere Stunden lang versucht hatte, die offizielle Bibliothek für die Interaktion mit der API zu verwenden, spuckte ich alles aus, was ich in Python brauchte, und schrieb es mit einem humaneren Telethon. Der Autor präsentiert die API sogar synchron, was aus irgendeinem Grund zu einer schrecklichen Seltenheit geworden ist. Ich musste die Kodierung von Nachrichten mit ITA-2 selbst auf mein Knie schreiben, da ich nichts wirklich bereit fand.
Die Frequenzsynchronisation erfolgt auf der Systemuhr (und ja, das Programm schläft! In Intervallen). Dies ist ziemlich genau, wenn Sie die erforderliche Zeit zum Abschließen von API-Anforderungen berücksichtigen, die länger als eine Zehntelsekunde stabil ist. Der Benutzer kann die Übertragungsgeschwindigkeit so einstellen, wie er möchte. Ich verwende jedoch das Prinzip "Keine Anfragen mehr pro Sekunde", um sowohl Fehler als auch das Einfrieren von Spam mit derselben Art von Anfrage zu vermeiden. Telegramm erwies sich im Allgemeinen als sehr wählerisch bei der Verwendung seiner API und sperrte den Zugriff auf das Konto über das Konto für einen Tag ein, selbst mit nur drei Berechtigungen (darüber hinaus erfolgreich) hintereinander sowie zufälligen kurzfristigen Sperren aus unbekannten Gründen.
Wenn Benutzer Telegramme über einen versteckten Kanal austauschen, benötigen sie keine grafische Oberfläche. Ja und nicht überall, wo er ist, schrieb er das übliche Konsolendienstprogramm. Sie können in einem Durchgang warten und eine Nachricht mit der angegebenen Benutzer-ID empfangen oder durch Lesen aus den Befehlszeilenargumenten senden. Natürlich verbietet niemand die gleichzeitige Verwendung mehrerer Kanäle sowie das parallele Empfangen und Senden von Nachrichten. Sie müssen lediglich mehrere Instanzen parallel ausführen.
Anwendungsbeispiel
Zur Verwendung müssen Sie Ihre api_id und api_hash gemäß dieser Anweisung aus dem Telegramm abrufen und die empfangenen Werte in der Datei 'covertele.py' festlegen. Die Befehlszeilenargumente geben die gewünschte Aktion, ihre Kennung, Empfängerkennung sowie die zu sendende Nachricht an, wenn es sich um den Absender handelt. Es sieht alles ungefähr so aus:
: : 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!..
Der Text wird automatisch dekodiert, aber Fans, die Fehler von Hand suchen, unterwegs lesen und den Fortschritt verfolgen, können dies alles mithilfe der Ausgabe von gesendeten und empfangenen Codes tun.
Wenn jemand möchte, können Sie auch die einfach bereitgestellte API verwenden:
from covertele import TelegramBlockingAPI from cochannel import CovertChannel friend = input(" :") # # , -, id = input(" :") api = TelegramBlockingAPI(id) # friend = input("Enter your friend's id:") channel = CovertChannel(api, friend) # channel.receive() channel.send() channel.send("Bork, bork!") print(channel.receive) # , _raw codes = channel.receive_raw() for code in codes: check(code) channel.send_raw([19, 24, 24, 13])
Jenseits des Telegramms
Es ist klar, dass ein solcher Kanal über jedem Messenger organisiert werden kann, in dem es eine Methode gibt, um festzustellen, ob andere Benutzer sich selbst blockieren. Gleichzeitig lassen sich ähnliche Schnittstellen einfach implementieren und auf ähnliche Weise in den Code einsetzen. Wenn es also einen Wunsch gibt, können Sie die fertige verwenden und keine Codierung usw. von Grund auf neu schreiben. Glücklicherweise ist es unwahrscheinlich, dass eine langsame Python die bitweise Übertragung bei solchen Geschwindigkeiten stört.
PS Besonderer Dank geht an meine Leidenschaft für die Liebe, mich im Notfall zu werfen.