z3python多战俘条件加法

时间:2019-09-14 19:21:38

标签: python z3 z3py

我正在使用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

1 个答案:

答案 0 :(得分:0)

您确实需要发布代码段,人们可以自己尝试看一下正在发生的事情!无法解读您的真正追求。

话虽如此,问题在于您对range(y)的建模。出于显而易见的原因,您无法计算符号值的范围。 y是8位值吗?如果真是这样,那么您只有256个输入;因此,我建议您建立一个查找表并简单地查找它。即使达到16位左右,我也会这样做。任何更大的事情可能都不切实际。但请在提问时张贴MVCE,请点击此处:https://stackoverflow.com/help/minimal-reproducible-example