我想用z3在python中生成一个keygen。这是验证功能:
def f(a):
a = ord(a)
if a <= 47 or a > 57:
if a <= 64 or a > 98:
exit()
else:
return a - 55
else:
return a - 48
def validate(key):
if len(key) != 16:
return False
for k in key:
if f(k)%2== 0:
return False
return True
我试图为此编写一个求解器
from z3 import *
solver = Solver()
def f_z3(a):
return If(
Or(a<=47, a>57),
If(
Or(a<=64, a>98),
False, # exit()???
a -55
),
a -48
)
key = IntVector("key", 16)
for k in key:
solver.add(f_z3(k)%2==0)
solver.check()
print(solver.model())
这是输出
[key__1 = 48,
key__10 = 48,
key__9 = 48,
key__15 = 48,
key__6 = 48,
key__8 = 48,
key__4 = 48,
key__0 = 48,
key__14 = 48,
key__11 = 48,
key__7 = 48,
key__5 = 48,
key__2 = 48,
key__12 = 48,
key__13 = 48,
key__3 = 48]
它返回键“0000000000000000”,但 validate("0000000000000000") 返回 False。
我知道问题出在f_z3
函数上,我不知道怎么表达exit()
里面的 if,我想要的东西总是 False。但相反,我只是返回 False。
知道如何解决这个问题吗?