Skip to content


Resposta do desafio criptografia Blowfish

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:

$ tail blowfish.py -n 20

A saída será essa:

if __name__ == '__main__':
    key = 'This is a test key'
    cipher = Blowfish (key)    print "Testing encryption:"
    xl = 123456
    xr = 654321
    print "\tPlain text: (%s, %s)" %(xl, xr)
    cl, cr = cipher.cipher (xl, xr, cipher.ENCRYPT)
    print "\tCrypted is: (%s, %s)" %(cl, cr)
    dl, dr = cipher.cipher (cl, cr, cipher.DECRYPT)
    print "\tUnencrypted is: (%s, %s)" %(dl, dr)
    print "Testing buffer encrypt:"
    text = 'testtest'
    print "\tText: %s" %text
    crypted = cipher.encrypt (text)
    print "\tEncrypted: %s" %crypted
    decrypted = cipher.decrypt (crypted)
    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).

import base64
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

#
# Feito em 22/08/2007
#
 
import sys
import string
import base64
import blowfish
 
__author__ = "Felipe Ferreri Tonello <felipe.tonello@gmail.com>"
 
class BFCript:
    """
Classe que usa criptografia Blowfish juntamente com encodificacao Base64
 
uso: cript.py cript|descript 'senha' 'texto'
 
PS: Quando for descriptografar, o texto deve estar codificado em Base64
    """
    CRIPTOGRAFAR = 0
    DESCRIPTOGRAFAR = 1
 
    def cript(self,  sKey,  sTxt,  iAction):
        bf = blowfish.Blowfish((len(sKey) < 8 and [string.ljust(sKey, 8)] or [sKey])[0])
 
        if iAction == self.DESCRIPTOGRAFAR:
            sTxt = base64.b64decode(sTxt)
 
        sCript = ""
 
        for i in [x*8 for x in range(0,  len(sTxt)/8+1)] :
            sSBox = sTxt[i:i+8]
            if len(sSBox) > 0 :
                if iAction == self.CRIPTOGRAFAR:
                    sCript += bf.encrypt(string.ljust(sSBox,  8))
                elif iAction == self.DESCRIPTOGRAFAR:
                    sCript += bf.decrypt(sSBox)
 
        if iAction == self.CRIPTOGRAFAR:
            return base64.b64encode(sCript)
        elif iAction == self.DESCRIPTOGRAFAR:
            return sCript
 
##################################################
 
if __name__ == "__main__" :
    bfc = BFCript()
    if len(sys.argv) != 4 or (sys.argv[1] != "cript" and sys.argv[1] != "descript"):
        print BFCript.__doc__
        sys.exit(0)
    elif sys.argv[1] == "cript" :
        print bfc.cript(sys.argv[2], sys.argv[3],  bfc.CRIPTOGRAFAR)
    elif sys.argv[1] == "descript" :
        print bfc.cript(sys.argv[2],  sys.argv[3],  bfc.DESCRIPTOGRAFAR)

Posted in Articles, Nerd, Python.

Tagged with , , .


6 Responses

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

  1. Darlan Campos says

    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

  2. Felipe Tonello says

    Parabéns Darlan Campos!!!!!!

    Obrigado pela resposta..

    Abraços

  3. Edvania says

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

  4. juliano says

    tenho arquivos criptografados com kruptos 2.0 e digitei a senha errada sei la sem atençao agora preciso dos arquivos se puder me ajudar desde ja agradeço

  5. North says

    No código abaixo, há dois num. de cel, e um end. de email. tentem decifra-lo, caso consigam, envie resposta para os num de cel ou por amil que esta no codigo.

    59 17 13 73 91 11 37 73 37 59 31 17 73 51 59 37 61 59 13 59 03 13 29 67 19 47 27 13 29 51 19 73 53 73 61 73 52 67 73 17 29 07 29 67 92 61 59 67 47 53 19 59 59 17 13 59 67 94 61 47 51 29 50 53 73 07 29 19 59 31 13 19 73 19 59 37 67 29 31 13 73 13 29 27 59 39 29 13 59 39 59 53 29 31 59 62 15 15 22 08 63 22 18 15 04 21 12 12 22 29 11 62 15 15 22 08 63 22 04 21 15 12 22 21 22 29 11 59 31 07 47 59 11 37 59 37 73 47 39 27 73 19 73 31 73 61 47 19 27 74 49 29 13 37 73 47 39 52 67 29 37 29 11 31 73 61 47 19 27 74 71 29 39 52 67 29 37 52 71 19 52 17 59 07 29 67 92 13 59 07 59 73 67 73 27 73 67 47 61 73 61 59 61 59 61 59 67 47 53 19 73 19 59 17 13 59 67 94 61 47 51 29 50 31 87 29 61 59 47 03 59 61 59 59 31 13 19 73 19 59 37 67 29 31 13 73 13 29 52

    1S AS NM K9 X8 BV KH K9 KH 1S JG AS K9 Y3 1S KH D3 1S NM 1S YM NM GH 4T QW HZ RF NM GH Y3 QW K9 2A K9 D3 K9 52 4T K9 AS GH XC GH 4T X9 D3 1S 4T HZ 2A QW 1S 1S AS NM 1S 4T 94 D3 HZ Y3 GH 50 2A K9 XC GH QW 1S JG NM QW K9 QW 1S KH 4T GH JG NM K9 NM GH RF 1S JL GH NM 1S JL 1S 2A GH JG 1S 62 FT FT G1 7B &5 63 7B A7 FT X7 G1 2O G* G* 7B GH BV 62 FT FT G1 7B &5 63 7B X7 2O FT G1 G* 7B 2O 7B GH BV 1S JG XC HZ 1S BV KH 1S KH K9 HZ JL RF K9 QW K9 JG K9 D3 HZ QW G1 RF 74 TR GH NM KH K9 HZ JL 52 4T GH KH GH BV JG K9 D3 HZ QW G1 RF 74 6J GH JL 52 4T GH KH 52 6J QW 52 AS 1S XC GH 4T X9 NM 1S XC 1S K9 4T K9 RF K9 4T HZ D3 K9 D3 1S D3 1S D3 1S 4T HZ 2A QW K9 QW 1S AS NM 1S 4T 94 D3 HZ Y3 GH 50 JG 8Z GH D3 1S HZ YM 1S D3 1S 1S JG NM QW K9 QW 1S KH 4T GH JG NM K9 NM GH 52

    Good lock my friends!

Continuing the Discussion

  1. Desafio criptografia Blowfish | Felipe Tonello linked to this post on November 26, 2007

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



Some HTML is OK

or, reply to this post via trackback.