Annonce

Réduire
Aucune annonce.

Casser le chiffrement d'un Zip avec Python

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • Casser le chiffrement d'un Zip avec Python

    Voici un petit script fait rapidement en Python (2) et permettant de casse le chiffrement d'un fichier zip.

    Code:
    from __future__ import print_function
    from zipfile import ZipFile
    import itertools
    import string
    import sys
    
    LENGTH = 5
    TOTAL = sum([len(string.ascii_letters)**i for i in range(1,LENGTH)])
    CHARACTERS = string.ascii_letters
    
    def crack(file):
        nb = 0
        for length in range(1,LENGTH):
            for password in itertools.product(CHARACTERS, repeat=length):
                password = "".join(password)
                print("["+str(nb)+"/"+str(TOTAL)+"] Trying password : "+password,end="\r")
                try:
                    zip = ZipFile(file)
                    zip.extractall(pwd=password)
                    print("\nPassword found !")
                    return password
                except:
                    pass
                nb += 1
    
    crack("test.zip")
    Si vous avez des questions ou des remarques, hésitez pas mais gardez à l'esprit que le but était de faire un truc rapide, pas parfait.

  • #2
    Hello,

    En fait j'ai des doutes sur le fait que se soit rapide, là j'ai pas testé, mais il me semble que tu crackes sur des mots de passe de longueur 1 à 4.

    Si tu augmentes cette longueur, le temps va augmenter de façon exponentielle.

    Question intéressante : Comment améliorer ce code pour le rendre plus efficace à partir d'une certaine longueur du mot de passe ?

    Numpy : Voir ICI
    Cython : Voir ICI
    PyPy : Doit rendre le code déjà deux fois plus rapide

    Après petite chose qu'on pourrait faire à la base pour améliorer, à ton bon vouloir...
    1. Pour décrire l'alphabet,
      Code:
      from string import ascii_letters as ALPHABET
    2. La profondeur LENGTH pourrait se trouver en paramètre de la commande à exécuter (voir sys.argv)
    3. L'addition de nb prend énormément de temps je pense, faut voir !

    Commentaire


    • #3
      Quand je disais rapide, c'était dans le sens où je devais le faire rapidement, pas qu'il s'exécute rapidement.
      Dans tous les cas ce genre d'algorithmes ne sont pas rapides et ce pour plusieurs raisons :
      1. L'opération de dézip en elle même est lente
      2. La complexité des algorithmes de brute force va toujours du polynomiale à l'exponentiel. C'est donc par essence pas performant (si c'était en logarithmique ça pourrait l'être) mais il existe pas (je pense) d'algos de cette complexité pour ces tâches. Donc, si tu te souviens de tes cours de complexité des algorithmes, dans ce genre de cas, les étapes d'initialisation peuvent être considérées comme négligeables et leur temps d'exécution est donc négligé.
      Après, pour tes propositions sur numpy, pypy et cython, je suis d'accord avec toi que ça pourrait aider à améliorer un peu la chose (quand j'aurai du temps je regarderai la complexité des algorithmes qu'ils utilisent).

      Ensuite, pour l'amélioration du reste du code (les trois derniers points), je suis d'accord avec toi, ils amélioreraient la sémantique et l'utilisabilité du truc .

      Globalement, merci pour ton retour. Ça fait plaisir d'avoir un retour extérieur un peu critique.

      Commentaire


      • #4
        Si on parle de performance on peut déjà virer l'affichage à chaque tour, et le coup d'ouvrir le Zip à chaque fois ralentis vraiment ton code.

        Je te conseil, si tu veux augmenter la vitesse, de récupérer le hash un peu "à la John the Ripper" et de bruteforce la dessus.

        Sinon le code reste clair pour un algo fait à l'arrache

        Geluchat.
        Dernière modification par Geluchat, 24 mars 2017, 16h10.

        Commentaire


        • #5
          Au risque de passer pour un con, je ne vois pas ce que tu veux dire pas récupérer un hash.
          Comment est ce qu'un hash du zip m'aiderait à casser son mdp ?

          Pour le rest, j'avoue que tu as 100% raison, j'aurais dû y penser en fait

          Commentaire


          • #6
            Envoyé par Geluchat Voir le message
            Si on parle de performance on peut déjà virer
            Python ! C'est triste à dire mais c'est un langage non adapté à ce type de problème. Cependant il montre un pseudo code fonctionnel pour d'autres langages compilés.

            Et comme dit Anonyme77, algorithmiquement parlant on est dans une complexité inévitable
            Code HTML:
            θ(n x n!)
            , c'est définitivement mort si on dépasse les mots de passe d'une longueur de 5 caractères.

            Commentaire


            • #7
              Je me suis penché sur cython, je gagne sur les mots de passe de longueur 5 un rapport de 3 comparé au code python...

              Ce qui coûte, c'est le

              Code:
              def crack():
                  for password in itertools.product(ALPHABET, repeat=5):
                      password = "".join(password)
              En cython

              Code:
              from libc.string cimport strlen
              from libc.stdlib cimport malloc, free
              
              def allLexicographicRecur (char *str, char* data, int last, int index):
              
                  cdef int i, len = strlen(str)
              
                  for i in range(len):
                      data[index] = str[i]
              
                      if (index == last):
                          res = data[:last]
                      else:
                          allLexicographicRecur (str, data, last, index+1)
              
              cpdef allLexicographic(char *str, int repeat):
              
                  cdef int len = strlen (str)
              
                  cdef char *data = <char *>malloc (sizeof(char) * (len + 1))
                  data[len] = '\0'
              
                  allLexicographicRecur (str, data, repeat-1, 0)
              
                  free(data
              allLexicographic est équivalent aux deux lignes de code présentés ci-dessus. Pour 5 lettres dans un mot de passe, j'ai un temps intéressant
              Code:
              time : 13.704870999999999 # cython
              time : 39.014395 # python
              Pas testé pour 6 lettres, mais ça reste énorme au niveau temps dans tous les cas.
              Dernière modification par fred, 26 mars 2017, 11h38.

              Commentaire


              • #8
                Huuum, pas mal du tout. Et cpython donne un code compilé c'est bien ça (je peux me tromper) ?
                Il'faudrait tester en C pur pour voir mais le code serait tout de suite plus chiant.

                As tu retiré les affichages et les optimisations que Geluchat avait vues ?

                Commentaire


                • #9
                  Envoyé par Anonyme77 Voir le message
                  Huuum, pas mal du tout. Et cpython donne un code compilé c'est bien ça (je peux me tromper) ?
                  Il'faudrait tester en C pur pour voir mais le code serait tout de suite plus chiant.

                  As tu retiré les affichages et les optimisations que Geluchat avait vues ?
                  Attention pas cpython, mais cython, c'est de l'interfaçage Python/C.

                  Pour les affichages et les optimisations, je n'ai rien fais, j'ai juste transcris les 2 lignes ci-dessous


                  Code:
                  def crack():
                      for password in itertools.product(ALPHABET, repeat=5):
                          password = "".join(password)
                  en cython, et utilisant les types statiques... Normalement en C tu gagnerais grosso modo 1 fois et demie sur le code cython, ça ferait de l'ordre des 10 secondes. Après pour ZipFile et les affichages on ne peut rien faire, c'est déjà optimisé via cpython (cette fois-ci c'est le bon terme )

                  Commentaire


                  • #10
                    Envoyé par Anonyme77 Voir le message
                    Au risque de passer pour un con, je ne vois pas ce que tu veux dire pas récupérer un hash.
                    Comment est ce qu'un hash du zip m'aiderait à casser son mdp ?

                    Pour le rest, j'avoue que tu as 100% raison, j'aurais dû y penser en fait
                    https://cybercrimetech.com/2014/07/h...protected.html
                    Après la lib que tu utilises le fait surement

                    Commentaire

                    Chargement...
                    X