Executando verificação de segurança...
6

[Analise de dados] Entendendo um pouco sobre criptografia através da cifra 'pombês' [Homenagem ao Richarlison]

Entendendo o problema

Bem, esses dias estava no linkedin, e me deparei com a seguinte postagem:

Postagem do Linkedin

Texto criptografado:

pru, pru pru, pru pru, pru, pru pru, pru, pru, pru-pru, pru pru, pru pru, pru, pru, pru pru, pru, pru pru-pru, pru pru, pru pru, pru, pru pru, pru pru, pru, pru-pru, pru pru, pru pru, pru, pru pru, pru pru, pru, pru-pru, pru pru, pru pru, pru, pru pru, pru pru, pru pru, pru pru~pru, pru pru, pru pru, pru pru, pru, pru pru, pru pru, pru pru-pru, pru pru, pru pru, pru, pru pru, pru pru, pru pru, pru pru-pru, pru pru, pru pru, pru pru, pru, pru, pru pru, pru-pru, pru pru, pru pru, pru, pru pru, pru pru, pru, pru-pru, pru pru, pru pru, pru, pru, pru pru, pru, pru-pru, pru, pru pru, pru, pru, pru, pru, pru pru

Não sou especialista em criptografia mas, apesar disso, gosto muito da área de criptoanálise que, de acordo com a wikipédia, é a arte de tentar descobrir o texto cifrado e/ou a lógica utilizada em sua encriptação.

Gosto de criptoanálise por ter tudo haver com análise de dados, que é a área em que trabalho atualmente. Análise de dados é o processo de aplicação de técnicas estatísticas e lógicas para avaliar informações obtidas a partir de determinados processos. O principal objetivo da prática é extrair informações úteis a partir dos dados.

Para extrair informação de um texto criptografado é necessário analisar cada detalhe contido no texto e fazer o mapeamento de cada conjunto de caracteres cifrados para o original, através de técnicas estatísticas e lógicas, a fim de encontrar padrões nos dados.

Ao ver essa cifra, criada pelo Nícolas Gabriel, achei bem interessante e resolvi brincar um pouco com esses dados. Já imaginava que devia ser uma cifra de substituição simples e, como um bom analista de dados, fiquei com vontade de quebrá-la. Ao tentar fazer isso, pude ver os pontos fortes e fracos dessa cifra.
Agora, se você for um analista de dados, tente decifrar esse código, também, antes de continuar o texto.

Decifrando o código

Primeiro, é possível ver, na publicação, que cada um dos caracteres foram criptografados e que não houve mudança no texto durante a criptografia, podemos deduzir isso devido ao texto original ser idêntico ao texto descriptografado. Esse tipo de criptografia é bem útil por ser mais flexível. 

Algumas cifras geram uma cifra com perda de informação, por exemplo, se o texto original for Hello World!, então o texto depois de descriptografado poderia ser helloworld, nesse caso, as seguintes informações foram perdidas:

  • Letras maiúsculas
  • Pontuações
  • Espaços

Remover pontuações e espaços dificulta a tarefa de criptografia, pois caso contrário, se o criptoanalista identificar quais são os caracteres que representam as pontuações e os espaços, fica mais fácil para ele saber onde começa e onde termina uma palavra.

Sabendo disso, está na hora de analisar o texto:

Para começar as análises, é sempre interessante iniciar testando as cifragens mais simples, por conta disso podemos presumir que cada caractere pode corresponder a uma cadeia de vários 'pru's diferentes. Por exemplo, a letra h poderia significar essa cadeia de 'pru's: pru, pru pru, pru pru, pru, pru pru, pru

Então, a primeira coisa que vou fazer é separar cada tipo de 'pru', para contar a quantidade de 'pru's que havia no texto, através da virgula.

Agora que eu tenho a quantidade de 'pru's (78), posso dividir pela quantidade de caracteres para saber quantas 'pru's equivalem a 1 caractere. Por exemplo, se tivesse 100 'pru's no texto criptografado e 10 caracteres no texto original, já daria para saber que 10 'prus' representam 1 caractere no texto original.

Como eu obtive um valor decimal (6.5), uma outra possibilidade, é que cada caractere pode ter cadeias de 'pru's de tamanhos diferentes, ou seja, isso daria mais robustez à criptografia.

Entretanto, vou dividir o conjunto de 'pru's de outra forma, percebi que haviam poucas 'pru's neste formato: pru-pru, então resolvi separar as 'pru's pelo símbolo: -.

Com isso consegui dividir o texto criptografado em 10 grupos, mas ainda não é o suficiente, pois existem 12 caracteres no texto original. Entretanto, uma coisa no texto chama a atenção, o símbolo: ~, ele aparece apenas uma vez e, aproximadamente, no centro do texto. Isso pode significar que o símbolo ~ representa o caractere de espaço do texto original.

Após "remover" o símbolo ~, obtivemos 11 cadeias de 'pru's, se somarmos mais 1 (referente ao símbolo que representa o caractere de espaço do texto) é possível obter os 12 caracteres do texto original.

Chegamos à seguinte conclusão no mapeamento dos caracteres:

  • h = pru, pru pru, pru pru, pru, pru pru, pru, pru, pru
  • e = pru, pru pru, pru pru, pru, pru, pru pru, pru, pru pru
  • l = pru, pru pru, pru pru, pru, pru pru, pru pru, pru, pru
  • o = pru, pru pru, pru pru, pru, pru pru, pru pru, pru pru, pru pru
  • espaço = ~
  • w = pru, pru pru, pru pru, pru pru, pru, pru pru, pru pru, pru pru
  • r = pru, pru pru, pru pru, pru pru, pru, pru, pru pru, pru
  • d = pru, pru pru, pru pru, pru, pru, pru pru, pru, pru
  • ! = pru, pru, pru pru, pru, pru, pru, pru, pru pru

Como as cadeias de 'pru's possuem o mesmo tamanho, não era necessário colocar o símbolo - para representar a divisão entre os grupos, pode tornar o código mais fácil de ser decifrado.

Código original

O código original pode ser visto abaixo:

const pombify = (phrase) => {
   return phrase
     .split(' ')
     .map((word) => {
       const wordLetters = word.split('')
       return wordLetters
         .map((letter, index) => {
           const charCode = letter.charCodeAt(0);
           const binary = charCode
             .toString(2)
             .padStart(8, 0)

           const prus = binary
             .replace(/0/g, 'pru, ')
             .replace(/1/g, 'pru pru, ')
             .replace(/, $/, '')

           return prus
         })
         .join('-')
     })
     .join('~')
 }

 const despombify = (prurase) => {
   return prurase
     .split('~')
     .map((word) => {
       return word
       	.split('-')
        .map((letter) => {
           const binary = letter
             .replace(/pru pru(, )*/g, '1')
             .replace(/pru(, )*/g, '0')

           return String.fromCharCode(parseInt(binary, 2))
         })
         .join('')
     })
     .join(' ')
 }

Apesar de descobrir o que cada letra do 'hello world!' representa, eu não havia percebido, antes de ver o algoritmo de criptografia, que as 'pru's representavam os valores em binário. Onde cada caractere é transformado em uma string de 8 bits (1 byte) contendo valores 0 ou 1 e, então, cada bit é convertido para tipo de 'pru'.

  • 0 = 'pru'
  • 1 = 'pru pru'

Pombify 2.0

Após listar os pontos positivos e negativos dessa cifra, resolvi fazer a minha, baseado nela, sendo mais robusta, utilizando somente apenas a cifra de substituição. Abaixo, é possível ver como a criptografia ficou.

Texto criptografado:

pru-pru, pru pru, pru pru pru, pru-pru pru, pru pru-pru, pru-pru pru, pru pru-pru, pru pru pru, pru-pru, pru pru pru, pru, pru pru pru, pru pru, pru-pru, pru-pru pru, pru-pru, pru, pru pru pru, pru-pru, pru pru pru, pru pru-pru, pru pru, pru pru-pru, pru pru pru, pru-pru, pru pru pru, pru pru-pru, pru pru, pru pru-pru, pru pru pru, pru-pru, pru pru pru, pru pru-pru, pru-pru pru, pru pru pru, pru, pru-pru pru, pru pru, pru pru-pru, pru pru pru, pru-pru, pru pru, pru-pru pru, pru pru pru, pru, pru pru pru, pru pru, pru-pru, pru-pru pru, pru-pru, pru pru-pru, pru pru pru, pru pru, pru-pru pru, pru, pru pru pru, pru-pru, pru pru pru, pru, pru-pru pru, pru pru pru, pru, pru pru pru, pru pru, pru-pru pru, pru pru-pru, pru-pru pru, pru pru, pru, pru pru pru, pru-pru, pru pru pru, pru pru-pru, pru pru, pru, pru pru pru, pru-pru, pru pru pru, pru pru-pru, pru-pru, pru pru, pru pru pru, pru-pru pru, pru pru-pru, pru-pru pru, pru pru, pru pru-pru, pru pru, pru-pru pru, pru pru pru, pru pru, pru pru

Você consegue decifrar o que cada letra do texto original representa no meu texto criptografado?

Obs: Não coloquei o texto descriptografado para deixar a criptoanálise mais difícil, ou seja, você terá que descobrir se é uma criptografia com perda ou não de informações, mas caso queira uma dica (ver como o texto fica descriptografado), é só clicar aqui.

Obs 2: Depois posso comentar nesse post ou fazer um novo post explicando o meu algoritmo de criptografia.

Caso consiga descriptografar, coloque aí nos comentários o mapeamento de cada caractere e diga se você usou ou não a dica.

Carregando publicação patrocinada...
1
1