Costumávamos pensar no Telegram como um meio de transmissão confiável e seguro para mensagens de qualquer tipo. Mas sob o capô, ele tem uma combinação bastante comum de criptografias a e simétricas. Onde é divertido nisso? E, de qualquer maneira, por que alguém confiaria suas mensagens a terceiros?

TL; DR - inventando um canal secreto privado sobre usuários bloqueando um ao outro.
Canais secretos
Existem muitas soluções alternativas para transmitir dados entre dois usuários, evitando o contato direto. Você pode usar métodos de intermediários, criptografia e esteganografia, redes de retransmissão de transmissão e outras extensões de protocolos existentes. Às vezes, porém, é útil poder estabelecer contato seguro usando apenas recursos oficialmente documentados. Ou, como se deve dizer, crie um canal secreto .
Podemos ver um exemplo disso em um filme de espionagem soviético "Seventeen Moments of Spring" (este é, tipo, muito bom, tente assistir). Nela, uma flor na janela do esconderijo era usada para sinalizar se o espião havia falhado em sua missão ou não. A flor por si só não significa nada: pode estar lá e não estar, essa simbiose é uma coisa comum e só nos fala sobre o amor do proprietário por flores. Somente uma interpretação predeterminada distingue as informações recebidas por um espião das recebidas por um transeunte aleatório.

Canais baseados em flores na janela no Telegram
Para organizar seu próprio canal secreto pelo mesmo princípio, você precisará de apenas duas coisas: uma janela e uma flor. A janela representa um objeto no qual você pode alterar o estado de vista de outras pessoas e a flor - estados possíveis e uma maneira de alterá-los.
Então, o que Alice poderia mudar no Telegram que Bob pode ver? Muitas coisas, na verdade: avatares, nomes de usuário, horário da última visita e muito mais. Mas, geralmente, essas coisas estão disponíveis para todos ao mesmo tempo, limitando a privacidade do diálogo - se alguém possui o método de transição, ele pode ler qualquer coisa que Alice envie. Surpreendentemente, é possível contornar essa limitação sem nenhum tipo de criptografia envolvida.
Estou bloqueando você, haha
Todo usuário tem sua própria lista negra e, se o leitor era bastante irritante, ele deveria ter notado, depois de ser bloqueado, que o status de 'última visita' que ainda não era amigo mudou para 'visto pela última vez há muito tempo'. A verdade é que ele poderia estar online há apenas alguns segundos atrás ou até mesmo estar agora, mas a API do Telegram não enviará mais essas informações ao seu aplicativo. Dessa forma, está protegendo a privacidade de outros usuários contra os indesejados. Em troca, eles podem ver se estão na lista negra ou não.
Então, o que ver uma flor e ser bloqueado tem em comum? Ambos podem ser verificados em um determinado momento, permitindo receber um pouco de informação, dependendo se você está bloqueado ou não. Outra vantagem é o fato de que o Telegram provavelmente não armazena logs de usuários bloqueando uns aos outros (no máximo por curtos períodos para fins de registro no diário).
Organizando bits
A possibilidade de enviar e receber bits é divertida e tudo, mas ainda precisamos descrever seu mecanismo de exploração. O telegrama se recusa a notá-lo quando bloqueado, portanto, toda ação de 'recebimento' deve ser inicializada pelo destinatário (vamos chamá-lo de Bob) e não depender do remetente (e ela será Alice), ou seja, por independente. Da mesma forma, Alice e Bob devem fazer solicitações na mesma frequência.
O algoritmo de troca de bits em cada relógio se parece com isso:
- Um verifica o envio de um bit e se tem um valor diferente do valor anterior, alterando-o dependendo de um valor:
- A -> T: bloco B se o bit for 1;
- A -> T: desbloqueie B se o bit for 0.
- B recebe um pouco:
- B -> T: resolva A;
- T -> B: disponível para B informações sobre A;
- B: verifica se as informações recebidas têm status:
- B: se for -> ele não está bloqueado e o bit é 0
- B: se não estiver -> ele está bloqueado e o bit é 1
A maioria dos PCs modernos possui bons geradores de frequência (um relógio do sistema, por exemplo), para que possamos sincronizar nossos relógios com eles sem usar o canal para transmitir nada, exceto os bits da mensagem. Só vale notar que as solicitações da API do Telegram, tanto o (des) bloqueio quanto a resolução do status do usuário, são chamadas de rede e não tendem a funcionar rapidamente, principalmente se você estiver usando proxies ou VPN. Isso produz uma limitação: a duração do relógio deve ser maior que o tempo médio de resposta (já que precisamos nos encaixar) e é por isso que nossa velocidade de transmissão de dados será limitada.
Codificando mensagens
Os textos em idiomas naturais têm redundância bastante alta e as mensagens recebidas com erros ainda serão lidas por um ser humano. E como o Telegram é um mensageiro (ignorando algumas coisas malucas ), podemos negligenciar a correção de erros, limitando possíveis transmissões de dados a simples mensagens de texto.
Nosso canal tem uma largura de banda extremamente baixa; por isso, precisamos usar a codificação de mensagens mais eficaz disponível para possíveis mensagens. Para nossa sorte, o nome do mensageiro está lembrando os tempos em que esse problema era comum.
É por isso que nós, que vivemos no século XXI, codificaremos nossos textos com um dos códigos mais eficientes disponíveis para telegrafistas, há cem anos - o código Baudot . Mais precisamente, sua variação final ITA-2 criada por Donald Murray para executar menos chamadas de API nos símbolos mais frequentes da linguagem.
O único que resta para transmitir com êxito uma mensagem é encontrar os limites de uma sessão de transmissão para que o destinatário possa encontrar uma enviada entre o fluxo de bits contínuo. Antes de a transmissão começar, Bob está bloqueado ou não e seu estado não muda por si só tão cedo. É por isso que Alice pode sinalizar sobre o início da sessão trocando-a para um oposto por apenas um relógio. No final da sessão, ela o desbloqueará e sairá em paz. Por outro lado, ele continuará recebendo zero bits até decidir que não fazem parte da mensagem - o código Baudot não possui o símbolo 00000
.

As desvantagens do método são uma impossibilidade prática de conexão (você pode, mas provavelmente exigirá correção manual de erros devido à troca de bits) à tradução em andamento e uma necessidade de separar símbolos nulos recebidos com erros dos enviados. Mas há todos os problemas de implementação.
Alta tecnologia
Depois de várias horas tentando usar uma biblioteca oficial para usar a API, eu me cansei e escrevi tudo com um Python usando uma biblioteca Telethon mais humana. Ele ainda possui uma API de estilo síncrono por alguns motivos estranhos raros hoje em dia. A codificação de mensagens com a ITA-2 que escrevi por mim mesma, já não encontrou nada útil na Internet.
Sincronização de relógio feita com relógios do sistema (e sim, dorme () s!), Uma vez que é suficientemente preciso, considerando que o tempo necessário em cada chamada de API da rede é superior a um décimo de segundo na maioria dos casos. O usuário pode definir a velocidade de transmissão como quiser, mas eu recomendo seguir a regra 'não mais do que uma solicitação por segundo' se você não quiser ver os erros do outro lado e for banido por um sistema de prevenção de inundações. O telegrama mostrou-se muito exigente quanto ao uso da API, congelando meu acesso por um dia, mesmo com algumas tentativas simples (bem-sucedidas) de autorização seguidas e bloqueio aleatório por inundação durante a transmissão por um motivo desconhecido. Você sempre deve declarar seus limites de uso da API, pessoal.
Se o usuário decidiu usar um canal tão estranho para trocar mensagens, ele não deveria se importar com nenhum recurso da interface gráfica do usuário. E nem todos os sistemas o possuem de qualquer maneira, por isso escrevi meu aplicativo na forma de ferramenta de terminal. Ele permite enviar e receber mensagens por um canal por um determinado ID de usuário dos argumentos da linha de comando, mas apenas uma operação por inicialização. Obviamente, ninguém o limitará a executar apenas uma cópia de um programa em cada um e usar vários canais simultaneamente em ambos os sentidos; você só precisará executar várias cópias do mesmo script com parâmetros diferentes.
Usando as coisas
Você pode ler mais sobre o uso dessa coisa como utilitário de linha de comando e uma biblioteca python3 por meio da API no GitHub (repositório vinculado no final). O único problema é adquirir suas próprias credenciais de API (o manual simples é útil o suficiente), pois o Telegram não permite divulgar as minhas e definir de acordo com os valores na sua cópia local de um script. Tudo passou pelos argumentos da linha de comando, exceto a parte da autorização, que por padrão é feita através do stdio) e tem a seguinte aparência:
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!..
A mensagem recebida foi decodificada automaticamente, mas se você deseja corrigir alguns erros manualmente ou acompanhar o progresso, pode fazê-lo olhando para a saída da linha de comando.
Fora do telegrama
Vale notar que esse canal pode ser implementado em qualquer mensageiro e / ou rede social em que se possa detectar se está bloqueado ou não por outros usuários. Interfaces semelhantes podem ser facilmente substituídas no código existente; portanto, se você quiser fazê-lo, basta usar as bases da mina. O baixo desempenho do python (em comparação com o habitual para C / ++) não será um fator limitante devido à baixa velocidade de transmissão e ao tempo de resposta das chamadas da API.
PS Agradecimentos especiais ao amor incomum da minha paixão por me bloquear