Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.
ndhquals2015:game_of_life [2015/04/05 14:43] Spl3en créée |
ndhquals2015:game_of_life [2017/04/09 15:33] (Version actuelle) |
||
---|---|---|---|
Ligne 13: | Ligne 13: | ||
#!/usr/bin/python | #!/usr/bin/python | ||
#-*- coding:utf-8 -*- | #-*- coding:utf-8 -*- | ||
+ | |||
import hashlib, sys, itertools | import hashlib, sys, itertools | ||
+ | |||
def creerGrille(): | def creerGrille(): | ||
result=[] | result=[] | ||
Ligne 24: | Ligne 24: | ||
result.append(ligne) | result.append(ligne) | ||
return result | return result | ||
+ | |||
def genKey(key): | def genKey(key): | ||
psk=hashlib.sha256(key) | psk=hashlib.sha256(key) | ||
Ligne 34: | Ligne 34: | ||
seed+=c | seed+=c | ||
return seed | return seed | ||
+ | |||
def initGrille(grille,seed): | def initGrille(grille,seed): | ||
for (i, j), c in itertools.izip(itertools.product(xrange(len(grille)), reversed(xrange(len(grille[0])))), seed): | for (i, j), c in itertools.izip(itertools.product(xrange(len(grille)), reversed(xrange(len(grille[0])))), seed): | ||
Ligne 70: | Ligne 70: | ||
grille[j][i]='0' | grille[j][i]='0' | ||
return grille | return grille | ||
- | + | ||
+ | |||
def genBitstream(grille,key): | def genBitstream(grille,key): | ||
bitstream='' | bitstream='' | ||
Ligne 77: | Ligne 77: | ||
bitstream+=grille[j][7] | bitstream+=grille[j][7] | ||
return bitstream | return bitstream | ||
+ | |||
def xor(ent1,ent2): | def xor(ent1,ent2): | ||
key=itertools.cycle(ent2) | key=itertools.cycle(ent2) | ||
return ''.join(chr(ord(x) ^ ord(y)) for (x,y) in itertools.izip(ent1, key)) | return ''.join(chr(ord(x) ^ ord(y)) for (x,y) in itertools.izip(ent1, key)) | ||
+ | |||
def wrapper(): | def wrapper(): | ||
key=sys.argv[1] | key=sys.argv[1] | ||
Ligne 93: | Ligne 93: | ||
tourSuivant(grille) | tourSuivant(grille) | ||
print encfile | print encfile | ||
+ | |||
wrapper() | wrapper() | ||
La "clé" est attendue en premier argument, un fichier est attendu en 2ème argument. | La "clé" est attendue en premier argument, un fichier est attendu en 2ème argument. | ||
- | Après lecture du source, on se rend compte que le fichier est XORé grâce à un bitstream déduit à partir de la clé. Néanmoins, ce bitstream n'utilise pas la clé à chaque tour contrairement à ce que la fonction genBitstream laisse supposer. La clé n'est utilisée que pour la génération de la grille du Game of Life. | + | Après lecture du source, on se rend compte que le fichier est XORé grâce à un bitstream déduit à partir de la clé. |
+ | |||
+ | Il faut noter que ce bitstream n'utilise **pas** la clé à chaque tour de boucle, contrairement à ce que la fonction ''genBitstream'' laisse supposer, elle est utilisée uniquement pour la génération de la grille de départ du Game of Life. | ||
- | On essaye donc de rentrer une clé vide, en espérant que la génération de la grille n'impactera pas beaucoup le déchiffrement du fichier : | + | On essaye donc de rentrer une clé vide, en espérant que la génération de la grille sera à peu près similaire à celle qui a été utilisée pour chiffrer le fichier, pour que cela n'impacte pas beaucoup le déchiffrement du fichier : |
spl3en@box:~/Bureau/crypto/liv_GOL$ python jdlv.py "" cipher.txt | spl3en@box:~/Bureau/crypto/liv_GOL$ python jdlv.py "" cipher.txt | ||
Ligne 220: | Ligne 222: | ||
- | Le début du fichier illisible, mais très vite l'état du Game of Life se stabilise dans un état similaire à celui qui à chiffré le texte. | + | Le début du fichier illisible, mais très rapidement, l'état du Game of Life se stabilise dans un état similaire à celui qui à chiffré le texte. |
Par "chance", le flag est à la fin du texte : ''Flag : ToBeAndToLast'' | Par "chance", le flag est à la fin du texte : ''Flag : ToBeAndToLast'' |