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)
Desafio criptografia Blowfish
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
-
9M39agUxnX8PRznCylaC1/6rEXVP5R85QTO/be8XAO+WRJ2nAGDQ4PWq
-
SOGSQe/CRDkegrH242gpfOcBHPZ6TURUMcQZXkSV8g7WcEIQiCLTuejOt0HCExewS
-
XUgxg8wRlvO6G2ZrKOv6YLzcsXmBHB/JbZ5nuMnlIYQNGj1ncYHbxyJrGHj1Xr7Q696E+u
-
WfcZAm9z/iRfZ9rb79EXY7f/5BBEvdkluxDpedPzam33CQLZoEVixSOwVI18USigj45W6fDk+
-
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
