在密码学中,对S盒差分进行线性约束,使用工具LogicFriday
1.生成S盒输出输出差分真值表(.csv文件)
表头记录变量名称,输入输出变量以”,”隔开,如下图,输入变量为a~p,输出变量为y。
其中,输入变量代表S盒输入输出及概率的可能取值,输出变量值全部置1,代表此条变量取值可行。
2.导入真值表,约简布尔表达式
1)Logic Friday导入真值表
得到输出1(所有可行的条目)的布尔表达式约束
2)约简布尔表达式
并将其化为Product of sums形式
3.将多项式转变为约束
对Product of sums的每个乘法因子作为一个条目,转变形式,非记为”a_”,加法的每一项间用”,”隔开,例如,(a+o’)记为[“a”,”o_”]。将条目录入程序中并将变量名改为与布尔表示一致,输出CNF语句的系数约束。
用以下程序将变量表示的系数表转化为系数0,1,5(无)
arr = [["a","b","c","d","e_"],
["b_","e","f","g","h"],
]
var = ["a", "b", "c", "d", "e", "f", "g", "h"]
constraints = [[0 for j in range(len(var))] for i in range(len(arr))]
for i in range(len(arr)):
for j in range(len(var)):
if (var[j] + "_") in arr[i]:
constraints[i][j] = 1
elif ((var[j] + "_") not in arr[i]) and (var[j] in arr[i]):
constraints[i][j] = 0
else:
constraints[i][j] = 5
for i in range(len(arr)):
print(constraints[i], end="")
print(",")