Я хочу сгенерировать кейген на питоне с помощью z3. вот функция проверки:
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», но проверка («00000000000000000») возвращает False.
Я знаю, что проблема в функции f_z3
, я не знаю, как выразить exit()
внутри if, я всегда хочу что-то False. Но вместо этого я просто возвращаю False.
Любая идея, как решить эту проблему?