Plus de télégrammes secrets

Tout le monde est habitué à considérer les télégrammes comme un moyen fiable et sûr d'envoyer des messages de toute nature. Cependant, sous le capot, il a une combinaison tout à fait ordinaire de cryptage a et symétrique, ce qui n'est pas du tout intéressant. Et à la fin, pourquoi devriez-vous confier explicitement vos messages à un tiers?
CAPA par Antonio Prohías
TL; DR - inventez un canal caché privé grâce au blocage mutuel des utilisateurs.


Chaîne cachée


Il existe de nombreuses solutions de contournement pour le transfert de données entre deux utilisateurs, en évitant les contacts explicites. Vous pouvez utiliser des intermédiaires, la cryptographie et la stéganographie, des réseaux de relais de diffusion et d'autres modules complémentaires sur les protocoles existants. Mais il est parfois utile de pouvoir prendre contact en utilisant uniquement les capacités officielles déclarées. Autrement dit, organiser une chaîne secrète .


Un exemple simple et compréhensible d'un canal caché pour un lecteur russophone est une fleur dans la fenêtre d'apparition de dix-sept moments du printemps. En soi, il peut se tenir debout ou ne pas se tenir debout sur la fenêtre - une telle symbiose est tout à fait normale et ne parle que de l'amour du propriétaire de l'appartement pour les fleurs. Seule une interprétation prédéterminée distingue les informations transmises par un éclaireur de celles obtenues par un passant aléatoire.


Fleur dans la fenêtre


Télégramme de canaux de fenêtre


Pour organiser votre chaîne cachée selon un tel exemple, seulement deux choses sont conceptuellement nécessaires: une fenêtre et une fleur. La fenêtre décrit l'objet disponible pour changer et déterminer l'état, et la fleur décrit les valeurs possibles et la méthode pour les changer.


Qu'est-ce qu'une Alice peut changer dans un télégramme, qui peut être consulté par un certain Bob? Oui, beaucoup de choses: avatars, noms d'utilisateur, heure de la dernière visite et bien plus encore. Cependant, ils sont généralement disponibles pour tout le monde immédiatement, ce qui limite la confidentialité d'un éventuel dialogue - toute personne connaissant la méthode de transmission pourra écouter les messages envoyés. Curieusement, cette restriction peut être contournée sans recourir à la cryptographie.


Liste noire


Chaque utilisateur a sa propre liste noire unique, et si le lecteur y est allé au moins une fois, il aurait dû remarquer que la date de la dernière visite du délinquant est passée à "vue pour la dernière fois il y a longtemps" avec un avatar vide. En fait, l'utilisateur pouvait être en ligne il y a au moins une seconde et changer une centaine de scellés dans son profil, mais l'API Telegram ne renvoie tout simplement pas ces données à l'application. Ainsi, il protège votre vie personnelle des personnes indésirables, en retour leur faisant comprendre qu'elles sont bloquées.


Alors, quel est le résultat de la chose commune entre la fleur dans la fenêtre et être dans la liste de blocage? Cela et un autre peuvent être vérifiés à un certain moment, après avoir reçu un bit d'information selon que vous êtes dans la liste noire ou non. Un bonus supplémentaire est le fait que les télégrammes ne stockent probablement pas dans leurs journaux (et s'ils le font, alors pas longtemps uniquement à des fins de journalisation) l'historique des blocages des utilisateurs.


Organisez les battements


La capacité de transmettre et de recevoir des bits est, bien sûr, bonne, mais vous devez toujours décrire un mécanisme à part entière pour son fonctionnement. Telegram n'envoie pas de notifications aux utilisateurs lorsqu'ils sont ajoutés à la liste noire, la réception de chaque bit doit donc être initiée par le destinataire (Bob) et ne pas dépendre de l'expéditeur (Alice). Il s'ensuit également qu'Alice et Bob doivent répondre aux demandes avec la même fréquence, de sorte que chaque cycle d'horloge de l'expéditeur correspond à un cycle d'horloge du destinataire.


L'algorithme d'échange lui-même sur chaque mesure ressemble à ceci:


  • A vérifie le bit envoyé et, s'il est nécessaire d'envoyer un signal, alors, en fonction de sa valeur:
    • A -> T: bloc B;
    • A -> T: déverrouillez B.
  • B obtient un peu:
    • B -> T: demande de l'utilisateur A;
    • T -> B: informations disponibles sur A;
    • B: vérifie si les informations reçues ont le statut:
      • B: s'il y a -> il n'est pas bloqué et a reçu 0
      • B: sinon -> il est bloqué et reçu 1

La plupart des processeurs utilisateur modernes ont de bons générateurs de fréquence intégrés (au moins l'horloge système), de sorte que les horloges peuvent être synchronisées avec elles sans utiliser le canal de données lui-même. Il convient de noter que les demandes à l'API de télégramme sont réseau et ne se précipitent pas pour fonctionner rapidement, ce qui n'aide pas le fait de son blocage en Fédération de Russie et la nécessité d'utiliser des procurations. Mais la durée du cycle devrait en moyenne dépasser le temps nécessaire pour répondre à ces demandes, de sorte que la fréquence et la vitesse de transfert des données sont extrêmement faibles.


Nous encodons des messages


Les textes en langage naturel ont une redondance assez élevée, donc les messages reçus avec des erreurs seront toujours souvent compréhensibles pour les humains. Et comme le télégramme est toujours un messager, malgré les tentatives de lui attacher toutes sortes de gadgets graphiques-audio-vidéo, la correction d'erreur peut être négligée, limitant les données transmises aux messages texte.


En raison du faible débit du canal caché, vous devez utiliser le codage le plus efficace pour les messages possibles. Heureusement, le nom du messager nous rappelle l'époque où de tels problèmes étaient monnaie courante.


Par conséquent, alors qu'au XXIe siècle, nous coderons les textes avec l'une des méthodes les plus efficaces à la disposition des télégraphistes il y a un siècle - le code Bodo . Plus précisément, sa dernière variation de ITA-2 a été écrite par Murray pour effectuer moins d'appels API sur les personnages courants. Vous pouvez vous plaindre du manque de la langue russe, mais à mon avis, la translittération est un moyen plus simple que le sacrifice de caractères supplémentaires à n'importe quel Yu et Sch .


Il ne reste plus qu'à déterminer le début et la fin de chaque session de transfert de données, afin que le côté récepteur parmi le grand flux puisse mettre en évidence les messages qui lui sont transmis. Avant le début du transfert, Bob est sur liste noire ou à l'extérieur. Puis Alice signale le début du transfert, changeant cet état d'un battement à l'opposé. À la fin du programme, elle déverrouille simplement Bob. Il continue de recevoir des caractères nuls jusqu'à ce qu'il se soit accumulé suffisamment pour indiquer de manière fiable la fin de la transmission.


Sur la chronologie


L'inconvénient de cette approche est l'impossibilité pratique de se connecter (plus précisément, vous pouvez vous connecter, mais vous devez bricoler avec une correction d'erreur manuelle) à la diffusion et à la séparation en cours des caractères zéro reçus par erreur des caractères réellement transmis. Cependant, c'est déjà un problème d'implémentation.


Haute technologie


Après plusieurs heures à essayer d'utiliser la bibliothèque officielle pour interagir avec l'API, j'ai craché et écrit tout ce dont j'avais besoin en python en utilisant un téléthon plus humain. L'auteur présente même l'API dans un style synchrone, qui pour une raison quelconque est devenu une terrible rareté. J'ai dû écrire l'encodage des messages en utilisant ITA-2 moi-même sur mon genou, car je n'ai vraiment rien trouvé de prêt.


La synchronisation des fréquences se produit sur l'horloge système (et oui, le programme s'endort! À intervalles), ce qui est assez précis si vous prenez en compte le temps nécessaire pour terminer les requêtes API, qui est stable pendant plus d'un dixième de seconde. L'utilisateur peut régler la vitesse de transmission comme il le souhaite, cependant, j'utilise le principe «plus de requêtes par seconde» pour éviter à la fois les erreurs et le gel des spams avec le même type de requête. Telegram, en général, s'est avéré très difficile à utiliser son API, gelant l'accès au compte via un jour, même avec seulement trois autorisations (en outre, réussies) d'affilée, ainsi que des verrous aléatoires à court terme pour des raisons inconnues.


Si les utilisateurs échangent des télégrammes via un canal caché, ils n'ont pas vraiment besoin d'une interface graphique. Oui et pas partout où il se trouve, il a donc écrit l'utilitaire de console habituel. Il vous permet d'attendre et de recevoir un message à l'ID utilisateur spécifié en une seule fois, ou de l'envoyer en lisant les arguments de la ligne de commande. Personne, bien sûr, n'interdit d'utiliser plusieurs canaux à la fois, et aussi de recevoir et de transmettre des messages en parallèle, il vous suffit d'exécuter plusieurs instances en parallèle.


Exemple d'utilisation


Pour l'utiliser, vous devez obtenir votre api_id et api_hash du télégramme conformément à cette instruction et définir les valeurs reçues dans le fichier 'covertele.py'. Les arguments de la ligne de commande indiquent l'action souhaitée, son identifiant, l'identifiant du destinataire, ainsi que le message à transmettre s'il s'agit de l'expéditeur. Tout ressemble à ceci:


 :  : 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 texte est décodé automatiquement, mais les fans qui recherchent des erreurs à la main, lisent en déplacement et suivent la progression peuvent tout faire en utilisant la sortie des codes envoyés et reçus.


Si quelqu'un le souhaite, vous pouvez également utiliser l'API simple fournie:


 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]) 

Au-delà du télégramme


Il est clair qu'un tel canal peut être organisé au-dessus de n'importe quel messager dans lequel il existe une méthode pour déterminer si d'autres utilisateurs se bloquent. Dans le même temps, des interfaces similaires sont facilement implémentées et remplacées de manière similaire dans le code. Donc, s'il y a un désir - vous pouvez utiliser le codage fini, et non pas écrire à partir de zéro. Heureusement, un python lent est peu susceptible d'interférer avec la transmission bit par bit à de telles vitesses.


PS Un merci spécial à ma passion pour l'amour de me jeter en cas d'urgence.


Source: https://habr.com/ru/post/fr451954/


All Articles