Todos están acostumbrados a pensar en los telegramas como un medio confiable y seguro para enviar mensajes de cualquier tipo. Sin embargo, bajo el capó, tiene una combinación completamente normal de cifrado simétrico y, lo que no es nada interesante. Y al final, ¿por qué debería confiar explícitamente sus mensajes a un tercero?

TL; DR: inventa un canal privado oculto a través de usuarios que se bloquean entre sí.
Canal oculto
Existen muchas soluciones alternativas para transferir datos entre dos usuarios, evitando el contacto explícito. Puede utilizar intermediarios, criptografía y esteganografía, redes de retransmisión y otros complementos sobre los protocolos existentes. Pero a veces es útil poder contactar utilizando solo las capacidades oficiales declaradas. Es decir, organizar un canal secreto .
Un ejemplo simple y comprensible de un canal oculto para un lector de habla rusa es una flor en la ventana de aparición de diecisiete momentos de la primavera. Por sí solo, puede pararse o no en la ventana; tal simbiosis es completamente normal y solo habla del amor del dueño del apartamento por las flores. Solo una interpretación predeterminada distingue la información transmitida por un explorador de la obtenida por un transeúnte aleatorio.

Telegrama de canales de ventana de flor
Para organizar su canal oculto de acuerdo con este ejemplo, solo se necesitan conceptualmente dos cosas: una ventana y una flor. La ventana describe el objeto disponible para cambiar y determinar el estado, y la flor describe los posibles valores y el método para cambiarlos.
¿Qué es lo que Alice puede cambiar en un telegrama, que está disponible para ver a cierto Bob? Sí, muchas cosas: avatares, nombres de usuario, hora de la última visita y mucho más. Sin embargo, generalmente están disponibles para todos de inmediato, lo que limita la privacidad de un posible diálogo: cualquier persona con conocimiento del método de transmisión podrá escuchar los mensajes enviados. Por extraño que parezca, esta restricción se puede eludir sin el uso de la criptografía.
En la lista negra
Cada usuario tiene su propia lista negra única, y si el lector ha visitado al menos una vez, debería haber notado que la fecha de la última visita del delincuente cambió a "visto por última vez hace mucho tiempo" junto con un avatar vacío. De hecho, el usuario podría estar en línea hace al menos un segundo y cambiar cien sellos en su perfil, pero la API de Telegram simplemente no devuelve estos datos a la aplicación. Por lo tanto, protege su vida personal de personas no deseadas, haciéndoles comprender que están bloqueados.
Entonces, ¿cuál es el resultado de lo común entre la flor en la ventana y estar en la lista de bloqueo? Tanto eso como otro pueden verificarse en un momento determinado, habiendo recibido un bit de información dependiendo de si estás en la lista negra o no. Una ventaja adicional es el hecho de que los telegramas probablemente no se almacenan en sus registros (y si lo hacen, no por mucho tiempo solo para fines de registro) el historial de bloqueo de los usuarios de los demás.
Organiza los latidos
La capacidad de transmitir y recibir bits es, por supuesto, buena, pero aún debe describir un mecanismo completo para su funcionamiento. Telegram no envía notificaciones a los usuarios cuando se agregan a la lista negra, por lo que la recepción de cada bit debe ser iniciada por el destinatario (Bob) y no depender del remitente (Alice). También se deduce que Alice y Bob deben cumplir las solicitudes con la misma frecuencia, de modo que cada ciclo de reloj del remitente corresponde a un ciclo de reloj del destinatario.
El algoritmo de intercambio en cada medida se ve así:
- A comprueba el bit que se envía y, si es necesario enviar una señal, según su valor:
- A -> T: bloque B;
- A -> T: desbloquear B.
- B se pone un poco:
- B -> T: solicitud del usuario A;
- T -> B: información disponible sobre A;
- B: comprueba si la información recibida tiene el estado:
- B: si hay -> no está bloqueado y recibió 0
- B: si no -> está bloqueado y recibido 1
La mayoría de los procesadores de usuario modernos tienen buenos generadores de frecuencia incorporados (al menos el reloj del sistema), por lo que los relojes pueden sincronizarse con ellos sin usar el canal de datos en sí. Vale la pena señalar que las solicitudes a la API de telegramas son de red y no se apresuran a trabajar rápidamente, lo que no ayuda al hecho de su bloqueo en la Federación de Rusia y la necesidad de usar proxies. Pero la duración del ciclo debe exceder en promedio el tiempo requerido para completar estas solicitudes, por lo que la frecuencia y la velocidad de la transferencia de datos son extremadamente pequeñas.
Codificamos mensajes
Los textos en lenguaje natural tienen una redundancia bastante alta, por lo que los mensajes recibidos con errores a menudo serán entendibles para los humanos. Y dado que Telegram sigue siendo un mensajero, a pesar de los intentos de adjuntarle todo tipo de dispositivos de gráficos, audio y video, la corrección de errores puede descuidarse, limitando los datos transmitidos a mensajes de texto.
Debido al bajo rendimiento del canal secreto, debe usar la codificación más eficiente para los posibles mensajes. Afortunadamente, el nombre del mensajero nos recuerda los tiempos en que tales problemas eran comunes.
Por lo tanto, mientras estamos en el siglo XXI, codificaremos los textos con uno de los métodos más efectivos disponibles para los telegrafistas hace un siglo: el código Bodo . Más precisamente, su última variación de ITA-2 fue creada por Murray para hacer menos llamadas a la API en caracteres comunes. Puede quejarse de la falta del idioma ruso, pero en mi opinión, la transliteración es una forma más simple que el sacrificio de caracteres adicionales a cualquier Yu y Sch .
Solo queda determinar el comienzo y el final de cada sesión de transferencia de datos, de modo que el lado receptor entre la secuencia grande pueda resaltar los mensajes que se le transmiten. Antes de que comience la transferencia, Bob está en la lista negra o afuera. Entonces Alice señala el comienzo de la transferencia, cambiando este estado por un latido al opuesto. Al final del programa, ella simplemente desbloquea a Bob. Continúa recibiendo caracteres nulos hasta que se haya acumulado lo suficiente como para indicar de manera confiable el final de la transmisión.

La desventaja de este enfoque es la imposibilidad práctica de conectarse (más precisamente, puede conectarse, pero tiene que jugar con la corrección manual de errores) a la transmisión en curso y la separación de los caracteres cero recibidos erróneamente de los realmente transmitidos. Sin embargo, esto ya es un problema de implementación.
Alta tecnología
Después de varias horas de intentar usar la biblioteca oficial para interactuar con la API, escupí y escribí todo lo que necesitaba en Python usando un Telethon más humano. El autor incluso presenta la API en un estilo sincrónico, que por alguna razón se ha convertido en una rareza terrible. Tuve que escribir la codificación de mensajes usando ITA-2 sobre mi rodilla, ya que realmente no encontré nada listo.
La sincronización de frecuencia ocurre en el reloj del sistema (y sí, ¡el programa duerme! En intervalos), que son bastante precisos si se tiene en cuenta el tiempo necesario para completar las solicitudes de API, que es estable durante más de una décima de segundo. El usuario puede establecer la velocidad de transmisión que desee, sin embargo, utilizo el principio de "no más solicitudes por segundo" para evitar errores y congelar el correo no deseado con el mismo tipo de solicitud. Telegram, en general, resultó ser muy exigente con el uso de su API, bloqueando el acceso a la cuenta a través de ella durante un día incluso con solo tres autorizaciones (además, exitosas) seguidas, así como bloqueos aleatorios a corto plazo por razones desconocidas.
Si los usuarios intercambian telegramas a través de un canal oculto, entonces realmente no necesitan una interfaz gráfica. Sí y no en todas partes donde está, por lo tanto, escribió la utilidad de consola habitual. Le permite esperar y recibir un mensaje con la ID de usuario especificada en una ejecución, o enviarlo leyendo los argumentos de la línea de comandos. Nadie, por supuesto, prohíbe el uso de varios canales a la vez, y también recibe y transmite mensajes en paralelo, solo necesita ejecutar varias instancias en paralelo.
Ejemplo de uso
Para usarlo, debe obtener su api_id y api_hash del telegrama de acuerdo con esta instrucción y establecer los valores recibidos en el archivo 'covertele.py'. Los argumentos de la línea de comando indican la acción deseada, su identificador, el identificador del destinatario, así como el mensaje que se transmitirá si es el remitente. Todo se parece a esto:
: : 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!..
El texto se decodifica automáticamente, pero los fanáticos que buscan errores a mano, leen sobre la marcha y realizan un seguimiento del progreso pueden hacerlo utilizando la salida de los códigos enviados y recibidos.
Si alguien quiere, también puede usar la API simple proporcionada:
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])
Más allá del telegrama
Está claro que dicho canal se puede organizar sobre cualquier mensajero en el que haya un método para determinar si otros usuarios se bloquean. Al mismo tiempo, interfaces similares se implementan fácilmente y se sustituyen de manera similar en el código. Entonces, si hay un deseo, puede usar el acabado y no escribir codificación, etc. desde cero. Afortunadamente, es poco probable que una pitón lenta interfiera con la transmisión en bits a tales velocidades.
PD: Un agradecimiento especial a mi pasión por el amor de lanzarme en una emergencia.