SHA256 password cracker - brute force
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
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)