JustRe
第一部分:
两端执行相同操作,看其中一个即可。
from z3 import *
base_data = [0x78B09135,0xE78DBAE5,0xFB0C084A, 0x3B5C0EA2,0x82C7F904,0xF937EE81,0xEB130A06,0x3B4D7202,0x3ACC6A08,0x045A0A49, 0x26E84E1B,0x5513B95C, 0x3B4D8209,0xAD132C0D, 0x044BEE4A,0x61164B1F]
base_data = [0x79B19266, 0x0E88EBBB6, 0x0FC0D093B, 0x3C5D0F73, 0x83C8FA15, 0x0FA38EF92, 0x0EC140B17, 0x3C4E7313, 0x3BCD6B19, 0x55B0B5A,0x27E94F0C,0x5614BA4D,0x3C4E831A,0x0AE142D1E, 0x54CEF5B, 0x62174C10]
func_data = [0x83EC8B55,0xEC81F0E4,0x00000278,0x405004A1,0x89C43300,0x02742484,0x100F0000,0x4041A805,0x41C0A000,0x0F560040,0x2C244411,0x7E0FF357,0x4041B805,0xD60F6600,0x0F402444,0x6A0A4110]
f1 = BitVec('f1', 4*8)
f2 = BitVec('f2', 4*8)
# f1 = Int("f1")
# f2 = Int("f2")
solver = Solver()
for i in range(16):
solver.add(func_data[i] == ((f1 + i) ^ ((0x1010101 * f2) + base_data[i])))
s = solver.check()
m = solver.model()
print hex(int(str(m[f1])))[2:], hex(int(str(m[f2])))[2:]
# 13242218 18
第二部分 密钥为 “AFSAFCEDYCXCXACNDFKDCQXC” 的3des算法。直接算即可
from Crypto.Cipher import DES3
import base64
BS = DES3.block_size
def pad(s):
return s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
def unpad(s):
return s[0:-ord(s[-1])]
class prpcrypt():
def __init__(self, key):
self.key = key
self.mode = DES3.MODE_ECB
def encrypt(self, text):
text = pad(text)
cryptor = DES3.new(self.key, self.mode)
x = len(text) % 8
if x != 0:
text = text + '\0' * (8 - x)
# print(text)
self.ciphertext = cryptor.encrypt(text)
return (self.ciphertext).encode("hex")
def decrypt(self, text):
cryptor = DES3.new(self.key, self.mode)
# de_text = base64.standard_b64decode(text)
plain_text = cryptor.decrypt(text)
st = str(plain_text.decode("utf-8")).rstrip('\0')
print st.encode("hex")
print st
out = unpad(st)
return out
# 507CA9E68709CEFA20D50DCF90BB976C #9090F6B07BA6A4E8
cipher = "507CA9E68709CEFA20D50DCF90BB976C".decode("hex")
p = prpcrypt("AFSAFCEDYCXCXACNDFKDCQXC")
print p.decrypt(cipher)