Esteganografia. A arte de esconder algo bem debaixo do seu nariz. Desde que os seres humanos existem, tentamos esconder coisas, seja nossa última fatia de pizza ou a localização de um tesouro enterrado. O senhor se lembra do truque legal da tinta invisível de limão, em que escrevíamos a mensagem secreta com limão e aquecíamos o papel para revelar o grande segredo? Bem, isso é o que a esteganografia é, em poucas palavras, o que nos permite ocultar facilmente as mensagens apenas escondendo sua existência.

No início dos anos 1900, espiões alemães se infiltraram entre os cidadãos da França em nome do comércio. Seus motivos, no entanto, eram observar os detalhes do sistema de defesa francês e ajudar os alemães a invadir a França. O sistema de defesa francês, inteligentemente projetado, mantinha a máxima confidencialidade mesmo entre cada região, o que dificultava que um único espião reunisse todas as informações. Isso exigia que vários espiões reunissem informações de cada região e, juntos, elaborassem seu plano de jogo. O local da reunião deveria ser comunicado somente naquele mesmo dia, por motivos de alta segurança, mas como o senhor poderia chegar a todas as regiões em um dia? Eles escolheram o jornal, um canal público rápido, mas muito inseguro! Mas os alemães já haviam pensado nisso, pois publicaram o local secreto do encontro no boletim meteorológico do dia.

Pegando a primeira letra de cada palavra e o que obtemos – o local do encontro

“Nova Rue des Thermopyles Heil Hitler”!

Na época, tinta invisível, agora caracteres invisíveis.

Agora, na era da informação, o lugar mais importante para a comunicação é a Internet. Aplicativos de mensagens como messenger, Whatsapp, iMessage e mídias sociais como Twitter, Facebook e Instagram. Como podemos aplicar o mesmo problema aqui e resolvê-lo agora? Bem, poderíamos começar com caracteres de largura zero.

‘Copie-me’ – cole esta citação https://www.textmagic.com/free-tools/unicode-detector para ver os ZWCs escondidos bem na frente do senhor o tempo todo.

Os caracteres de largura zero são caracteres que não são impressos e fazem parte da tabela Unicode. Como o nome sugere, eles nem sequer mostram sua presença. Eles são usados para permitir a quebra de linha em palavras longas, unir emojis, combinar dois caracteres em uma ligadura, impedir que eles se unam etc.

Os caracteres zwj se juntam aos emojis, mas eles não são visíveis

Esses caracteres estão cada vez mais presentes na ocultação de textos, e sua completa invisibilidade é um ponto de venda notável. Eles não podem ser bloqueados, pois são parte integrante de vários idiomas e emojis. E também acontece que os ZWCs não são os únicos caracteres invisíveis, por exemplo, Separador invisível – U+2063.

Tabela que contém os caracteres invisíveis mais usados.

Mas há um pequeno problema com essa tabela! O Gmail bloqueia o U+200B (espaço de largura zero). Sem mencionar que o Twitter é conhecido por colocar na lista negra caracteres invisíveis desnecessários, nenhum dos caracteres da tabela, exceto U+200C, U+200D e U+180e, funciona. Portanto, agora temos três caracteres!

Ah, espere, o U+180e não é invisível e é renderizado de forma estranha em dispositivos iOS. Agora temos apenas 2 caracteres.

Analisando a tabela Unicode, testando cada possível caractere invisível quanto à sua invisibilidade entre plataformas/na Web, conseguimos adicionar mais 4 caracteres ao nosso arsenal, um total de 6 caracteres invisíveis que agora podemos usar para ocultar nossos segredos em cadeias de caracteres.

const zwc = ['‌', '‍', '⁠', '⁢', '⁣', '⁤'] // 200c,200d,2060,2062,2063,2064 The digital equivalent invisible ink

Agora, para usar a tinta invisível, tudo o que temos de fazer é, dado um “hi” secreto, representá-lo em binário, ou seja, 01101000 011010001. Em seguida, pegue 4ZWCs e mapeie-os em uma tabela verdade de dois bits, ou seja, 00-200c,01-200d,10-2060,2062-11.Use a tabela verdade para converter o binário em um fluxo invisível e incorporá-lo em qualquer mensagem de cobertura em qualquer lugar.

Criptografia do conteúdo oculto

E se o invasor, de alguma forma, detectar a presença dos caracteres ocultos e tentar usar força bruta na tabela verdade para descobrir o segredo?

É aqui que o Princípio de Kerckhoff entra em cena:

Um sistema de criptografia ideal deve ser seguro mesmo que tudo sobre o sistema seja exposto ao público, exceto a chave secreta.

Portanto, precisamos de algum tipo de chave para bloquear nossos segredos. Para isso, uma função de geração de chave baseada em senha pode ser usada para produzir uma chave forte que, por sua vez, é usada para criptografar nossas mensagens. A cifra de fluxo AES-CTR com um IV aleatório e salt pode ser usada para criptografar o segredo oculto, pois tem a vantagem adicional de não exigir preenchimento, ao contrário das cifras de bloco, pois isso aumenta o comprimento da mensagem.

Compressão

Agora, como estamos fazendo muito com a criptografia, definitivamente precisamos da máxima compactação possível.

Como o senhor pode ver, embora tivéssemos seis caracteres ZWC, apenas 4 foram usados, pois 6 não é uma potência de 2. Os dois caracteres extras (U+2063, U+2064) poderiam ser usados para fazer uma camada adicional de compressão Huffman abstraída, reduzindo a redundância. Após o segredo ter sido convertido em ZWCs, os dois ZWCs mais repetidos no fluxo são determinados, digamos, U+200D e U+2060. Agora, cada duas ocorrências consecutivas de U+200Ds e U+2060s podem ser substituídas por um U+2063 ou U+2064. Isso economiza muito, pois a redundância era observada com frequência.

Agora temos duas camadas de compactação que fazem o melhor uso dos 6 caracteres invisíveis! Fantástico!

Então, combinando tudo isso, dois amigos meus e eu criamos o StegCloak, um módulo de esteganografia em JavaScript puro, projetado em um estilo de programação funcional para alcançar o que foi dito acima.

Aqui está uma rápida demonstração dele:

Esperamos que os senhores gostem tanto quanto nós gostamos de construí-lo!

Checkout StegCloak em Github ou visite https://stegcloak.surge.sh.