Mais telegramas secretos

Todo mundo está acostumado a pensar nos telegramas como um meio confiável e seguro para enviar mensagens de qualquer tipo. No entanto, sob o capô, ele tem uma combinação completamente comum de criptografia a e simétrica, o que não é de todo interessante. E, no final, por que você deveria confiar explicitamente em suas mensagens a terceiros?
CAPA by Antonio Prohías
TL; DR - invente um canal oculto privado através do bloqueio de usuários.


Canal oculto


Existem muitas soluções alternativas para transferir dados entre dois usuários, evitando contato explícito. Você pode usar intermediários, criptografia e esteganografia, redes de retransmissão de transmissão e outros complementos nos protocolos existentes. Mas, às vezes, é útil poder entrar em contato usando apenas os recursos declarados oficiais. Ou seja, organize um canal secreto .


Um exemplo simples e compreensível de um canal oculto para um leitor de língua russa é uma flor na janela de aparência de dezessete momentos da primavera. Por si só, ela pode ficar de pé ou não na janela - essa simbiose é completamente normal e só fala do amor do proprietário do apartamento por flores. Somente uma interpretação predeterminada distingue as informações transmitidas por um batedor daquelas obtidas por um transeunte aleatório.


Flor na janela


Telegrama de canais de janela de flores


Para organizar seu canal oculto de acordo com esse exemplo, apenas duas coisas são conceitualmente necessárias: uma janela e uma flor. A janela descreve o objeto disponível para alterar e determinar o estado, e a flor descreve os valores possíveis e o método para alterá-los.


O que Alice pode mudar em um telegrama, disponível para visualização em um determinado Bob? Sim, muitas coisas: avatares, nomes de usuários, horário da última visita e muito mais. No entanto, eles geralmente estão disponíveis para todos imediatamente, o que limita a privacidade de um possível diálogo - qualquer pessoa com conhecimento do método de transmissão poderá ouvir as mensagens enviadas. Curiosamente, essa restrição pode ser contornada sem o uso de criptografia.


Lista negra


Cada usuário tem sua própria lista negra exclusiva e, se o leitor já esteve nela pelo menos uma vez, deve ter notado que a data da última visita do infrator mudou para "vista pela última vez há muito tempo", juntamente com um avatar vazio. De fato, o usuário pode estar online há pelo menos um segundo e alterar cem selos em seu perfil, mas a API do Telegram simplesmente não retorna esses dados para o aplicativo. Assim, protege sua vida pessoal de pessoas indesejadas, em troca, fazendo-as entender que estão bloqueadas.


Então, qual é o resultado do comum entre a flor na janela e estar na lista de bloqueios? Tanto isso como outro podem ser verificados em um determinado momento, após receber um pouco de informação, dependendo de você estar na lista negra ou não. Um bônus adicional é o fato de que os telegramas provavelmente não armazenam em seus logs (e se o fazem, não por muito tempo apenas para fins de registro) o histórico de bloqueio dos usuários uns dos outros.


Organize as batidas


A capacidade de transmitir e receber bits é, obviamente, boa, mas você ainda precisa descrever um mecanismo completo para sua operação. O telegrama não envia notificações aos usuários quando elas são adicionadas à lista negra; portanto, a recepção de cada bit deve ser iniciada pelo destinatário (Bob) e não depender do remetente (Alice). Da mesma forma, Alice e Bob devem atender a solicitações com a mesma frequência, para que cada ciclo de relógio do remetente corresponda a um ciclo de relógio do destinatário.


O próprio algoritmo de troca em cada medida se parece com isso:


  • A verifica o bit que está sendo enviado e, se for necessário enviar um sinal, dependendo do seu valor:
    • A -> T: bloco B;
    • A -> T: desbloquear B.
  • B fica um pouco:
    • B -> T: solicitação do usuário A;
    • T -> B: informações disponíveis sobre A;
    • B: verifica se a informação recebida tem o status:
      • B: se houver -> não é bloqueado e recebido 0
      • B: se não -> é bloqueado e recebido 1

A maioria dos processadores de usuário modernos possui bons geradores de frequência integrados (pelo menos o relógio do sistema), para que os relógios possam ser sincronizados com eles sem usar o próprio canal de dados. Vale ressaltar que os pedidos para a API do telegrama são de rede e não se apressam em trabalhar rapidamente, o que não ajuda no fato de seu bloqueio na Federação Russa e na necessidade de usar proxies. Mas a duração do ciclo deve, em média, exceder o tempo necessário para concluir essas solicitações, para que a frequência e a velocidade da transferência de dados sejam extremamente pequenas.


Codificamos mensagens


Os textos em linguagem natural têm uma redundância bastante alta; portanto, as mensagens recebidas com erros ainda serão muitas vezes compreensíveis para os seres humanos. E como o telegrama ainda é um mensageiro, apesar das tentativas de anexar todos os tipos de dispositivos gráficos, de áudio e vídeo, a correção de erros pode ser negligenciada, limitando os dados transmitidos às mensagens de texto.


Devido à baixa taxa de transferência do canal secreto, você precisa usar a codificação mais eficiente para possíveis mensagens. Felizmente, o nome do mensageiro nos lembra os momentos em que esses problemas eram comuns.


Portanto, no século XXI, codificaremos textos com um dos métodos mais eficazes disponíveis para os telegrafistas há um século - o código Bodo . Mais precisamente, sua última variação do ITA-2 foi criada por Murray para fazer menos chamadas à API em caracteres comumente encontrados. Você pode reclamar da falta do idioma russo, mas, na minha opinião, a transliteração é uma maneira mais simples do que o sacrifício de caracteres adicionais a qualquer Yu e Sch .


Resta apenas determinar o início e o fim de cada sessão de transferência de dados, para que o lado receptor entre o fluxo grande possa destacar as mensagens transmitidas a ele. Antes do início da transferência, Bob está na lista negra ou fora dela. Então Alice sinaliza o início da transferência, mudando esse estado em uma batida para o oposto. No final do programa, ela simplesmente desbloqueia Bob. Ele continua a receber caracteres nulos até que tenha acumulado o suficiente para declarar com segurança o final da transmissão.


Na linha do tempo


A desvantagem dessa abordagem é a impossibilidade prática de conectar-se (mais precisamente, você pode conectar-se, mas é necessário mexer na correção manual de erros) à transmissão em andamento e à separação de zero caracteres erroneamente recebidos dos realmente transmitidos. No entanto, isso já é um problema de implementação.


Alta tecnologia


Depois de várias horas tentando usar a biblioteca oficial para interagir com a API, cuspi e escrevi tudo o que precisava em python usando um Telethon mais humano. O autor ainda apresenta a API em um estilo síncrono, que por algum motivo se tornou uma raridade terrível. Eu tive que escrever a codificação de mensagens usando o ITA-2 no meu joelho, já que realmente não encontrei nada pronto.


A sincronização de frequência ocorre no relógio do sistema (e sim, o programa dorme! Em intervalos), que são bastante precisos se você levar em consideração o tempo necessário para concluir as solicitações de API, que é estável por mais de um décimo de segundo. O usuário pode definir a velocidade de transmissão como desejar, no entanto, uso o princípio de "não há mais solicitações por segundo" para evitar erros e congelamento de spam com o mesmo tipo de solicitação. O telegrama, em geral, mostrou-se muito exigente em usar sua API, congelando o acesso à conta por um dia, mesmo com apenas três autorizações (além disso, bem-sucedidas) seguidas, bem como bloqueios aleatórios de curto prazo por razões desconhecidas.


Se os usuários trocam telegramas através de um canal oculto, eles realmente não precisam de uma interface gráfica. Sim, e não em todos os lugares em que ele está, ele escreveu o utilitário de console usual. Ele permite aguardar e receber uma mensagem no ID do usuário especificado em uma execução ou enviá-la lendo os argumentos da linha de comandos. É claro que ninguém proíbe o uso de vários canais de uma só vez, e também recebe e transmite mensagens em paralelo, você só precisa executar várias instâncias em paralelo.


Exemplo de uso


Para usar, você precisa obter seu api_id e api_hash do telegrama de acordo com esta instrução e definir os valores recebidos no arquivo 'covertele.py'. Os argumentos da linha de comando indicam a ação desejada, seu identificador, identificador de destinatário e a mensagem a ser transmitida, se for o remetente. Tudo se parece com isso:


 :  : 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!.. 

O texto é decodificado automaticamente, mas os fãs que procuram erros manualmente, leem em movimento e acompanham o progresso podem fazer tudo isso usando a saída dos códigos enviados e recebidos.


Se alguém quiser, você também pode usar a API fornecida simples:


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

Além do telegrama


É claro que esse canal pode ser organizado sobre qualquer mensageiro no qual exista um método para determinar se outros usuários se bloqueiam. Ao mesmo tempo, interfaces semelhantes são facilmente implementadas e substituídas de maneira semelhante no código. Portanto, se houver um desejo - você pode usar o final, e não escrever codificação, etc. do zero. Felizmente, é improvável que um python lento interfira na transmissão bit a bit a essas velocidades.


PS Agradecimentos especiais à minha paixão pelo amor de me jogar em uma emergência.


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


All Articles