Nous avions l'habitude de considérer Telegram comme un moyen de transmission fiable et sécurisé pour les messages de toutes sortes. Mais sous le capot, il a une combinaison plutôt commune de cryptages a et symétriques. Où est-ce amusant là-dedans? Et de toute façon, pourquoi quelqu'un confierait-il ses messages au tiers?

TL; DR - inventer un canal secret privé sur les utilisateurs qui se bloquent mutuellement.
Chaînes secrètes
Il existe de nombreuses solutions de contournement pour transmettre des données entre deux utilisateurs en évitant tout contact direct. Vous pouvez utiliser des intermédiaires, des méthodes de cryptographie et de stéganographie, des réseaux de relais de diffusion et d'autres extensions de protocoles existants. Mais parfois, il est utile de pouvoir établir un contact sécurisé en utilisant uniquement des fonctionnalités officiellement documentées. Ou, comme il faut le dire, créez un canal secret .
Nous pouvons en voir un exemple dans un film d'espionnage soviétique "Seventeen Moments of Spring" (celui-ci est, comme, vraiment bon, essayez de le regarder). Dans ce document, une fleur dans la fenêtre de la maison sûre a été utilisée pour signaler si l'espion avait échoué ou non. La fleur en soi ne veut rien dire: elle peut être là et ne peut pas l'être, une telle symbiose est une chose courante et ne fait que nous parler de l'amour du propriétaire pour les fleurs. Seule une interprétation prédéterminée distingue les informations reçues par un espion de celles reçues par un passant aléatoire.

Canaux basés sur les fleurs dans la fenêtre dans Telegram
Pour organiser votre propre chaîne secrète selon le même principe, vous n'aurez besoin que de deux choses: une fenêtre et une fleur. La fenêtre représente un objet dont vous pouvez changer l'état de vue des autres et la fleur - des états possibles et une façon de les changer.
Alors qu'est-ce qu'Alice pourrait changer dans Telegram que Bob puisse voir? Beaucoup de choses, en fait: avatars, noms d'utilisateur, heure de la dernière visite et plus encore. Mais généralement, ces choses sont accessibles à tous en même temps, ce qui limite la confidentialité des dialogues - si l'on possède la méthode de transition, il pourrait lire tout ce qu'Alice envoie. Étonnamment, il est possible de contourner cette limitation sans aucun type de cryptage impliqué.
Je te bloque, haha
Chaque utilisateur a sa propre liste noire, et si le lecteur était assez ennuyeux, il aurait dû remarquer après avoir été bloqué que son statut de `` dernière visite '' qui n'était pas déjà un ami était devenu `` vu pour la dernière fois il y a longtemps ''. La vérité est qu'il aurait pu être en ligne il y a quelques secondes ou même être en ce moment, mais l'API Telegram n'enverra plus ces informations à votre application. De cette façon, il protège la vie privée des autres utilisateurs contre les indésirables. En échange, ils peuvent voir s'ils sont sur liste noire ou non.
Alors qu'est-ce que voir une fleur et être bloqué ont en commun? Les deux pourraient être vérifiés à un moment donné, ce qui permet de recevoir un bit d'information selon que vous êtes bloqué ou non. Un autre avantage est le fait que Telegram ne stocke probablement pas de journaux d'utilisateurs se bloquant les uns les autres (tout au plus pour de courtes périodes à des fins de journalisation).
Organiser les bits
La possibilité d'envoyer et de recevoir des bits est amusante et tout, mais nous devons encore décrire son mécanisme d'exploitation. Le télégramme refuse de vous remarquer lorsqu'il est bloqué, donc chaque action `` recevoir un bit '' doit être initialisée par le destinataire (appelons-le Bob) et ne pas dépendre de l'expéditeur (et elle sera Alice), c'est-à-dire indépendante. Il s'ensuit également qu'Alice et Bob devraient faire des demandes à la même fréquence.
L'algorithme d'échange de bits sur chaque horloge ressemble à ceci:
- A vérifie l'envoi d'un bit et si a différent de la valeur précédente en le changeant en fonction d'une valeur:
- A -> T: bloc B si le bit est à 1;
- A -> T: débloquer B si le bit est à 0.
- B reçoit un peu:
- B -> T: résoudre A;
- T -> B: à la disposition de B des informations sur A;
- B: vérifie si les informations reçues ont un statut:
- B: si c'est -> il n'est pas bloqué et le bit est 0
- B: si ce n'est pas -> il est bloqué et le bit est 1
La plupart des PC modernes ont de bons générateurs de fréquence (une horloge système, par exemple) afin que nous puissions synchroniser nos horloges avec eux sans utiliser le canal pour transmettre quoi que ce soit, à l'exception des bits de message. Il convient de noter que les demandes de l'API Telegram, à la fois le (dé) blocage et la résolution du statut utilisateur, sont des appels réseau et n'ont pas tendance à fonctionner rapidement, surtout si vous utilisez des proxys ou VPN. Cela produit une limitation: la longueur de l'horloge doit être plus longue qu'un temps de réponse moyen (car nous devons nous adapter les uns aux autres) et c'est pourquoi notre vitesse de transmission de données sera limitée.
Encodage des messages
Les textes en langues naturelles ont une redondance assez élevée, et les messages reçus avec des erreurs seront toujours principalement lisibles par un humain. Et puisque Telegram est un messager (ignorant certaines choses folles ), nous pouvons négliger la correction d'erreur limitant la transmission possible de données à de simples messages texte.
Notre canal a une bande passante extrêmement faible, alors pourquoi nous devons utiliser le codage de message le plus efficace disponible pour les messages possibles. Heureusement pour nous, le nom du messager rappelle à quel moment ce problème était courant.
C'est pourquoi nous, vivant au 21e siècle, allons coder nos textes avec l'un des encodages les plus efficaces disponibles pour les télégraphes il y a cent ans - le code Baudot . Plus précisément, sa dernière variante ITA-2 créée par Donald Murray pour effectuer moins d'appels API sur les symboles les plus fréquents du langage.
Le seul qui reste pour transmettre un message avec succès est de trouver les limites d'une session de transmission afin que le destinataire puisse en trouver un parmi le flux binaire continu. Avant que la transmission ne commence, Bob est bloqué ou non, et son état ne changera pas de lui-même de sitôt. C'est pourquoi Alice peut signaler le début de la session en la remplaçant par un opposé pour une seule horloge. À la fin de la session, elle le débloquera et repartira en paix. Lui, de l'autre côté, continuera à recevoir zéro bits jusqu'à ce qu'il décide qu'ils ne font pas partie du message - le code Baudot n'a pas de symbole 00000
.

Les inconvénients de la méthode sont une impossibilité pratique de se connecter (vous pouvez, mais cela nécessitera probablement une correction d'erreur manuelle en raison du décalage de bits) à la traduction en cours et un besoin de séparer les symboles nuls reçus avec des erreurs de ceux envoyés. Mais il y a tous les problèmes de mise en œuvre.
Haute technologie
Après plusieurs heures passées à essayer d'utiliser une bibliothèque officielle pour utiliser l'API, je me suis fatigué et j'ai tout écrit avec un Python en utilisant une bibliothèque de téléthon plus conviviale. Il a même une API de style synchrone pour des raisons étranges rares aujourd'hui. Encodage des messages avec ITA-2 que j'ai écrit moi-même car je n'ai rien trouvé d'utile sur Internet.
La synchronisation d'horloge effectuée avec les horloges système (et oui, elle dort () s! Entre les deux) car elle est suffisamment précise compte tenu du temps requis sur chaque appel d'API réseau est plus d'un dixième de seconde dans la plupart des cas. L'utilisateur peut définir la vitesse de transmission comme il le souhaite, mais je recommande de suivre la règle `` pas plus d'une demande par seconde '' si vous ne voulez pas à la fois voir les erreurs de l'autre côté et vous retrouver banni par un système de prévention des inondations. Telegram s'est avéré très pointilleux sur l'utilisation de l'API, gelant mon accès pendant une journée à partir de quelques tentatives d'autorisation simples (réussies!) D'affilée et juste un blocage aléatoire pour une inondation pendant la transmission pour une raison inconnue. Vous devez toujours déclarer vos limites d'utilisation de l'API, les gars.
Si l'utilisateur décide d'utiliser un canal aussi étrange pour échanger des messages, il ne devrait pas se soucier des fonctionnalités de l'interface utilisateur graphique. Et tous les systèmes ne l'ont pas de toute façon, c'est pourquoi j'ai écrit mon application sous la forme d'un outil terminal. Il permet à la fois d'envoyer et de recevoir des messages via un canal par un ID utilisateur donné en arguments de ligne de commande, mais une seule opération par lancement. Bien sûr, personne ne vous limitera à exécuter une seule copie d'un programme à la fois et à utiliser plusieurs canaux simultanément dans les deux sens, vous aurez juste besoin d'exécuter plusieurs copies du même script avec des paramètres différents.
Utiliser les trucs
Vous pouvez en savoir plus sur l'utilisation de cette chose en tant qu'utilitaire de ligne de commande et bibliothèque python3 via l'API sur GitHub (référentiel lié à la fin). Le seul problème est d'acquérir vos propres informations d'identification API (un manuel simple est assez utile) car Telegram ne permet pas de divulguer le mien et de le définir en fonction des valeurs de votre copie locale d'un script. Tout est passé par les arguments de la ligne de commande, à l'exception de la partie autorisation qui, par défaut, a été effectuée via stdio) et ressemble à ceci:
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!..
Le message reçu est décodé automatiquement, mais si vous souhaitez corriger manuellement certaines erreurs ou suivre la progression, vous pouvez le faire en regardant la sortie de la ligne de commande.
En dehors du télégramme
Il convient de noter qu'un tel canal pourrait être mis en œuvre sur n'importe quel réseau de messagerie et / ou social dans lequel on peut détecter s'il est bloqué ou non par d'autres utilisateurs. Des interfaces similaires peuvent être facilement remplacées dans le code existant, donc si vous voulez le faire, utilisez simplement le travail de base. Les faibles performances de python (par rapport à l'habituel pour de telles choses C / ++) ne seront pas un facteur limitant en raison de la faible vitesse de transmission et du temps de réponse des appels API.
PS Merci spécial à l'amour inhabituel de ma passion pour me bloquer