В том, как вы это закодировали, есть несколько неправильных вещей, но я думаю, что есть более фундаментальная проблема в том, как вы подходите к этой проблеме. В конце концов, все, что вы делаете, это просите Z3 найти вам два списка целых чисел длиной 31 (с 31 * 8 = 248), так что их поэлементный xor является шифром. И это делает это прекрасно. Чтобы увидеть, я добавил в вашу программу следующее:
S.check()
m = S.model()
mesg = [m.eval(i).as_long() for i in message]
key = [m.eval(i).as_long() for i in key]
cipher = [int(i, 16) for i in ctext]
check = [m ^ k for (m, k) in zip(mesg, key)]
print cipher == check
И он печатает:
True
Итак, решение действительно «правильное», Z3 сделал именно то, что вы просили делать.
Очевидно, это не то, что вы «хотели» сделать! С помощью XOR-шифрования вы получите ответ для каждого ключа и каждого зашифрованного текста. Вам нужны дополнительные ограничения. (Ваше ограничение «только для ascii» исключает кучу решений, но опять же, это не фокусируется на реальной проблеме.)
Итак, у вас есть два варианта: перебрать все решения и посмотреть какой из них вам нравится, или как-то еще ограничите проблему, чтобы получить уникальное решение. Но ни один из них на самом деле не жизнеспособен: во-первых, пространство для решения столь велико, что ваш компьютер (и вы) будут давно мертвы, прежде чем вы пройдете через каждый из них. Во-вторых, вам просто не хватает информации из того, что вы описали, чтобы получить уникальную модель.
И это совсем не удивительно: в конце концов, это в известном смысле как «одноразовый блокнот», и он идеален: нет никакой информации, которую вы могли бы почерпнуть из зашифрованного текста, который позволил бы вам сузить пространство поиска.
Надеюсь, что вы попадете на правильный путь. Как только у вас появятся другие ограничения, мы можем поговорить о том, как на самом деле кодировать его в z3py. (В частности, вы должны использовать операции BV, не смешивать целые числа с битовыми векторами и стараться не выполнять присваивания, как вы. Но все это обсуждение является спорным, так как используемый здесь метод грубой силы просто нежизнеспособен.)