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