[Python] 纯文本查看 复制代码
import struct
enc_data = bytes([
0x7A, 0x38, 0x16, 0xB0, 0x6F, 0x0C, 0x7E, 0x4F,
0xCC, 0xBA, 0x72, 0x3C, 0x19, 0xCF, 0xA1, 0xF7,
0x4A, 0xC7, 0x2F, 0xA8, 0xB7, 0xA3, 0xD2, 0xD5,
0x82, 0x32
])
cmp_1 = bytes([
0xA0, 0x15, 0xA1, 0x8A, 0xDB, 0x10, 0x20, 0xFC,
0x26, 0xDE, 0x11, 0x2B, 0xE4, 0x82, 0x4A, 0xB8,
0xA0, 0x07, 0x57, 0xCA, 0xCE, 0x9A, 0x08, 0xB2,
0xB0, 0x8E, 0xAF, 0xF7, 0xE9, 0xBE, 0x54, 0xF9
])
cmp_2 = bytes([
0x44, 0xF1, 0xCA, 0x59, 0x2E, 0x31, 0x60, 0xE1,
0x38, 0xE1, 0xFE, 0x28, 0x3F, 0xDE, 0x8E, 0x9A,
0xBA, 0x0B, 0x4A, 0x95, 0x0A, 0x07, 0xF7, 0x31,
0x62, 0xCC, 0xD3, 0xAA, 0xCD, 0xE7, 0x7A, 0x2F
])
def ror8(v, n):
v &= 0xFF
n &= 7
return ((v >> n) | (v << (8 - n))) & 0xFF if n else v
def crack():
M = 0xFFFFFFFF
answer = bytes(a ^ b for a, b in zip(cmp_1, cmp_2))
t = struct.unpack('<8I', answer)
h7 = t[7]
h0 = t[0] ^ h7 ^ 0x6E24F083
h = [h0, t[1], t[2], t[3], t[4], t[5], t[6], h7]
def reverse(old, new):
s = (new - 1847914627) & M
s ^= 0xC2B2AE35
s = (s + 2048144777) & M
s ^= 0x9E3779B9
return old ^ ((s - old) & M)
parts = [h[0]]
for i in range(7):
parts.append(reverse(h[i], h[i + 1]))
assert parts[7] == 0
pwd = b''.join(struct.pack('<I', p) for p in parts[:7])
return pwd.decode()
def check(pwd):
h1 = 5381
for c in pwd.encode():
h1 = (c ^ (33 * h1)) & 0xFFFFFFFF
h2 = 0xCBF29CE484222325
for c in pwd.encode():
h2 = ((c ^ h2) * 0x100000001B3) & 0xFFFFFFFFFFFFFFFF
if h1 == 0x70CC3975 and h2 == 0x1241B5FD075B5519:
print("ok")
else:
print("failed")
if __name__ == '__main__':
pwd = crack()
print(pwd)
check(pwd)