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)

4 Comentários para 'Resposta do desafio criptografia Blowfish'

Assine os comentários RSS ou TrackBack para 'Resposta do desafio criptografia Blowfish'.

  1. em November 26th, 2007 às 12:57 am

    Usando WordPress WordPress 2.3.1

    [...] Resposta do desafio! [...]

  2. Darlan Campos disse,

    em February 11th, 2008 às 11:12 pm

    Usando Unbranded Firefox Unbranded Firefox 2.0.0.11 no Linux Linux

    Parabéns, Felipe. Ótimo desafio, pena que só pude ver hoje :)…

    “Parabens, voce conseguiu descriptografar a mensagem. Apesar da senha conter menos de 8 bytes voce resolveu o problema. Na proxima vez do desafio, nao vai ser entregue a senha. hehe http://felipetonello.com/

    []s

  3. em February 28th, 2008 às 11:04 pm

    Usando Flock Flock 1.0.9 no Linux Linux

    Parabéns Darlan Campos!!!!!!

    Obrigado pela resposta..

    Abraços

  4. Edvania disse,

    em April 20th, 2008 às 6:54 pm

    Usando Internet Explorer Internet Explorer 6.0 no Windows Windows XP

    Boa noite tenho uma prova criptografado mas não estou conseguindo alquem pode me ajudar?

Comente!