Resposta do desafio criptografia Blowfish
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í:
- Mensagem criptografada
- 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
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)

em November 26th, 2007 às 12:57 am
Usando
WordPress 2.3.1
[...] Resposta do desafio! [...]
em February 11th, 2008 às 11:12 pm
Usando
Unbranded Firefox 2.0.0.11 no
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
em February 28th, 2008 às 11:04 pm
Usando
Flock 1.0.9 no
Linux
Parabéns Darlan Campos!!!!!!
Obrigado pela resposta..
Abraços
em April 20th, 2008 às 6:54 pm
Usando
Internet Explorer 6.0 no
Windows XP
Boa noite tenho uma prova criptografado mas não estou conseguindo alquem pode me ajudar?