Boolean functions - Cryptography (original) (raw)

Those functions are used for example in LFSR based ciphers like the filter generator or the combination generator.

This module allows to study properties linked to spectral analysis, and also algebraic immunity.

EXAMPLES:

Sage

sage: # needs sage.rings.finite_rings sage: R. = GF(2^8,'a')[] sage: from sage.crypto.boolean_function import BooleanFunction sage: B = BooleanFunction(x^254); B # the Boolean function Tr(x^254) Boolean function with 8 variables sage: B.nonlinearity() 112 sage: B.algebraic_immunity() # needs sage.rings.polynomial.pbori 4

Python

from sage.all import *

needs sage.rings.finite_rings

R = GF(Integer(2)Integer(8),'a')['x']; (x,) = R._first_ngens(1) from sage.crypto.boolean_function import BooleanFunction B = BooleanFunction(xInteger(254)); B # the Boolean function Tr(x^254) Boolean function with 8 variables B.nonlinearity() 112 B.algebraic_immunity() # needs sage.rings.polynomial.pbori 4

AUTHOR:

class sage.crypto.boolean_function.BooleanFunction[source]

Bases: SageObject

This module implements Boolean functions represented as a truth table.

We can construct a Boolean Function from either:

EXAMPLES:

from the number of variables:

Sage

sage: from sage.crypto.boolean_function import BooleanFunction sage: BooleanFunction(5) Boolean function with 5 variables

Python

from sage.all import * from sage.crypto.boolean_function import BooleanFunction BooleanFunction(Integer(5)) Boolean function with 5 variables

from a truth table:

Sage

sage: BooleanFunction([1,0,0,1]) Boolean function with 2 variables

Python

from sage.all import * BooleanFunction([Integer(1),Integer(0),Integer(0),Integer(1)]) Boolean function with 2 variables

note that elements can be of different types:

Sage

sage: B = BooleanFunction([False, sqrt(2)]); B # needs sage.symbolic Boolean function with 1 variable sage: [b for b in B] # needs sage.symbolic [False, True]

Python

from sage.all import * B = BooleanFunction([False, sqrt(Integer(2))]); B # needs sage.symbolic Boolean function with 1 variable [b for b in B] # needs sage.symbolic [False, True]

from a string:

Sage

sage: BooleanFunction("111e") Boolean function with 4 variables

Python

from sage.all import * BooleanFunction("111e") Boolean function with 4 variables

from a sage.rings.polynomial.pbori.BooleanPolynomial:

Sage

sage: R.<x,y,z> = BooleanPolynomialRing(3) # needs sage.rings.polynomial.pbori sage: P = x*y # needs sage.rings.polynomial.pbori sage: BooleanFunction(P) # needs sage.rings.polynomial.pbori Boolean function with 3 variables

Python

from sage.all import * R = BooleanPolynomialRing(Integer(3), names=('x', 'y', 'z',)); (x, y, z,) = R._first_ngens(3)# needs sage.rings.polynomial.pbori P = x*y # needs sage.rings.polynomial.pbori BooleanFunction(P) # needs sage.rings.polynomial.pbori Boolean function with 3 variables

from a polynomial over a binary field:

Sage

sage: R. = GF(2^8,'a')[] # needs sage.rings.finite_rings sage: B = BooleanFunction(x^7); B # needs sage.rings.finite_rings Boolean function with 8 variables

Python

from sage.all import * R = GF(Integer(2)Integer(8),'a')['x']; (x,) = R._first_ngens(1)# needs sage.rings.finite_rings B = BooleanFunction(xInteger(7)); B # needs sage.rings.finite_rings Boolean function with 8 variables

two failure cases:

Sage

sage: BooleanFunction(sqrt(2)) # needs sage.symbolic Traceback (most recent call last): ... TypeError: unable to init the Boolean function

sage: BooleanFunction([1, 0, 1]) Traceback (most recent call last): ... ValueError: the length of the truth table must be a power of 2

Python

from sage.all import * BooleanFunction(sqrt(Integer(2))) # needs sage.symbolic Traceback (most recent call last): ... TypeError: unable to init the Boolean function

BooleanFunction([Integer(1), Integer(0), Integer(1)]) Traceback (most recent call last): ... ValueError: the length of the truth table must be a power of 2

absolut_indicator(*args, **kwds)[source]

Deprecated: Use absolute_indicator() instead. See Issue #28001 for details.

absolute_autocorrelation()[source]

Return the absolute autocorrelation of the function.

EXAMPLES:

Sage

sage: from sage.crypto.boolean_function import BooleanFunction sage: B = BooleanFunction("7969817CC5893BA6AC326E47619F5AD0") sage: sorted(B.absolute_autocorrelation().items()) [(0, 33), (8, 58), (16, 28), (24, 6), (32, 2), (128, 1)]

Python

from sage.all import * from sage.crypto.boolean_function import BooleanFunction B = BooleanFunction("7969817CC5893BA6AC326E47619F5AD0") sorted(B.absolute_autocorrelation().items()) [(0, 33), (8, 58), (16, 28), (24, 6), (32, 2), (128, 1)]

absolute_indicator()[source]

Return the absolute indicator of the function.

The absolute indicator is defined as the maximal absolute value of the autocorrelation.

EXAMPLES:

Sage

sage: from sage.crypto.boolean_function import BooleanFunction sage: B = BooleanFunction("7969817CC5893BA6AC326E47619F5AD0") sage: B.absolute_indicator() 32

Python

from sage.all import * from sage.crypto.boolean_function import BooleanFunction B = BooleanFunction("7969817CC5893BA6AC326E47619F5AD0") B.absolute_indicator() 32

The old method’s name contained a typo, it is deprecated:

Sage

sage: B.absolut_indicator() doctest:warning ... DeprecationWarning: absolut_indicator is deprecated. Please use absolute_indicator instead. See https://github.com/sagemath/sage/issues/28001 for details. 32

Python

from sage.all import * B.absolut_indicator() doctest:warning ... DeprecationWarning: absolut_indicator is deprecated. Please use absolute_indicator instead. See https://github.com/sagemath/sage/issues/28001 for details. 32

absolute_walsh_spectrum()[source]

Return the absolute Walsh spectrum fo the function.

EXAMPLES:

Sage

sage: from sage.crypto.boolean_function import BooleanFunction sage: B = BooleanFunction("7969817CC5893BA6AC326E47619F5AD0") sage: sorted(B.absolute_walsh_spectrum().items()) [(0, 64), (16, 64)]

sage: B = BooleanFunction("0113077C165E76A8") sage: B.absolute_walsh_spectrum() {8: 64}

Python

from sage.all import * from sage.crypto.boolean_function import BooleanFunction B = BooleanFunction("7969817CC5893BA6AC326E47619F5AD0") sorted(B.absolute_walsh_spectrum().items()) [(0, 64), (16, 64)]

B = BooleanFunction("0113077C165E76A8") B.absolute_walsh_spectrum() {8: 64}

algebraic_degree()[source]

Return the algebraic degree of this Boolean function.

The algebraic degree of a Boolean function is defined as the degree of its algebraic normal form. Note that the degree of the constant zero function is defined to be equal to \(-1\).

EXAMPLES:

Sage

sage: # needs sage.rings.polynomial.pbori sage: from sage.crypto.boolean_function import BooleanFunction sage: B.<x0, x1, x2, x3> = BooleanPolynomialRing() sage: f = BooleanFunction(x1x2 + x1x2*x3 + x1) sage: f.algebraic_degree() 3 sage: g = BooleanFunction([0, 0]) sage: g.algebraic_degree() -1

Python

from sage.all import *

needs sage.rings.polynomial.pbori

from sage.crypto.boolean_function import BooleanFunction B = BooleanPolynomialRing(names=('x0', 'x1', 'x2', 'x3',)); (x0, x1, x2, x3,) = B._first_ngens(4) f = BooleanFunction(x1x2 + x1x2*x3 + x1) f.algebraic_degree() 3 g = BooleanFunction([Integer(0), Integer(0)]) g.algebraic_degree() -1

algebraic_immunity(annihilator=False)[source]

Return the algebraic immunity of the Boolean function.

This is the smallest integer \(i\) such that there exists a nontrivial annihilator for self or ~self.

INPUT:

EXAMPLES:

Sage

sage: # needs sage.rings.polynomial.pbori sage: from sage.crypto.boolean_function import BooleanFunction sage: R.<x0,x1,x2,x3,x4,x5> = BooleanPolynomialRing(6) sage: B = BooleanFunction(x0x1 + x1x2 + x2x3 + x3x4 + x4x5) sage: B.algebraic_immunity(annihilator=True) (2, x0x1 + x1x2 + x2x3 + x3x4 + x4x5 + 1) sage: B[0] += 1 sage: B.algebraic_immunity() 2

sage: # needs sage.rings.finite_rings sage.rings.polynomial.pbori sage: R. = GF(2^8,'a')[] sage: B = BooleanFunction(x^31) sage: B.algebraic_immunity() 4

Python

from sage.all import *

needs sage.rings.polynomial.pbori

from sage.crypto.boolean_function import BooleanFunction R = BooleanPolynomialRing(Integer(6), names=('x0', 'x1', 'x2', 'x3', 'x4', 'x5',)); (x0, x1, x2, x3, x4, x5,) = R._first_ngens(6) B = BooleanFunction(x0x1 + x1x2 + x2x3 + x3x4 + x4x5) B.algebraic_immunity(annihilator=True) (2, x0x1 + x1x2 + x2x3 + x3x4 + x4x5 + 1) B[Integer(0)] += Integer(1) B.algebraic_immunity() 2

needs sage.rings.finite_rings sage.rings.polynomial.pbori

R = GF(Integer(2)Integer(8),'a')['x']; (x,) = R._first_ngens(1) B = BooleanFunction(xInteger(31)) B.algebraic_immunity() 4

algebraic_normal_form()[source]

Return the sage.rings.polynomial.pbori.BooleanPolynomialcorresponding to the algebraic normal form.

EXAMPLES:

Sage

sage: from sage.crypto.boolean_function import BooleanFunction sage: B = BooleanFunction([0,1,1,0,1,0,1,1]) sage: P = B.algebraic_normal_form(); P # needs sage.rings.polynomial.pbori x0x1x2 + x0 + x1*x2 + x1 + x2 sage: [P(*ZZ(i).digits(base=2, padto=3)) for i in range(8)] # needs sage.rings.polynomial.pbori [0, 1, 1, 0, 1, 0, 1, 1]

Python

from sage.all import * from sage.crypto.boolean_function import BooleanFunction B = BooleanFunction([Integer(0),Integer(1),Integer(1),Integer(0),Integer(1),Integer(0),Integer(1),Integer(1)]) P = B.algebraic_normal_form(); P # needs sage.rings.polynomial.pbori x0x1x2 + x0 + x1*x2 + x1 + x2 [P(*ZZ(i).digits(base=Integer(2), padto=Integer(3))) for i in range(Integer(8))] # needs sage.rings.polynomial.pbori [0, 1, 1, 0, 1, 0, 1, 1]

annihilator(d, dim=False)[source]

Return (if it exists) an annihilator of the boolean function of degree at most \(d\), that is a Boolean polynomial \(g\) such that

\[f(x)g(x) = 0 \forall x.\]

INPUT:

EXAMPLES:

Sage

sage: from sage.crypto.boolean_function import BooleanFunction sage: f = BooleanFunction("7969817CC5893BA6AC326E47619F5AD0") sage: f.annihilator(1) is None # needs sage.rings.polynomial.pbori True sage: g = BooleanFunction(f.annihilator(3)) # needs sage.rings.polynomial.pbori sage: set(fi*g(i) for i,fi in enumerate(f)) # needs sage.rings.polynomial.pbori {0}

Python

from sage.all import * from sage.crypto.boolean_function import BooleanFunction f = BooleanFunction("7969817CC5893BA6AC326E47619F5AD0") f.annihilator(Integer(1)) is None # needs sage.rings.polynomial.pbori True g = BooleanFunction(f.annihilator(Integer(3))) # needs sage.rings.polynomial.pbori set(fi*g(i) for i,fi in enumerate(f)) # needs sage.rings.polynomial.pbori {0}

autocorrelation()[source]

Return the autocorrelation of the function, defined by

\[\Delta_f(j) = \sum_{i\in\{0,1\}^n} (-1)^{f(i)\oplus f(i\oplus j)}.\]

EXAMPLES:

Sage

sage: from sage.crypto.boolean_function import BooleanFunction sage: B = BooleanFunction("03") sage: B.autocorrelation() (8, 8, 0, 0, 0, 0, 0, 0)

Python

from sage.all import * from sage.crypto.boolean_function import BooleanFunction B = BooleanFunction("03") B.autocorrelation() (8, 8, 0, 0, 0, 0, 0, 0)

correlation_immunity()[source]

Return the maximum value \(m\) such that the function is correlation immune of order \(m\).

A Boolean function is said to be correlation immune of order\(m\) if the output of the function is statistically independent of the combination of any \(m\) of its inputs.

EXAMPLES:

Sage

sage: from sage.crypto.boolean_function import BooleanFunction sage: B = BooleanFunction("7969817CC5893BA6AC326E47619F5AD0") sage: B.correlation_immunity() 2

Python

from sage.all import * from sage.crypto.boolean_function import BooleanFunction B = BooleanFunction("7969817CC5893BA6AC326E47619F5AD0") B.correlation_immunity() 2

derivative(u)[source]

Return the derivative in direction of u.

INPUT:

The derivative of \(f\) in direction of \(u\) is defined as\(x \mapsto f(x) + f(x + u)\).

EXAMPLES:

Sage

sage: # needs sage.rings.polynomial.pbori sage: from sage.crypto.boolean_function import BooleanFunction sage: f = BooleanFunction([0,1,0,1,0,1,0,1]) sage: f.derivative(1).algebraic_normal_form() 1 sage: u = [1,0,0] sage: f.derivative(u).algebraic_normal_form() 1 sage: v = vector(GF(2), u) # needs sage.modules sage: f.derivative(v).algebraic_normal_form() # needs sage.modules 1 sage: f.derivative(8).algebraic_normal_form() Traceback (most recent call last): ... IndexError: index out of bound

Python

from sage.all import *

needs sage.rings.polynomial.pbori

from sage.crypto.boolean_function import BooleanFunction f = BooleanFunction([Integer(0),Integer(1),Integer(0),Integer(1),Integer(0),Integer(1),Integer(0),Integer(1)]) f.derivative(Integer(1)).algebraic_normal_form() 1 u = [Integer(1),Integer(0),Integer(0)] f.derivative(u).algebraic_normal_form() 1 v = vector(GF(Integer(2)), u) # needs sage.modules f.derivative(v).algebraic_normal_form() # needs sage.modules 1 f.derivative(Integer(8)).algebraic_normal_form() Traceback (most recent call last): ... IndexError: index out of bound

has_linear_structure()[source]

Return True if this function has a linear structure.

An \(n\)-variable Boolean function \(f\) has a linear structure if there exists a nonzero \(a \in \GF{2}^n\) such that\(f(x \oplus a) \oplus f(x)\) is a constant function.

EXAMPLES:

Sage

sage: from sage.crypto.boolean_function import BooleanFunction sage: f = BooleanFunction([0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0]) sage: f.has_linear_structure() True sage: f.autocorrelation() (16, -16, 0, 0, 0, 0, 0, 0, -16, 16, 0, 0, 0, 0, 0, 0) sage: g = BooleanFunction([0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1]) sage: g.has_linear_structure() False sage: g.autocorrelation() (16, 4, 4, 4, 4, -4, -4, -4, -4, 4, -4, -4, -4, 4, -4, -4)

Python

from sage.all import * from sage.crypto.boolean_function import BooleanFunction f = BooleanFunction([Integer(0), Integer(1), Integer(0), Integer(1), Integer(1), Integer(0), Integer(0), Integer(1), Integer(1), Integer(0), Integer(1), Integer(0), Integer(0), Integer(1), Integer(1), Integer(0)]) f.has_linear_structure() True f.autocorrelation() (16, -16, 0, 0, 0, 0, 0, 0, -16, 16, 0, 0, 0, 0, 0, 0) g = BooleanFunction([Integer(0), Integer(1), Integer(1), Integer(1), Integer(0), Integer(0), Integer(0), Integer(0), Integer(1), Integer(0), Integer(1), Integer(1), Integer(1), Integer(0), Integer(1), Integer(1)]) g.has_linear_structure() False g.autocorrelation() (16, 4, 4, 4, 4, -4, -4, -4, -4, 4, -4, -4, -4, 4, -4, -4)

is_balanced()[source]

Return True if the function takes the value True half of the time.

EXAMPLES:

Sage

sage: from sage.crypto.boolean_function import BooleanFunction sage: B = BooleanFunction(1) sage: B.is_balanced() False sage: B[0] = True sage: B.is_balanced() True

Python

from sage.all import * from sage.crypto.boolean_function import BooleanFunction B = BooleanFunction(Integer(1)) B.is_balanced() False B[Integer(0)] = True B.is_balanced() True

is_bent()[source]

Return True if the function is bent.

EXAMPLES:

Sage

sage: from sage.crypto.boolean_function import BooleanFunction sage: B = BooleanFunction("0113077C165E76A8") sage: B.is_bent() True

Python

from sage.all import * from sage.crypto.boolean_function import BooleanFunction B = BooleanFunction("0113077C165E76A8") B.is_bent() True

is_linear_structure(val)[source]

Return True if val is a linear structure of this Boolean function.

INPUT:

EXAMPLES:

Sage

sage: from sage.crypto.boolean_function import BooleanFunction sage: f = BooleanFunction([0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0]) sage: f.is_linear_structure(1) True sage: l = [1, 0, 0, 1] sage: f.is_linear_structure(l) True sage: v = vector(GF(2), l) sage: f.is_linear_structure(v) True sage: f.is_linear_structure(7) False sage: f.is_linear_structure(20) # parameter is out of range Traceback (most recent call last): ... IndexError: index out of range sage: v = vector(GF(3), [1, 0, 1, 1]) sage: f.is_linear_structure(v) Traceback (most recent call last): ... TypeError: base ring of input vector must be GF(2) sage: v = vector(GF(2), [1, 0, 1, 1, 1]) sage: f.is_linear_structure(v) Traceback (most recent call last): ... TypeError: input vector must be an element of a vector space with dimension 4 sage: f.is_linear_structure('X') # failure case Traceback (most recent call last): ... TypeError: cannot compute is_linear_structure() using parameter X

Python

from sage.all import * from sage.crypto.boolean_function import BooleanFunction f = BooleanFunction([Integer(0), Integer(1), Integer(0), Integer(1), Integer(1), Integer(0), Integer(0), Integer(1), Integer(1), Integer(0), Integer(1), Integer(0), Integer(0), Integer(1), Integer(1), Integer(0)]) f.is_linear_structure(Integer(1)) True l = [Integer(1), Integer(0), Integer(0), Integer(1)] f.is_linear_structure(l) True v = vector(GF(Integer(2)), l) f.is_linear_structure(v) True f.is_linear_structure(Integer(7)) False f.is_linear_structure(Integer(20)) # parameter is out of range Traceback (most recent call last): ... IndexError: index out of range v = vector(GF(Integer(3)), [Integer(1), Integer(0), Integer(1), Integer(1)]) f.is_linear_structure(v) Traceback (most recent call last): ... TypeError: base ring of input vector must be GF(2) v = vector(GF(Integer(2)), [Integer(1), Integer(0), Integer(1), Integer(1), Integer(1)]) f.is_linear_structure(v) Traceback (most recent call last): ... TypeError: input vector must be an element of a vector space with dimension 4 f.is_linear_structure('X') # failure case Traceback (most recent call last): ... TypeError: cannot compute is_linear_structure() using parameter X

is_plateaued()[source]

Return True if this function is plateaued, i.e. its Walsh transform takes at most three values \(0\) and \(\pm \lambda\), where \(\lambda\) is some positive integer.

EXAMPLES:

Sage

sage: # needs sage.rings.polynomial.pbori sage: from sage.crypto.boolean_function import BooleanFunction sage: R.<x0, x1, x2, x3> = BooleanPolynomialRing() sage: f = BooleanFunction(x0*x1 + x2 + x3) sage: f.walsh_hadamard_transform() (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, -8) sage: f.is_plateaued() True

Python

from sage.all import *

needs sage.rings.polynomial.pbori

from sage.crypto.boolean_function import BooleanFunction R = BooleanPolynomialRing(names=('x0', 'x1', 'x2', 'x3',)); (x0, x1, x2, x3,) = R._first_ngens(4) f = BooleanFunction(x0*x1 + x2 + x3) f.walsh_hadamard_transform() (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, -8) f.is_plateaued() True

is_symmetric()[source]

Return True if the function is symmetric, i.e. invariant under permutation of its input bits.

Another way to see it is that the output depends only on the Hamming weight of the input.

EXAMPLES:

Sage

sage: from sage.crypto.boolean_function import BooleanFunction sage: B = BooleanFunction(5) sage: B[3] = 1 sage: B.is_symmetric() False sage: V_B = [0, 1, 1, 0, 1, 0] sage: for i in srange(32): B[i] = V_B[i.popcount()] sage: B.is_symmetric() True

Python

from sage.all import * from sage.crypto.boolean_function import BooleanFunction B = BooleanFunction(Integer(5)) B[Integer(3)] = Integer(1) B.is_symmetric() False V_B = [Integer(0), Integer(1), Integer(1), Integer(0), Integer(1), Integer(0)] for i in srange(Integer(32)): B[i] = V_B[i.popcount()] B.is_symmetric() True

linear_structures()[source]

Return all linear structures of this Boolean function as a vector subspace of \(\GF{2}^n\).

EXAMPLES:

Sage

sage: # needs sage.modules sage: from sage.crypto.boolean_function import BooleanFunction sage: f = BooleanFunction([0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0]) sage: LS = f.linear_structures() sage: LS.dimension() 2 sage: LS.basis_matrix() [1 0 0 0] [0 0 0 1] sage: LS.list() [(0, 0, 0, 0), (1, 0, 0, 0), (0, 0, 0, 1), (1, 0, 0, 1)]

Python

from sage.all import *

needs sage.modules

from sage.crypto.boolean_function import BooleanFunction f = BooleanFunction([Integer(0), Integer(1), Integer(0), Integer(1), Integer(1), Integer(0), Integer(0), Integer(1), Integer(1), Integer(0), Integer(1), Integer(0), Integer(0), Integer(1), Integer(1), Integer(0)]) LS = f.linear_structures() LS.dimension() 2 LS.basis_matrix() [1 0 0 0] [0 0 0 1] LS.list() [(0, 0, 0, 0), (1, 0, 0, 0), (0, 0, 0, 1), (1, 0, 0, 1)]

nonlinearity()[source]

Return the nonlinearity of the function.

This is the distance to the linear functions, or the number of output ones need to change to obtain a linear function.

EXAMPLES:

Sage

sage: from sage.crypto.boolean_function import BooleanFunction sage: B = BooleanFunction(5) sage: B[1] = B[3] = 1 sage: B.nonlinearity() 2 sage: B = BooleanFunction("0113077C165E76A8") sage: B.nonlinearity() 28

Python

from sage.all import * from sage.crypto.boolean_function import BooleanFunction B = BooleanFunction(Integer(5)) B[Integer(1)] = B[Integer(3)] = Integer(1) B.nonlinearity() 2 B = BooleanFunction("0113077C165E76A8") B.nonlinearity() 28

nvariables()[source]

The number of variables of this function.

EXAMPLES:

Sage

sage: from sage.crypto.boolean_function import BooleanFunction sage: BooleanFunction(4).nvariables() 4

Python

from sage.all import * from sage.crypto.boolean_function import BooleanFunction BooleanFunction(Integer(4)).nvariables() 4

resiliency_order()[source]

Return the maximum value \(m\) such that the function is resilient of order \(m\).

A Boolean function is said to be resilient of order \(m\) if it is balanced and correlation immune of order \(m\).

If the function is not balanced, we return \(-1\).

EXAMPLES:

Sage

sage: from sage.crypto.boolean_function import BooleanFunction sage: B = BooleanFunction("077CE5A2F8831A5DF8831A5D077CE5A26996699669699696669999665AA5A55A") sage: B.resiliency_order() 3

Python

from sage.all import * from sage.crypto.boolean_function import BooleanFunction B = BooleanFunction("077CE5A2F8831A5DF8831A5D077CE5A26996699669699696669999665AA5A55A") B.resiliency_order() 3

sum_of_square_indicator()[source]

Return the sum of square indicator of the function.

EXAMPLES:

Sage

sage: from sage.crypto.boolean_function import BooleanFunction sage: B = BooleanFunction("7969817CC5893BA6AC326E47619F5AD0") sage: B.sum_of_square_indicator() 32768

Python

from sage.all import * from sage.crypto.boolean_function import BooleanFunction B = BooleanFunction("7969817CC5893BA6AC326E47619F5AD0") B.sum_of_square_indicator() 32768

truth_table(format='bin')[source]

The truth table of the Boolean function.

INPUT:

EXAMPLES:

Sage

sage: # needs sage.rings.polynomial.pbori sage: from sage.crypto.boolean_function import BooleanFunction sage: R.<x,y,z> = BooleanPolynomialRing(3) sage: B = BooleanFunction(xyz + z + y + 1) sage: B.truth_table() (True, True, False, False, False, False, True, False) sage: B.truth_table(format='int') (1, 1, 0, 0, 0, 0, 1, 0) sage: B.truth_table(format='hex') '43'

sage: BooleanFunction('00ab').truth_table(format='hex') # needs sage.rings.polynomial.pbori '00ab'

sage: # needs sage.rings.polynomial.pbori sage: H = '0abbacadabbacad0' sage: len(H) 16 sage: T = BooleanFunction(H).truth_table(format='hex') sage: T == H True sage: H = H * 4 sage: T = BooleanFunction(H).truth_table(format='hex') sage: T == H True sage: H = H * 4 sage: T = BooleanFunction(H).truth_table(format='hex') sage: T == H True sage: len(T) 256 sage: B.truth_table(format='oct') Traceback (most recent call last): ... ValueError: unknown output format

Python

from sage.all import *

needs sage.rings.polynomial.pbori

from sage.crypto.boolean_function import BooleanFunction R = BooleanPolynomialRing(Integer(3), names=('x', 'y', 'z',)); (x, y, z,) = R._first_ngens(3) B = BooleanFunction(xyz + z + y + Integer(1)) B.truth_table() (True, True, False, False, False, False, True, False) B.truth_table(format='int') (1, 1, 0, 0, 0, 0, 1, 0) B.truth_table(format='hex') '43'

BooleanFunction('00ab').truth_table(format='hex') # needs sage.rings.polynomial.pbori '00ab'

needs sage.rings.polynomial.pbori

H = '0abbacadabbacad0' len(H) 16 T = BooleanFunction(H).truth_table(format='hex') T == H True H = H * Integer(4) T = BooleanFunction(H).truth_table(format='hex') T == H True H = H * Integer(4) T = BooleanFunction(H).truth_table(format='hex') T == H True len(T) 256 B.truth_table(format='oct') Traceback (most recent call last): ... ValueError: unknown output format

walsh_hadamard_transform()[source]

Compute the Walsh Hadamard transform \(W\) of the function \(f\).

\[W(j) = \sum_{i\in\{0,1\}^n} (-1)^{f(i)\oplus i \cdot j}\]

EXAMPLES:

Sage

sage: from sage.crypto.boolean_function import BooleanFunction sage: R. = GF(2^3,'a')[] # needs sage.rings.finite_rings sage: B = BooleanFunction(x^3) # needs sage.rings.finite_rings sage: B.walsh_hadamard_transform() # needs sage.rings.finite_rings (0, -4, 0, 4, 0, 4, 0, 4)

Python

from sage.all import * from sage.crypto.boolean_function import BooleanFunction R = GF(Integer(2)Integer(3),'a')['x']; (x,) = R._first_ngens(1)# needs sage.rings.finite_rings B = BooleanFunction(xInteger(3)) # needs sage.rings.finite_rings B.walsh_hadamard_transform() # needs sage.rings.finite_rings (0, -4, 0, 4, 0, 4, 0, 4)

class sage.crypto.boolean_function.BooleanFunctionIterator[source]

Bases: object

Iterator through the values of a Boolean function.

EXAMPLES:

Sage

sage: from sage.crypto.boolean_function import BooleanFunction sage: B = BooleanFunction(3) sage: type(B.iter()) <class 'sage.crypto.boolean_function.BooleanFunctionIterator'>

Python

from sage.all import * from sage.crypto.boolean_function import BooleanFunction B = BooleanFunction(Integer(3)) type(B.iter()) <class 'sage.crypto.boolean_function.BooleanFunctionIterator'>

sage.crypto.boolean_function.random_boolean_function(n)[source]

Return a random Boolean function with \(n\) variables.

EXAMPLES:

Sage

sage: from sage.crypto.boolean_function import random_boolean_function sage: B = random_boolean_function(9) sage: B.nvariables() 9 sage: while not (210 < B.nonlinearity() < 220): ....: B = random_boolean_function(9)

Python

from sage.all import * from sage.crypto.boolean_function import random_boolean_function B = random_boolean_function(Integer(9)) B.nvariables() 9 while not (Integer(210) < B.nonlinearity() < Integer(220)): ... B = random_boolean_function(Integer(9))

sage.crypto.boolean_function.unpickle_BooleanFunction(bool_list)[source]

Specific function to unpickle Boolean functions.

EXAMPLES:

Sage

sage: from sage.crypto.boolean_function import BooleanFunction sage: B = BooleanFunction([0,1,1,0]) sage: loads(dumps(B)) == B # indirect doctest True

Python

from sage.all import * from sage.crypto.boolean_function import BooleanFunction B = BooleanFunction([Integer(0),Integer(1),Integer(1),Integer(0)]) loads(dumps(B)) == B # indirect doctest True