Ошибки памяти Python с помощью Itertool - PullRequest
0 голосов
/ 20 января 2019

У меня есть небольшая программа Bruteforce для школы. Я сделал программу, но когда я запускаю свой код, появляется ошибка памяти ... Вот сообщение от моей IDE:

пароли = ['' .join (слово) для слова в itertools.product (Alphabet, repeat = CharLength)] MemoryError

Полагаю, что большинство ошибок связано с тем, как я использую цикл no? Как нуб, я никогда не встречал этот тип ошибки ... Я даю вам еще 1 информацию, я запускаю свой код на Windows

Как я могу оптимизировать свой код и как его исправить? Вот мой код:

import hashlib
import itertools


#possible characters in user password
Alphabet = ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_.;#@")
#minimum password value
CharLength = 6

#getting passwords and username from shadow file
with open("shadow_test", "r") as ins:
    array = []
    users = []
    passwd = []
    #getting everyline from shadow file into an array
    for line in ins:
        array.append(line)
    #saving only username and passwords
    for pw in array:
        str(pw)
        r= pw.split(":")
        users.append(r[0])
        passwd.append(r[1])

    list = []
    #removing passowrd with * or !
    for mdp in passwd:
        if mdp != '*' and mdp != '!':
            str(mdp)
            list.append(mdp)
            # trying to Bruteforce
            for _ in range(12):
                passwords = [''.join(word) for word in itertools.product(Alphabet, repeat=CharLength)]

                print(*passwords)
                for pswd in passwords:
                    hash_object = hashlib.md5(str.encode(pswd)).hexdigest()
                    # hash_object.update(*passwords.encode('utf-8'))
                    generatedpassword = '$1$' + hash_object

                    for compare in list:
                        for user in users:
                            #print('on cherche le Mot de passe : ' + compare +' pour ' +user)
                            #print('mot de passe MD5 généré : ' +generatedpassword)
                            #print('mot de passe clair généré : ' +pswd)


                            if generatedpassword == list:
                                print('Le Mot de passe pour' + user + ' est : ' + compare)

Ответы [ 2 ]

0 голосов
/ 20 января 2019

В списке password «как есть» будет примерно 100 миллиардов записей, поэтому для его хранения потребуется более 1 ТБ памяти. Вместо того, чтобы делать это списком, оставьте его как генератор для последующего цикла:

passwords = (''.join(word) for word in itertools.product(Alphabet, repeat=CharLength))

(Хотя для 100 миллиардов записей вы, вероятно, будете ждать некоторое время.)

0 голосов
/ 20 января 2019
passwords = [''.join(word) for word in itertools.product(Alphabet, repeat=CharLength)]

Здесь вы создаете список длиной более 50 ** 6. Конечно, вы получите ошибку памяти. Вместо этого используйте генератор:

passwords = (''.join(word) for word in itertools.product(Alphabet, repeat=CharLength))
...