SHA256 password cracker - brute force

Nov 16 2020

Saya menulis cracker sandi SHA256. Saya awalnya menggunakan daftar untuk menyimpan informasi di list1.txtdan list2.txttetapi saya akhirnya mendapatkan kelebihan memori. Jadi sekarang saya menggunakan file. Saya perhatikan bahwa ketika saya melakukan transisi ini, kecepatan program berkurang drastis. Adakah cara untuk mengoptimalkan kecepatan pemrograman ini tanpa mengalami masalah kelebihan memori?

Terima kasih

import hashlib
import time
import os

def extract_password(fname):
    if fname == 0:
        filename = "list2.txt"
    else:
        filename = "list1.txt"
    for line in open(filename, "r"):
        yield line.strip()


def save_password(fname, password):
    if fname == 0:
        filename = "list1.txt"
    else:
        filename = "list2.txt"

    file = open(filename, "a")
    file.write(password)
    file.write("\n")
    file.close()



def next_password(lsta, item,next_char, secure_password):
    found = 0
    guess = item + chr(next_char)
    if hash_password(guess) == secure_password:
        print(guess)
        found = 1
    save_password(lsta, guess)
    return found

def hash_password(pwrd):
    #Generates hash of original password
    pwrd = pwrd.encode("UTF-8")
    password = hashlib.sha256()
    password.update(pwrd)
    return password.hexdigest()

def delete_file(ltsa):
    try:
        if ltsa == 1:
            os.remove("list2.txt")
        else:
            os.remove("list1.txt")
    except:
        pass

def reset_file_status():
    try:
        os.remove("list2.txt")
        os.remove("list1.txt")
    except:
        pass

def find_password(secure_password):
    #Brute force to find original password
    found = 0
    lsta = 1
    for length in range(1, 15):
        if found == 1: break
        lsta = lsta^1
        delete_file(lsta)
        for next_char in range(65, 123):
            if found == 1: break
            if length == 1:
                found = next_password(lsta, "", next_char, secure_password)
                if found == 1: break
            else:
                for item in extract_password(lsta):
                    found = next_password(lsta, item, next_char, secure_password)
                    if found == 1: break

if __name__ == "__main__":
    reset_file_status()
    start = time.time()
    secure_password = hash_password("AAAA")
    find_password(secure_password)
    print(f"{(time.time() - start)} seconds")

Jawaban

4 LevM. Nov 16 2020 at 06:40

Pengoptimalan yang Anda cari sangat sederhana:
Tanyakan pada diri Anda - apa yang benar-benar perlu saya pertahankan?

Jawabannya: hanya tebakan kata sandi yang saat ini saya periksa.

Tidak perlu menyimpan semua tebakan lama, jadi tidak perlu file atau daftar besar.

Yang Anda perlukan hanyalah satu string yang akan terus diperbarui.

Untuk memvisualisasikannya, anggap string Anda sebagai angka yang terus bertambah, dengan setiap huruf menjadi basis 58 digit.

Sekarang. yang benar-benar Anda butuhkan hanyalah melakukan +1 pada digit pertama, memeriksa carry, dan memperbarui digit berikutnya jika diperlukan seperti penambahan biasa.

Sayangnya, string Python tidak mengizinkan penugasan berdasarkan indeks, tetapi mendukung pemotongan .

Berikut adalah fungsi yang akan menghasilkan kata sandi berurutan yang berjalan melalui semua huruf dan bertambah panjang sesuai kebutuhan (satu kata sandi per panggilan!):

def make_next_guess(guess):
    carry = 1
    next_guess = guess

    for i in range(len(guess)):
        cur_char = ord(guess[i]) + carry
        if cur_char > ord('z'):
            cur_char = ord('A')
            carry = 1
        else:
            carry = 0

        next_guess = next_guess[:i] + chr(cur_char) + guess[i + 1:]
        if carry == 0:
             break

    if carry = 1:
        next_guess += 'A'

    return next_guess

Dengan ini, Anda dapat menggunakan satu loop untuk semua kemungkinan hingga panjang maksimum:

guess = 'A'

for _ in range(58 ** 14): #password maximum length 14 and there are 58 characters that can be used
    
    if hash_password(guess) == secure_password:
        print(guess)
        break

    guess = make_next_guess(guess)