我正在使用z3,遇到了以下问题,我想根据当前测试值输出结果。
例如:
from z3 import *
# This returns a statement
def arrayF(y):
return If(y % 8 == 7, 255, If(y % 8 == 6, 127, If(y % 8 == 5, 63, If(y % 8 == 4, 31, If(y % 8 == 3, 15, If(y % 8 == 2, 7, If(y % 8 == 1, 3, If(y % 8 == 0, 1, 0))))))))
KEY_LEN = 16
solver = Solver()
pbInput = [BitVec("{}".format(i), 8) for i in range(KEY_LEN)]
for i in range(KEY_LEN):
solver.add(ascii_printable(pbInput[i]))
# 255 value is taken randomly, not sure there is a solution, this is not the poblem
solver.add(((0x11 & arrayF(pbInput[1])) << (8 - (pbInput[1] % 8))) + (0x11 + pbInput[1]) == 255)
这将提供以下回溯:
Traceback (most recent call last):
File "solve.py", line 12, in <module>
solver.add(((0x11 & arrayF(pbInput[1])) << (8 - (pbInput[1] % 8))) + (0x11 + pbInput[1])) == 255
TypeError: unsupported operand type(s) for &: 'int' and 'instance'
这当然是因为我没有从函数中返回值。我的问题是:如何根据输入实例的值从函数中返回一个值?
这就是应该获得的大回报
def arrayF(y):
z = 0
for i in range(y): # not possible as y in an instance, not an int
z += pow(2, y)
return z
答案 0 :(得分:0)
您确实需要发布代码段,人们可以自己尝试看一下正在发生的事情!无法解读您的真正追求。
话虽如此,问题在于您对range(y)
的建模。出于显而易见的原因,您无法计算符号值的范围。 y
是8位值吗?如果真是这样,那么您只有256个输入;因此,我建议您建立一个查找表并简单地查找它。即使达到16位左右,我也会这样做。任何更大的事情可能都不切实际。但请在提问时张贴MVCE,请点击此处:https://stackoverflow.com/help/minimal-reproducible-example