使用Z3解多个方程

时间:2019-03-10 01:37:52

标签: python z3

我具有以下函数,该函数接受输入字符串和数字以生成哈希,如下所示:

#! /usr/bin/python

def calc_hash(key, num):
    result = 0

    for i in range(len(key)):
        result = (ord(key[i]) + result * 10 - 0x30) % num

    return result

if __name__ == "__main__":
    print hex(calc_hash("you_must_check_this_out", 0x1A5D215))

因此,如果输入字符串是:“ you_must_check_this_out”,数字是:0x1A5D215,则输出将是:0x7cda66

目标是找到一个满足以下条件的输入字符串:

calc_hash(input, 0x1A5D215) == 0xd5
calc_hash(input, 0x28DB) == 0xe5
calc_hash(input, 0x5d1) == 0x19
calc_hash(input, 0xff7ff) == 0x53
calc_hash(input, 0x3eff) == 0x87

我不知道输入字符串的长度,但是对长度的限制是它应该小于或等于30

len(input) <= 30

因此,我编写了以下代码以使用Z3查找解决方案,但是它不起作用。

#! /usr/bin/python

import sys
from z3 import *

def calc_hash(input, num):
    result = 0

    for i in range(len(input)):
        result = (ZeroExt(56, input[i]) + result * 10 - 0x30) % num

    return result

if __name__ == "__main__":
    s = Solver()

    input = [BitVec("input%s" % i, 8) for i in range(10)]

    for i in range(10):
      s.add(input[i] >= 0x20)
      s.add(input[i] <= 0x7E)

    s.add(calc_hash(input,0x1A5D215) == 0xd5)
    s.add(calc_hash(input,0x28DB) == 0xe5)
    s.add(calc_hash(input,0x5d1) == 0x19)
    s.add(calc_hash(input,0xff7ff) == 0x53)
    s.add(calc_hash(input,0x3eff) == 0x87)

    print s.check()

    print s.model()

可以在代码中更改输入的长度以尝试不同的长度。

上面的代码是否有问题?

0 个答案:

没有答案