Quebrar sua criptografia é muito simples

Views: 631
0 0
Read Time:7 Minute, 44 Second

Alguns dias atrás me perguntaram se era possível descriptografar o conteúdo de algumas colunas criptografadas de um arquivo CSV. As strings criptografadas pareciam algo como doPRULpnkoqjY5bKy1DBqI+AyLJOfYU=.

À minha disposição, eu tinha um monte de amostras criptografadas. Eu também tinha uma amostra de texto simples, com o resultado de criptografia correspondente. Era (algo equivalente a) please, hack me!. Criptografado parancjJkcysWDXLoZDHhJ2+aA==

Eu fiz o crack. Aqui está como.

Preocupe-se com sua criptografia!

Não sou especialista em segurança ou criptografia. Fiz com noções muito básicas sobre criptografia e um pouco de sorte .

Este artigo deve nos lembrar de quantas pessoas podem acessar nossos dados quando não estão protegidos de maneira profissional.

Qual algoritmo?

Primeiras coisas primeiro. Precisamos identificar qual algoritmo de criptografia foi usado. É muito fácil, para um programador experiente, identificar uma codificação base64 .

Base64

Para os menos experientes: o =no final da string é uma marca registrada de uma string codificada em base64. É o preenchimento , e pode haver 0, 1 ou 2 = no final .

Além disso, mesmo se houver 0 =, você pode identificar um base64 porque eles se parecem com um layout aleatório de um conjunto de caracteres limitado . Existem algumas variantes de charset . Honestamente, em 12 anos, nunca encontrei uma amostra de uma variante.

Então vamos usar base64decode.org para decodificar nossa string.

Decodificação de string de entrada de base64 (captura de tela de base64decode.org )

O resultado parece estranho, por 2 motivos.

Primeiro: não é legível . Mas isso não é surpreendente. Mesmo que minha avó não pudesse ler, Base64 é uma codificação, não uma criptografia 😅.

https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgiphy.com%2Fembed%2Fl0MYQ5jcwegmAtXuU%2Ftwitter%2Fiframe&display_name=Giphy&url=https%3A%2F%2Fgiphy.com%2Fgifs%2FOriginals-wtf-what-l0MYQ5jcwegmAtXuU&image=https%3A%2F%2Fmedia1.giphy.com%2Fmedia%2Fl0MYQ5jcwegmAtXuU%2Fgiphy.gif%3Fcid%3D790b7611760ea524ef75c151d0336c9abaacc19e1f4dd98a%26rid%3Dgiphy.gif%26ct%3Dg&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&schema=giphyImagem do Giphy

Segundo e mais importante. É mais curto que a entrada . O resultado de uma codificação base64 é sempre maior que sua entrada. Em particular:

output_size=((input_size + preenchimento) / 3) * 4

Isso sugere que o conteúdo decodificado é binário, não textual.

Precisamos olhar para ele em sua totalidade. Vamos tentar com cryptii.com , configurando para saída de bytes em formato hexadecimal.

Decodificação de string de entrada de base64 para bytes (captura de tela de cryptii.com )

A saída, na base hexadecimal , é 9d c8 c9 91 cc ac 58 35 cb a1 90 c7 84 9d be 68. Ele se traduz para a base 10 como 157 200 201 145 204 172 88 53 203 161 144 199 132 157 190 104.

Vamos analisá-lo. A primeira observação é que tem o mesmo comprimento que a entrada : 16 bytes. Isso nos permite excluir alguns dos algoritmos de criptografia mais comuns, como AES ou RSA . Nas implementações mais comuns, sua saída tem comprimentos diferentes de sua entrada.

Também é muito provável que não haja salt , a menos que suponhamos que a saída também seja compactada. Adotando o princípio da Navalha de Occam , vamos excluir que está compactado.

As considerações acima parecem nos apontar na direção de um algoritmo de criptografia personalizado.

Um algoritmo de criptografia personalizado

Vamos tentar montar essa teoria. Uma boa maneira de explorar algo novo é começar pelos casos mais simples. A criptografia mais ingênua é a cifra de César .

Se uma cifra de César fosse adotada, então dois mesmos caracteres seriam criptografados com o mesmo número. No nosso podemos observar a repetição do personagem, nas posições 3 e 9 (base 0).please, hack me!a

157 200 201 145 204 172 88 53 203 161 144 199 132 157 190 104

Parece que não é o caso de uma cifra de César. 145na posição 3 e 161na posição 9. Como passar daqui?

Poderia ter trocado as posições das letras, ou poderia ter mudado por um esquema aleatório… talvez uma combinação de ambos.

Imagem gerada pelo autor com Imgflip

Vamos visualizar o que sabemos, em busca de sugestões. Abra um editor de texto avançado (como Notepad++ ou Visual Studio Code) e trace o que sabemos.

157 200 201 145 204 172  88  53 203 161 144 199 132 157 190 104  por favor, hackme!112 108 101  97 115 101  44  32 104  97  99 107  32 109 101  33

Em ordem: os bytes de string codificados, a string de texto simples e os bytes de string de texto simples.

O objetivo de fazer isso é inspecionar visualmente qualquer tipo de padrão. Por exemplo, para ver se os bytes codificados, siga a mesma ordem do texto simples. Mas novamente, sem sorte.

É hora de codificar!

Devemos levantar um pouco a complexidade considerada em nossa análise. A próxima etapa é inspecionar a diferença entre os valores de byte da criptografia e o texto simples.

Vamos escrever um script para calculá-lo. Vou usar um Python Notebook no Deepnote

https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fembed.deepnote.com%2Fe1395044-b879-430f-bca7-891f2a43f068%2Fecd0d4ad26ce4860a8aba7333f7ce6bf%2F3743b79899fd49f9a17d8e7321a9f592%3Fheight%3D188.1875&display_name=Deepnote&url=https%3A%2F%2Fembed.deepnote.com%2Fe1395044-b879-430f-bca7-891f2a43f068%2Fecd0d4ad26ce4860a8aba7333f7ce6bf%2F3743b79899fd49f9a17d8e7321a9f592%3Fheight%3D188.1875&image=https%3A%2F%2Fdeepnote.com%2Fstatic%2Fthumbnails%2Fmain.png&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&schema=deepnote

https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fembed.deepnote.com%2Fe1395044-b879-430f-bca7-891f2a43f068%2Fecd0d4ad26ce4860a8aba7333f7ce6bf%2Fc3b2caf1ae5448f980bf5df2414193f1%3Fheight%3D278.1875&display_name=Deepnote&url=https%3A%2F%2Fembed.deepnote.com%2Fe1395044-b879-430f-bca7-891f2a43f068%2Fecd0d4ad26ce4860a8aba7333f7ce6bf%2Fc3b2caf1ae5448f980bf5df2414193f1%3Fheight%3D278.1875&image=https%3A%2F%2Fdeepnote.com%2Fstatic%2Fthumbnails%2Fmain.png&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&schema=deepnote

https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fembed.deepnote.com%2Fe1395044-b879-430f-bca7-891f2a43f068%2Fecd0d4ad26ce4860a8aba7333f7ce6bf%2Fa932491cd32f44b6ad5c06dbb8c84cc4%3Fheight%3D170.1875&display_name=Deepnote&url=https%3A%2F%2Fembed.deepnote.com%2Fe1395044-b879-430f-bca7-891f2a43f068%2Fecd0d4ad26ce4860a8aba7333f7ce6bf%2Fa932491cd32f44b6ad5c06dbb8c84cc4%3Fheight%3D170.1875&image=https%3A%2F%2Fdeepnote.com%2Fstatic%2Fthumbnails%2Fmain.png&key=d04bfffea46d4aeda930ec88cc64b87c&type=text%2Fhtml&schema=deepnote

Em seguida, adicione a diferença como uma nova linha ao nosso editor. (O meu é VsCode)

O gráfico de nossas informações conhecidas no VsCode

O ponto de usar um editor de texto avançado, é que quando você seleciona um texto ele destaca as outras ocorrências do mesmo texto.

Parece que encontramos algo. Há um esquema de repetição nas diferenças.

Encontramos a chave de criptografia! Esta é uma tabela de deslocamento de comprimento 10.

A mesa de deslocamento

“Uma tabela de deslocamento de comprimento 10” significa que para cada 10 caracteres adicionamos o valor na mesma posição da tabela. Ao primeiro caractere adicionamos 45, ao segundo 92 e até o nono. Depois recomeça: ao décimo 45, ao décimo primeiro 92, etc…

O algoritmo de decodificação

Agora podemos escrever a função para decodificar todas as colunas criptografadas.

https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fembed.deepnote.com%2Fe1395044-b879-430f-bca7-891f2a43f068%2Fecd0d4ad26ce4860a8aba7333f7ce6bf%2Faa47209502724302ba9c205a440d31f5%3Fheight%3D278.1875&display_name=Deepnote&url=https%3A%2F%2Fembed.deepnote.com%2Fe1395044-b879-430f-bca7-891f2a43f068%2Fecd0d4ad26ce4860a8aba7333f7ce6bf%2Faa47209502724302ba9c205a440d31f5%3Fheight%3D278.1875&image=https%3A%2F%2Fdeepnote.com%2Fstatic%2Fthumbnails%2Fmain.png&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&schema=deepnote

Em ordem:

  1. decodificar de base64
  2. converter a saída em uma lista
  3. subtrair dos valores de byte, o valor correspondente da tabela
  4. converter a lista de volta para uma string

Conclusão

“Como alguém pode adivinhar essa tabela de criptografia aleatória? Eles nem conhecem o algoritmo que estou usando.”

Este deveria ter sido o pensamento de quem implementou a criptografia quebrada neste artigo. Infelizmente, a realidade é que quase qualquer pessoa com conhecimento muito básico e um pouco de tempo (demorei cerca de 4 horas), pode quebrar sua criptografia.

Imagine o que um especialista pode fazer.

Tenha o devido cuidado ao escolher como criptografar os dados em seu aplicativo. Sempre use métodos de criptografia profissionais e evite soluções caseiras.

Precauções que poderiam ter me impedido de quebrar a chave

Se você não puder evitar o uso de criptografia personalizada, pelo menos tenha mais cuidado. Com muito pouco esforço, teria me tornado muito mais difícil decifrar a chave. Exemplos:

  • Se o comprimento da mesa de deslocamento fosse maior. Digamos 100. Eu não teria notado o esquema de repetição.
  • Se mais de uma tabela de turnos foi usada. É fácil alterá-lo com base na primeira letra da palavra

Essas precauções não parariam um profissional. Mas pelo menos poderia parar novatos como eu.

Agora, você consegue adivinhar o que está criptografado no primeiro exemplo deste artigo doPRULpnkoqjY5bKy1DBqI+AyLJOfYU=?

FONTE: LEVELUP

POSTS RELACIONADOS