-
Notifications
You must be signed in to change notification settings - Fork 0
/
timing_hack.py
96 lines (77 loc) · 3.02 KB
/
timing_hack.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
"""
Брутфорс на основе времени отклика на запрос
"""
import itertools
import random
import string
import timeit
import collections
import numpy as np
allowed_chars = string.ascii_letters + " " + string.digits
password_database = {"sach0k": "put y0ur finger in my ass"}
def check_password(user, guess):
actual = password_database[user]
if len(guess) != len(actual):
return False
for i in range(len(actual)):
if guess[i] != actual[i]:
return False
return True
def random_str(size):
return ''.join(random.choices(allowed_chars, k=size))
def crack_length(user, max_len=50, verbose=False) -> int:
trials = 2000
times = np.empty(max_len)
for i in range(max_len):
i_time = timeit.repeat(stmt='check_password(user, x)',
setup=f'user={user!r};x=random_str({i!r})',
globals=globals(),
number=trials,
repeat=10)
times[i] = min(i_time)
if verbose:
most_likely_n = np.argsort(times)[::-1][:5]
print(most_likely_n, times[most_likely_n] / times[most_likely_n[0]])
most_likely = int(np.argmax(times))
return most_likely
def crack_password(user, length, verbose=False):
guess = random_str(length)
counter = itertools.count()
trials = 1000
while True:
i = next(counter) % length
for c in allowed_chars:
alt = guess[:i] + c + guess[i + 1:]
alt_time = timeit.repeat(stmt='check_password(user, x)',
setup=f'user={user!r};x={alt!r}',
globals=globals(),
number=trials,
repeat=10)
guess_time = timeit.repeat(stmt='check_password(user, x)',
setup=f'user={user!r};x={guess!r}',
globals=globals(),
number=trials,
repeat=10)
if check_password(user, alt):
return alt
if min(alt_time) > min(guess_time):
guess = alt
if verbose:
print(guess)
def main():
inp = [input('user_password (ascii_letters & digits & space): ').split('_')]
if len(inp[0]) == 2 and all(i for i in inp[0]):
password_database.update(inp)
print(inp, file=open('log.ini', 'a'))
user = collections.deque(password_database, maxlen=1)[0]
print(f'username: {user}')
length = crack_length(user, verbose=True)
print(f"pass most likely length {length}")
input("close extra programs and press enter to continue...")
start = timeit.default_timer()
password = crack_password(user, length, verbose=True)
print(f"password cracked:'{password}'")
stop = timeit.default_timer()
print(f'spent time\t{stop - start} sec')
if __name__ == '__main__':
main()