Solíamos pensar en Telegram como un medio de transmisión confiable y seguro para mensajes de cualquier tipo. Pero bajo el capó, tiene una combinación bastante común de cifrados simétricos y a. ¿Dónde está la diversión en eso? Y de todos modos, ¿por qué alguien confiaría sus mensajes al tercero?

TL; DR: inventar un canal secreto privado sobre usuarios que se bloquean entre sí.
Canales encubiertos
Hay muchas soluciones para transmitir datos entre dos usuarios evitando el contacto directo. Puede usar intermediarios, métodos de criptografía y esteganografía, redes de transmisión de retransmisión y otras extensiones de protocolos existentes. Pero a veces es útil poder establecer un contacto seguro utilizando solo características documentadas oficialmente. O como uno debería decir, configure un canal secreto .
Podemos ver un ejemplo de ello en una película de espías soviética "Diecisiete momentos de la primavera" (esta es, como, realmente buena, intenta verla). En ella, una flor en la ventana de la casa de seguridad se usaba para indicar si el espía había fallado en su misión o no. La flor en sí misma no significa nada: puede estar allí y podría no estar, esa simbiosis es algo común y solo nos dice sobre el amor del dueño por las flores. Solo una interpretación predeterminada distingue la información recibida por un espía de la recibida por un transeúnte aleatorio.

Canales basados en flores en la ventana en Telegram
Para organizar su propio canal secreto por el mismo principio, solo necesitará dos cosas: una ventana y una flor. La ventana representa un objeto que puede cambiar el estado visto por otros y la flor, posibles estados y una forma de cambiarlos.
Entonces, ¿qué podría cambiar Alice en Telegram que Bob pueda ver? Muchas cosas, en realidad: avatares, nombres de usuario, hora de la última visita y más. Pero por lo general, estas cosas están disponibles para todos al mismo tiempo, lo que limita la privacidad del diálogo: si uno posee el método de transición, podría leer cualquier cosa que Alice envíe. Sorprendentemente, es posible evitar esta limitación sin ningún tipo de cifrado involucrado.
Te estoy bloqueando, jaja
Cada usuario tiene su propia lista negra, y si el lector fue lo suficientemente molesto, debería haber notado después de ser bloqueado que su estado de "última visita" que no era un amigo cambió a "visto por última vez hace mucho tiempo". La verdad es que podría haber estado en línea hace unos segundos o incluso estar en este momento, pero la API de Telegram ya no enviará esta información a su aplicación. De esa manera, protege la privacidad de otros usuarios de los no deseados. A cambio, pueden ver si están en la lista negra o no.
Entonces, ¿qué tienen en común ver una flor y ser bloqueada? Ambos se pueden verificar en un momento dado, lo que permite recibir un bit de información dependiendo de si está bloqueado o no. Otra ventaja es el hecho de que Telegram probablemente no almacena registros de usuarios que se bloquean entre sí (a lo sumo por períodos cortos en el diario).
Bits de organización
La posibilidad de enviar y recibir bits es divertida y todo, pero aún necesitamos describir su mecanismo de explotación. Telegram se niega a notarlo cuando está bloqueado, por lo que cada acción de 'recibir bit' debe ser inicializada por el destinatario (llamémoslo Bob) y no depender del remitente (y ella será Alice), es decir, de forma independiente. También se deduce que Alice y Bob deben hacer solicitudes con la misma frecuencia.
El algoritmo de intercambio de bits en cada reloj se ve así:
- A comprueba enviando un bit y si tiene un valor diferente al anterior, cambiándolo dependiendo de un valor:
- A -> T: bloque B si el bit es 1;
- A -> T: desbloquear B si el bit es 0.
- B recibe un poco:
- B -> T: resolver A;
- T -> B: disponible para información de B sobre A;
- B: comprueba si la información recibida tiene un estado:
- B: si es -> no está bloqueado y el bit es 0
- B: si no es -> él está bloqueado y el bit es 1
La mayoría de las PC modernas tienen buenos generadores de frecuencia (un reloj del sistema, por ejemplo) para que podamos sincronizar nuestros relojes con ellos sin utilizar el canal para transmitir nada, excepto los bits de mensaje. Solo vale la pena notar que las solicitudes de API de Telegram, tanto el (des) bloqueo como la resolución del estado del usuario, son llamadas de red y no tienden a funcionar rápidamente, especialmente si está usando proxies o VPN. Esto produce una limitación: la longitud del reloj debe ser más larga que un tiempo de respuesta promedio (ya que necesitamos ajustar uno en el otro) y es por eso que nuestra velocidad de transmisión de datos será limitada.
Codificar mensajes
Los textos en idiomas naturales tienen una redundancia bastante alta, y los mensajes recibidos con errores seguirán siendo legibles en su mayoría por un humano. Y dado que Telegram es un mensajero (ignorando algunas cosas locas ), podemos descuidar la corrección de errores que limita la posible transmisión de datos a mensajes de texto simples.
Nuestro canal tiene un ancho de banda extremadamente bajo, por lo que debemos usar la codificación de mensajes más efectiva disponible para posibles mensajes. Afortunadamente, el nombre del mensajero nos recuerda las veces que ese problema era común.
Es por eso que nosotros, que vivimos en el siglo XXI, codificaremos nuestros textos con una de las codificaciones más eficientes disponibles para los telegrafistas hace cien años: el código Baudot . Más precisamente, su variación final ITA-2 creada por Donald Murray para realizar menos llamadas API en los símbolos más frecuentes del lenguaje.
Lo único que queda para transmitir con éxito un mensaje es encontrar los límites de una sesión de transmisión para que el destinatario pueda encontrar uno enviado entre el flujo continuo de bits. Antes de que comience la transmisión, Bob está bloqueado o no, y su estado no cambia por sí solo en el corto plazo. Es por eso que Alice puede señalar el inicio de la sesión intercambiándola a un opuesto por solo un reloj. Al final exitoso de la sesión, ella lo desbloqueará y se irá con paz. Él, por otro lado, continuará recibiendo cero bits hasta que decida que no son parte del mensaje: el código Baudot no tiene el símbolo 00000
.

Los inconvenientes del método son una imposibilidad práctica de conectarse (puede, pero probablemente requerirá una corrección manual de errores debido al cambio de bits) a la traducción en curso y la necesidad de separar los símbolos nulos recibidos con los errores enviados. Pero hay todos los problemas de implementación.
Alta tecnología
Después de pasar varias horas tratando de usar una biblioteca oficial para usar la API, me cansé y escribí todo con un Python usando una biblioteca de Telethon más amigable para los humanos. Incluso tiene una API de estilo síncrono por algunas extrañas razones raras hoy en día. Codificación de mensajes con ITA-2 que escribí yo mismo, ya que no he encontrado nada útil en Internet.
La sincronización del reloj se realiza con los relojes del sistema (y sí, ¡duerme () s! En el medio) ya que es lo suficientemente preciso teniendo en cuenta que el tiempo requerido en cada llamada API de red es más de una décima de segundo en la mayoría de los casos. El usuario puede establecer la velocidad de transmisión como lo desee, pero le recomiendo seguir la regla de 'no más de una solicitud por segundo' si no desea ver los errores en el otro lado y verse prohibido por un sistema de prevención de inundaciones. Telegram resultó ser muy exigente con el uso de API, bloqueando mi acceso por un día incluso con unos pocos intentos de Autorización simples (¡exitosos!) Seguidos y solo bloqueo aleatorio de una inundación durante la transmisión por una razón desconocida. Siempre deben declarar sus límites de uso de API, muchachos.
Si el usuario decidió utilizar un canal tan extraño para intercambiar mensajes, no debería preocuparse por las características de la interfaz gráfica de usuario. Y no todos los sistemas lo tienen de todos modos, es por eso que escribí mi aplicación en forma de herramienta de terminal. Permite enviar y recibir mensajes a través de un canal mediante una identificación de usuario dada en los argumentos de la línea de comandos, pero solo una operación por lanzamiento. Por supuesto, nadie lo limitará a ejecutar solo una copia de un programa y utilizar múltiples canales simultáneamente en ambos sentidos, solo tendrá que ejecutar varias copias del mismo script con diferentes parámetros.
Usando las cosas
Puede leer más sobre el uso de esto como una utilidad de línea de comandos y una biblioteca python3 a través de la API en GitHub (repositorio vinculado al final). El único problema es adquirir sus propias credenciales de API (un manual simple es lo suficientemente útil) ya que Telegram no permite revelar el mío y establecerlo de acuerdo con los valores en su copia local de un script. Todo pasó a través de los argumentos de la línea de comando, excepto la parte de autorización que, de forma predeterminada, se realizó a través del stdio) y se ve así:
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!..
El mensaje recibido se decodificó automáticamente, pero si desea corregir algunos errores manualmente o realizar un seguimiento del progreso, puede hacerlo mirando la salida de la línea de comandos.
Fuera del telegrama
Vale la pena notar que dicho canal podría implementarse a través de cualquier mensajero y / o red social en la que uno pueda detectar si está bloqueado o no por otros usuarios. Las interfaces similares se pueden reemplazar fácilmente en el código existente, por lo que si desea hacerlo, solo use la base de la mina. El bajo rendimiento de Python (en comparación con lo habitual para tales cosas C / ++) no será un factor limitante debido a la baja velocidad de transmisión y al tiempo de respuesta de las llamadas API.
PD: Un agradecimiento especial al amor inusual de mi pasión por bloquearme.