Resposta do desafio criptografia Blowfish

Tags: , ,
Postado em Artigos, Python, nerd por Felipe Tonello on the November 21st, 2007


Ajude a Combater o Spam! Clique aqui!

Já faz um tempinho que coloquei o ‘Desafio criptografia Blowfish’ no meu blog. Só que ninguem conseguiu, ou tentou, resolver o problema.

Vamos ver que é bem simples esse desafio.

Primeiro coisa a fazer é ler o desafio e perceber que temos 2 coisas importantes alí:

  1. Mensagem criptografada
  2. Senha da mensagem.

Feito isso já podemos matar o problema. Como?
Primeiro escolha a linguagem de programação que você quer resolver. No caso vamos utilizar Python.
Você pode baixar o blowfish.py aqui.

Se você abrir o código, pode perceber que no final do arquivo têm uns exemplos de uso. Ou simplesmente faça:

  1. $ tail blowfish.py -n 20

A saída será essa:

  1. if __name__ == ‘__main__’:
  2.     key = ‘This is a test key’
  3.     cipher = Blowfish (key)    print "Testing encryption:"
  4.     xl = 123456
  5.     xr = 654321
  6.     print "\tPlain text: (%s, %s)" %(xl, xr)
  7.     cl, cr = cipher.cipher (xl, xr, cipher.ENCRYPT)
  8.     print "\tCrypted is: (%s, %s)" %(cl, cr)
  9.     dl, dr = cipher.cipher (cl, cr, cipher.DECRYPT)
  10.     print "\tUnencrypted is: (%s, %s)" %(dl, dr)
  11.     print "Testing buffer encrypt:"
  12.     text = ‘testtest’
  13.     print "\tText: %s" %text
  14.     crypted = cipher.encrypt (text)
  15.     print "\tEncrypted: %s" %crypted
  16.     decrypted = cipher.decrypt (crypted)
  17.     print "\tDecrypted: %s" %decrypted

Agora já sabemos como faz para chamar o método de criptografar e descriptografar.

Mas peraí, no exemplo acima o mensagem era uns números e não vários caracteres como na do nosso desafio.
Aí vem a primeira pegadinha..
nossa string foi convertida para codificação base 64.
Então teremos de converter toda a string para uma string conhecida pelo blowfish(ou não, temos que ver).

  1. import base64
  2. base64.b64decode(’string_do_desafio’)

Beleza, agora sabemos que está tudo ok. Temos que conhecer o Blowfish.

Para isso vamos dar uma pesquisada na internet.

…10 minutos depois…

Bom, pelo que eu vi aqui na wikipedia e vejo isso: A entrada para essa parte do algoritmo são 64 bits…
Com complexas contas chegamos que 64 bits = 8 Bytes = 8 caracteres. Para quem não entendeu ainda, fizemos 64 bits / 8 bits = 8 Bytes

Então quer dizer que o blowfish só recebe em blocos de 8 caracteres as entradas.. hmmmm interessante..
Sabendo isso, vamos ter que separar nossa string com muitos caracteres em várias de 8 caracteres apenas.

Faremos isso com um for normal e vamos cortar a string em vários blocos de 8 caracteres. Mas e se o último bloco conter apenas 6 caracteres? Para termos certeza de que a string contem 8 caracteres podemos forcar com o método string.ljust(variavel, 8 )

Não se esqueça que a senha também não deve ter menos de 8 caracteres, então está a outra dica: Usar o ljust() na senha também.

Depois disso é só você criar seu código. Eu criei uma classe bem simples que criptograda e descriptografa.

Na verdade é bem simples sim. Vou postar meu código aqui e quem quiser baixar ele fique a vontade..

Tente desvendar o mistério e resolva o desafio!!!

Agora só falta postarem o resultado, ficou fácil né? hehe

Faça download do cript.py

cript.py

  1. #
  2. # Feito em 22/08/2007
  3. #
  4.  
  5. import sys
  6. import string
  7. import base64
  8. import blowfish
  9.  
  10. __author__ = "Felipe Ferreri Tonello <felipe.tonello@gmail.com>"
  11.  
  12. class BFCript:
  13.     """
  14. Classe que usa criptografia Blowfish juntamente com encodificacao Base64
  15.  
  16. uso: cript.py cript|descript ’senha’ ‘texto’
  17.  
  18. PS: Quando for descriptografar, o texto deve estar codificado em Base64
  19.    """
  20.     CRIPTOGRAFAR = 0
  21.     DESCRIPTOGRAFAR = 1
  22.    
  23.     def cript(self,  sKey,  sTxt,  iAction):
  24.         bf = blowfish.Blowfish((len(sKey) < 8 and [string.ljust(sKey, 8)] or [sKey])[0])
  25.        
  26.         if iAction == self.DESCRIPTOGRAFAR:
  27.             sTxt = base64.b64decode(sTxt)
  28.        
  29.         sCript = ""
  30.        
  31.         for i in [x*8 for x in range(0,  len(sTxt)/8+1)] :
  32.             sSBox = sTxt[i:i+8]
  33.             if len(sSBox) > 0 :
  34.                 if iAction == self.CRIPTOGRAFAR:
  35.                     sCript += bf.encrypt(string.ljust(sSBox,  8))
  36.                 elif iAction == self.DESCRIPTOGRAFAR:
  37.                     sCript += bf.decrypt(sSBox)
  38.        
  39.         if iAction == self.CRIPTOGRAFAR:
  40.             return base64.b64encode(sCript)
  41.         elif iAction == self.DESCRIPTOGRAFAR:
  42.             return sCript
  43.  
  44. ##################################################
  45.  
  46. if __name__ == "__main__" :
  47.     bfc = BFCript()
  48.     if len(sys.argv) != 4 or (sys.argv[1] != "cript" and sys.argv[1] != "descript"):
  49.         print BFCript.__doc__
  50.         sys.exit(0)
  51.     elif sys.argv[1] == "cript" :
  52.         print bfc.cript(sys.argv[2], sys.argv[3],  bfc.CRIPTOGRAFAR)
  53.     elif sys.argv[1] == "descript" :
  54.         print bfc.cript(sys.argv[2],  sys.argv[3],  bfc.DESCRIPTOGRAFAR)

Desafio criptografia Blowfish

Tags: , ,
Postado em Artigos, Dicas Python, Python, nerd por Felipe Tonello on the August 23rd, 2007


Ajude a Combater o Spam! Clique aqui!

Eu estou testando esses dias um brute force que estou fazendo, só que para testa-lo eu tive que usar uma criptografia chamada Blowfish. Ela é bem interessante e também opensource. Ela é bem simples de implementar também.

Desafio!!

Agora vamos para o legal.
O desafio é bem simples também.

Quem descriptografar essa mensagem vai ganhar um post aqui no meu blog além de se divertir um pouquinho heheh :)

  1. 9M39agUxnX8PRznCylaC1/6rEXVP5R85QTO/be8XAO+WRJ2nAGDQ4PWq
  2. SOGSQe/CRDkegrH242gpfOcBHPZ6TURUMcQZXkSV8g7WcEIQiCLTuejOt0HCExewS
  3. XUgxg8wRlvO6G2ZrKOv6YLzcsXmBHB/JbZ5nuMnlIYQNGj1ncYHbxyJrGHj1Xr7Q696E+u
  4. WfcZAm9z/iRfZ9rb79EXY7f/5BBEvdkluxDpedPzam33CQLZoEVixSOwVI18USigj45W6fDk+
  5. yFTGkLF1tmh5Zg==

O detalhe é que não existe essas quebras de linha, só coloquei por questão de não destruir o layout.
A senha da mensagem criptografada é: desafio

Blowfish para Python (está em arquivo .txt porque meu servidor não deixa baixar script direto :( )
Blowfish para PHP(pear package)
Blowfish para Java
Blowfish para C++
Blowfish para C
Blowfish para Pascal
Blowfish para Perl

O desafiante pode usar qualquer tipo de linguagem de programação. O Blowfish existe em qualquer linguagem, até Javascript. É só dar uma pesquisada.

Se você não conhecer criptografia e muito menos blowfish, a ideia principal é dar uma pesquisada como que descriptografa usando a técnica blowfish..

PS: Esse desafio é simples, mas existe pegadinhas nele. hehehe :D

Resposta do desafio!