Source code for sboxUv2.core.building_blocks.butterflies

from sboxUv2.core.sbox import Sb
from sage.all import PolynomialRing,inverse_mod

[docs] def closed_butterfly(alpha,beta): if alpha.parent() != beta.parent() : raise Exception("alpha and beta must belong to the same field") else : R=PolynomialRing(alpha.parent(), names =('x','y')) (x,y,) = R._first_ngens(2) poly=(x+alpha*y)**3+beta*(y**3) return Sb([poly(x,y),poly(y,x)])
[docs] def open_butterfly(alpha,beta): if alpha.parent() != beta.parent() : raise Exception("alpha and beta must belong to the same field") else : R=PolynomialRing(alpha.parent(), names =('x','y')) n=R.base_ring().degree() (x,y,) = R._first_ngens(2) poly=(x+alpha*y)**3+beta*(y**3) poly_inv=(beta*y**3+x)**(inverse_mod(3,2**n-1))+alpha*y return Sb([poly(y,poly_inv(x,y)),poly_inv(x,y)])