从布尔函数的真值表求其代数正规型(ANF)

布尔函数简介

在密码学中,布尔函数是加密算法的核心部件之一。

布尔函数指从 F 2 n \mathbb{F}_2^n F2n F 2 \mathbb{F}_2 F2 的映射。

简单举例如下:

一个三元( n = 3 n=3 n=3)布尔函数 F F F 是指从 F 2 3 \mathbb{F}_2^3 F23 F 2 \mathbb{F}_2 F2 的映射。
其中,
F 2 3 = { 000 , 001 , 010 , 011 , 100 , 101 , 110 , 111 } F 2 = { 0 , 1 } \mathbb{F}_2^3=\{000,001,010,011,100,101,110,111\} \\ \mathbb{F}_2=\{0,1\} F23={000,001,010,011,100,101,110,111}F2={0,1}
我们可以认为 x x x F 2 3 \mathbb{F_2^3} F23 中的某个元素,而此时 F ( x ) F(x) F(x) 的值就是 0 0 0 或者 1 1 1

布尔函数表示方法

真值表表示

F F F 符合
F ( 000 ) = 1 ,   F ( 001 ) = 0 F ( 010 ) = 1 ,   F ( 011 ) = 0 F ( 100 ) = 0 ,   F ( 101 ) = 0 F ( 110 ) = 1 ,   F ( 111 ) = 0 F(000) = 1,~ F(001) = 0\\ F(010) = 1,~ F(011) = 0\\ F(100) = 0,~ F(101) = 0\\ F(110) = 1,~ F(111) = 0\\ F(000)=1, F(001)=0F(010)=1, F(011)=0F(100)=0, F(101)=0F(110)=1, F(111)=0
f ( x ) f(x) f(x) 的真值表可以为 { 1 , 0 , 1 , 0 , 0 , 0 , 1 , 0 } \{1,0,1,0,0,0,1,0\} {1,0,1,0,0,0,1,0}

小项表示

布尔函数的小项表示由它的真值表唯一确定。
布尔函数是它取值为1的那些真值指派对应的小项函数之和。

三元布尔函数 F F F 如上所述,则小项表示为:
F ( x ) = x 1 0 x 2 0 x 3 0 + x 1 0 x 2 1 x 3 0 + x 1 1 x 2 1 x 3 0 F(x)=x_1^0x_2^0x_3^0+x_1^0x_2^1x_3^0+x_1^1x_2^1x_3^0 F(x)=x10x20x30+x10x21x30+x11x21x30
其中 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3 分别是 x x x 的三个分量,所以函数 F ( x ) F(x) F(x) 也可以写成 F ( x 1 , x 2 , x 3 ) F(x_1,x_2,x_3) F(x1,x2,x3)
由真值表求小项表示可以仅留下真值为 1 1 1 的部分,标注上标即可(仅为求法,有具体含义)。

ANF(代数范式、代数正规型)

上述布尔函数 F F F 的多项式表示为:
F ( x ) = 1 + x 1 + x 3 + x 1 x 2 + x 1 x 3 + x 1 x 2 x 3 F(x)=1+x_1+x_3+x_1x_2+x_1x_3+x_1x_2x_3 F(x)=1+x1+x3+x1x2+x1x3+x1x2x3
这也称为它的ANF。
由真值表求ANF可通过先求小项表示再展开( x i 0 = x i + 1 ,   x i 1 = x i x_i^0=x_i+1,~x_i^1=x_i xi0=xi+1, xi1=xi)的途径:
这样,小项表示即可展开为多项式表示:
F ( x ) = ( x 1 + 1 ) ( x 2 + 1 ) ( x 3 + 1 ) + ( x 1 + 1 ) x 2 ( x 3 + 1 ) + x 1 x 2 ( x 3 + 1 ) →   F ( x ) = 1 + x 1 + x 3 + x 1 x 2 + x 1 x 3 + x 1 x 2 x 3 F(x)=(x_1+1)(x_2+1)(x_3+1)+(x_1+1)x_2(x_3+1)+x_1x_2(x_3+1)\\ \to~F(x)=1+x_1+x_3+x_1x_2+x_1x_3+x_1x_2x_3 F(x)=(x1+1)(x2+1)(x3+1)+(x1+1)x2(x3+1)+x1x2(x3+1) F(x)=1+x1+x3+x1x2+x1x3+x1x2x3


布尔函数中的运算:1+1=0+0=0,0+1=1+0=1,0*0=0*1=1*0=0,1*1=1


包括递归方式求ANF及其他相关代码:https://gitee.com/ssdreamc/about_boolean_functions

  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,我可以为您提供一个Python程序来计算给定任意4比特和8比特密码S盒的每个输出对应的代数正规以及代数次数。这个程序使用了SymPy库,需要先安装SymPy库。 下面是程序的代码: ```python from sympy import * # 定义GF(2)域上的多项式环 F2 = GF(2)['x'] def binary(n, l): # 将整数n转换为l位的二进制数 return format(n, '0{}b'.format(l)) def poly_from_bin(s): # 将二进制字符串s转换为GF(2)域上的多项式 return F2([int(c) for c in s]) def ANF(sbox): # 计算S盒的代数正规 n = len(sbox) f = [poly_from_bin(binary(sbox[i], n)) for i in range(n)] anf = [f[0]] for i in range(1, n): anf.append(anf[-1]) for j in range(i): anf[-1] = anf[-1] + f[i ^ j] return anf def algebraic_degree(anf): # 计算代数次数 return max([degree(p) for p in anf]) # 4比特S盒 sbox4 = [0x1, 0x3, 0x2, 0x0, 0x6, 0x7, 0x5, 0x4, 0xe, 0xf, 0xd, 0xc, 0x8, 0xa, 0x9, 0xb] # 8比特S盒 sbox8 = [0x3, 0x8, 0xa, 0x2, 0xc, 0xf, 0xb, 0x7, 0x1, 0x6, 0x5, 0x0, 0xd, 0x4, 0xe, 0x9] # 计算4比特S盒的代数正规代数次数 anf4 = ANF(sbox4) deg4 = algebraic_degree(anf4) # 计算8比特S盒的代数正规代数次数 anf8 = ANF(sbox8) deg8 = algebraic_degree(anf8) # 输出结果 print('4比特S盒的代数正规:', anf4) print('4比特S盒的代数次数:', deg4) print('8比特S盒的代数正规:', anf8) print('8比特S盒的代数次数:', deg8) ``` 您可以将程序中的`sbox4`和`sbox8`变量替换为您所需的任意4比特和8比特密码S盒,然后运行程序即可得到每个输出对应的代数正规以及代数次数。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值