Z3Py:如何以最有效的方式实现和约束位向量LUT的输入

Z3Py:如何以最有效的方式实现和约束位向量LUT的输入,z3,z3py,Z3,Z3py,我尝试使用Z3Py作为SMT解算器,为具有内部状态条件的DES类型算法生成密码/密钥/普通对。解算器已运行很长时间,尚未找到解决方案。如何改进代码以实现执行时间的大幅加速 让我先解释一下算法、代码和问题 应使用SMT解算器建模的算法是一种DES类型的加密算法,包含16轮,包括置换、位移位、异或和替换框。最后一个函数实际上是密码的一小部分的查找表,它将6位输入映射到4位输出。每轮包括从30位输入向量中提取5个6位向量,应用LUT,并将5个4位向量串联到20位。任务是在每一轮中生成仅使用某些LUT的

我尝试使用Z3Py作为SMT解算器,为具有内部状态条件的DES类型算法生成密码/密钥/普通对。解算器已运行很长时间,尚未找到解决方案。如何改进代码以实现执行时间的大幅加速

让我先解释一下算法、代码和问题

应使用SMT解算器建模的算法是一种DES类型的加密算法,包含16轮,包括置换、位移位、异或和替换框。最后一个函数实际上是密码的一小部分的查找表,它将6位输入映射到4位输出。每轮包括从30位输入向量中提取5个6位向量,应用LUT,并将5个4位向量串联到20位。任务是在每一轮中生成仅使用某些LUT的密码/密钥/普通对

下面是一个完整的可执行示例,它删除了所有不重要的位操作,以关注问题语句

棘手的部分(我不确定的地方)是LUT部分,它应该是一个查找表。LUT作为一项功能实现:

LUT = [Function('LUT_%s' %i, BitVecSort(6), BitVecSort(4)) for i in range(5)]
在我的python列表中,无效条目被标记为-1,所有非-1的值都被添加到函数中,如代码示例中所示,定义LUT映射

对于每轮k,计算每个单独LUT的输入。 添加了一个约束,因此LUT输入应不等于所有无效条目。这在
#向约束添加无效LUT输入
下的代码示例中进行了描述。该解算器具有约2560个此类约束

问题:解算器正在合理的时间内执行并找到10-11轮的配对(
M
,在下面的代码示例中)。对于12轮,解算器无法在2小时内找到结果。表中提供了该示例的更详细分析

M 时间(s) 6. 0.3 7. 0.8 8. 3. 9 4.6 10 66 11 177
如果您发布人们可以按原样加载和运行的实际代码,堆栈溢出效果最好;很难从这些小片段中看出什么是错误的。关于您的LUT:为什么不使用一个常规的Python函数:也就是说,使它成为一个接受6位字并生成4位字的函数;而不是声明一个未解释的函数并添加关于它的假设?我认为前者会更好。但是,同样,您应该发布人们可以运行并观察问题的实际代码。